大家好,我是二哥呀。
最近,互联网的早期网红周鸿祎又重新回到了大众的视野中心,600 元起拍的迈巴赫最终卖到了 990 万,这 10000 倍的溢价背后,是附送周老板的一次饭局,嘿嘿,有点当年巴菲特老爷子的味道(嗯,这饭这车都挺贵)。
并且周老板在各大短视频平台频繁出现,热度贼高,于是我去百度百科上看了一眼周老板的履历,竟然还是我们河南老乡,出生在驻马店市(他自己说籍贯是湖北省),后随父母在郑州上学读书,就读于第九中学,本科毕业于西安交通大学,因成绩优异,又保研成功。
整理不易,简历请表明出处:百度百科周老板在网上的风评也是褒贬不一,争议性很大,比如说鲁大师,比如说 3q 大战,比如说无法卸载的安全全家桶。。。
但不管怎么说,周老板是懂流量的,是懂网红的,这波既节省了巨额的广告费,又顺势拉一波公司股价,到时候随随便便就是几个小目标(厉害)。
- 1、二哥的 Linux 速查备忘手册.pdf 下载
- 2、三分恶面渣逆袭在线版:https://javabetter.cn/sidebar/sanfene/nixi.html
360面经(八股吟唱开始)
言归正传。。
继续来看《Java 面试指南》中收录的 360 面经(大厂几乎都会有 Java 岗,别意外),以同学 3 为例,来看看 360 的 Web 服务器端面试官都喜欢问哪些问题。
二哥的Java 面试指南专栏可以看得出,竟然还是二哥一直强调的 Java 后端四大件,还在冲刺春招和暑期实习的同学可以收藏起来,好做到知彼知己百战不殆。
说一下阻塞非阻塞IO -说了下BIO和NIO
BIO(Blocking I/O):采用阻塞式 I/O 模型,线程在执行 I/O 操作时被阻塞,无法处理其他任务,适用于连接数较少的场景。
三分恶面渣逆袭:BIONIO(New I/O 或 Non-blocking I/O):采用非阻塞 I/O 模型,线程在等待 I/O 时可执行其他任务,通过 Selector 监控多个 Channel 上的事件,适用于连接数多但连接时间短的场景。
三分恶面渣逆袭:NIO完整示意图线程安全,说一个使用场景 -讲了下单例模式的双重检查锁定,懒汉式和饿汉式
线程安全是 Java 并发编程中一个非常重要的概念,它指的是多线程环境下,多个线程对共享资源的访问不会导致数据的不一致性。
一个常见的使用场景是在实现单例模式时确保线程安全。
单例模式确保一个类只有一个实例,并提供一个全局访问点。在多线程环境下,如果多个线程同时尝试创建实例,单例类必须确保只创建一个实例。
饿汉式是一种比较直接的实现方式,它通过在类加载时就立即初始化单例对象来保证线程安全。
class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
懒汉式单例则在第一次使用时初始化,这种方式需要使用双重检查锁定来确保线程安全,volatile 用来保证可见性,syncronized 用来保证同步。
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (LazySingleton.class) {
if (instance == null) { // 第二次检查
instance = new LazySingleton();
}
}
}
return instance;
}
}
volatile关键字,说说别的你知道的关键字
当一个变量被声明为 volatile 时,Java 内存模型会确保所有线程看到该变量时的值是一致的。
深入浅出 Java 多线程:Java内存模型也就是说,当线程对 volatile 变量进行写操作时,JMM 会在写入这个变量之后插入一个 Store-Barrier(写屏障)指令,这个指令会强制将本地内存中的变量值刷新到主内存中。
三分恶面渣逆袭:volatile写插入内存屏障后生成的指令序列示意图当线程对 volatile 变量进行读操作时,JMM 会插入一个 Load-Barrier(读屏障)指令,这个指令会强制让本地内存中的变量值失效,从而重新从主内存中读取最新的值。
三分恶面渣逆袭:volatile写插入内存屏障后生成的指令序列示意图synchronized 用过吗?怎么使用?
在 Java 中,synchronized 是最常用的锁,它使用简单,并且可以保证线程安全,避免多线程并发访问时出现数据不一致的情况。
随着 JDK 版本的进化,synchronized 的性能也得到了进一步的提升,不再像以前样重量级了。
synchronized 可以用在方法和代码块中。
①、修饰方法
public synchronized void increment() {
this.count++;
}
当在方法声明中使用了 synchronized 关键字,就表示该方法是同步的,也就是说,线程在执行这个方法的时候,其他线程不能同时执行,需要等待锁释放。
如果是静态方法的话,锁的是这个类的 Class 对象,因为静态方法是属于类级别的。
public static synchronized void increment() {
count++;
}
②、修饰代码块
public void increment() {
synchronized (this) {
this.count++;
}
}
同步代码块可以减少需要同步的代码量,颗粒度更低,更灵活。synchronized 后面的括号中指定了要锁定的对象,可以是 this,也可以是其他对象。
final的用处
①、当 final 修饰一个类时,表明这个类不能被继承。比如,String 类、Integer 类和其他包装类都是用 final 修饰的。
二哥的 Java 进阶之路②、当 final 修饰一个方法时,表明这个方法不能被重写(Override)。也就是说,如果一个类继承了某个类,并且想要改变父类中被 final 修饰的方法的行为,是不被允许的。
③、当 final 修饰一个变量时,表明这个变量的值一旦被初始化就不能被修改。
如果是基本数据类型的变量,其数值一旦在初始化之后就不能更改;如果是引用类型的变量,在对其初始化之后就不能再让其指向另一个对象。
二哥的 Java 进阶之路但是引用指向的对象内容可以改变。
三分恶面渣逆袭:final修饰变量java的基本类型
Java 的数据类型分两种:基本数据类型和引用数据类型。
二哥的 Java 进阶之路:Java数据类型基本数据类型有哪些?
-
数值型
- 整数类型(byte、short、int、long)
- 浮点类型(float、double)
- 字符型(char)
- 布尔型(boolean)
Java 基本数据类型范围和默认值:
数据类型 | 默认值 | 大小 |
---|---|---|
boolean | false | 1 比特 |
char | '\u0000' | 2 字节 |
byte | 0 | 1 字节 |
short | 0 | 2 字节 |
int | 0 | 4 字节 |
long | 0L | 8 字节 |
float | 0.0f | 4 字节 |
double | 0.0 | 8 字节 |
java有哪些集合
Java 集合框架可以分为两条大的支线:
①、Collection,主要由 List、Set、Queue 组成:
- List 代表有序、可重复的集合,典型代表就是封装了动态数组的 ArrayList 和封装了链表的 LinkedList;
- Set 代表无序、不可重复的集合,典型代表就是 HashSet 和 TreeSet;
- Queue 代表队列,典型代表就是双端队列 ArrayDeque,以及优先级队列 PriorityQueue。
②、Map,代表键值对的集合,典型代表就是 HashMap。
二哥的 Java 进阶之路:Java集合主要关系用过哪些数据库
我经常使用的数据库是 MySQL,它是一个开源的关系型数据库管理系统,现在隶属于 Oracle 旗下。
也是我们国内使用频率最高的一种数据库,我在本地安装的 MySQL 的社区版,最新的 8.0 版本。
MySQL 官网mysql的索引用过哪些
①、主键索引: 表中每行数据唯一标识的索引,强调列值的唯一性和非空性。
当创建表的时候,可以直接指定主键索引:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255)
);
id 列被指定为主键索引,同时,MySQL 会自动为这个列创建一个聚簇索引(主键索引一定是聚簇索引)。
可以通过 show index from table_name
查看索引信息,比如前面创建的 users 表:
-
Non_unique
如果索引不能包含重复词,则为 0;如果可以,则为 1。这可以帮助我们区分是唯一索引还是普通索引。 -
Key_name
索引的名称。如果索引是主键,那么这个值是 PRIMARY。 -
Column_name
索引所包含的字段名。 -
Index_type
索引的类型,比如 BTREE、HASH 等。
②、唯一索引: 保证数据列中每行数据的唯一性,但允许有空值。
可以通过下面的语句创建唯一索引:
CREATE UNIQUE INDEX idx_username ON users(username);
同样可以通过 show index from table_name
确认索引信息:
Non_unique
为 0,表示这是一个唯一索引。
③、普通索引: 基本的索引类型,用于加速查询。
可以通过下面的语句创建普通索引:
CREATE INDEX idx_email ON users(email);
这次我们通过下面的语句一起把三个索引的关键信息查出来:
SELECT `TABLE_NAME` AS `Table`, `NON_UNIQUE`, `INDEX_NAME` AS `Key_name`, `COLUMN_NAME` AS `Column_name`, `INDEX_TYPE` AS `Index_type`
FROM information_schema.statistics
WHERE `TABLE_NAME` = 'users' AND `TABLE_SCHEMA` = DATABASE();
二哥的 Java 进阶之路:普通索引可以确定 idx_email 是一个普通索引,因为 Non_unique
为 1。
④、全文索引:特定于文本数据的索引,用于提高文本搜索的效率。
假设有一个名为 articles 的表,下面这条语句在 content 列上创建了一个全文索引。
CREATE FULLTEXT INDEX idx_article_content ON articles(content);
数据库隔离级别有哪些
事务的隔离级别定了一个事务可能受其他事务影响的程度,MySQL 支持的四种隔离级别分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
三分恶面渣逆袭:事务的四个隔离级别mysql是属于哪个隔离级别
可重复读是 MySQL 默认的隔离级别,避免了“脏读”和“不可重复读”,也在很大程度上减少了“幻读”问题。
用过redis吗 用来干什么
Redis 是 Remote Dictionary Service 三个单词中加粗字母的组合,是一种基于键值对(key-value)的 NoSQL 数据库。
三分恶面渣逆袭:Redis图标在技术派实战项目中,很多地方都用到了 Redis,比如说用户活跃排行榜、作者白名单、常用热点数据(文章标签、文章分类)、计数统计(文章点赞收藏评论数粉丝数)等等。
技术派专栏像用户活跃榜,主要是基于 Redis 的 Zset 实现的,可以根据 score(分值)进行排序,实时展示用户的活跃度。
技术派阅读活跃榜当然了,这块也可以使用 Redis 的 zrevrange,直接倒序展示前 8 名用户。
参考链接
- 三分恶的面渣逆袭:https://javabetter.cn/sidebar/sanfene/nixi.html
- 二哥的 Java 进阶之路:https://javabetter.cn
ending
一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 5100 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个编程学习指南 + Java 项目实战 + LeetCode 刷题的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。
两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远。
欢迎点击左下角阅读原文了解二哥的编程星球,这可能是你学习求职路上最有含金量的一次点击。
最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。