Java
线程安全:
Vector、HashTable、Stack、Enumeration、StringBuffer、Properties
JUC中的集合类:LinkedBlockingQueue、Concurrent-等
Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合,比如:
List list = Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(new HashSet());
ThreadLocal把每个线程的私有数据存放在ThreadLocalMap中。
子类能继承父类的所有成员(private方法和属性是可以继承的,只是不能调用。构造函数不是成员,所以它们不被子类继承,但是可以从子类调用超类的构造函数。)
抽象类和接口
jdk1.8 接口可以有default、static方法
在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。Hashtable不允许存入null。
switch支持 int及以下(int,char, short, byte),String(java7), Enum,不能是long,float,double和boolean类型。
volatile和synchronized的区别
-
volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、代码块和类级别的。
-
volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
-
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
final作为对象成员存在时,必须定义时初始化(不会取默认值)或在构造函数中初始。
类初始化顺序:父类静态域(静态变量和静态代码块按位置顺序)-》子类静态域 -》父类代码块 -》父类构造函数 -》子类代码块 -》子类构造函数
抛InterruptedException的代表方法有:
1.Java.lang.Object类的wait方法
2.Java.lang.Thread类的sleep方法。
3.Java.lang.Thread类的join方法
Throwable异常
try catch中多个catch只会进入最先满足的那个,所以要子异常在前父异常在后。
采用 + 运算符拼接字符串/基本类型时:
-
如果拼接的都是常量(字面量或final),则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的,所以效率非常的高。
-
如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起,效率也很高。但如果这个拼接操作是在循环中进行的,那么每次循环编译器都会创建一个StringBuilder实例,再去拼接字符串,相当于执行了 new StringBuilder().append(str),所以此时效率很低
Java集合类
参考Java集合容器面试题(2020最新版)_ThinkWon的博客-优快云博客_java集合
重点:HashMap
Iterator 接口提供遍历任何 Collection 的接口。 只能单向遍历,但更加安全,因为它可以确保在当前遍历的集合元素被更改时,抛出 ConcurrentModificationException 异常。(边遍历边修改 Collection 的唯一正确方式是使用 Iterator.remove() 方法)
foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。
为什么HashMap比HashSet快?
HashSet底层由HashMap实现,只用Key存数据,Value默认存PRESENT空对象;而HashMap的Key一般为String或Integer类型,Value存数据,因此计算hashcode时一般String或Integer类型快,而存的数据(对象)慢。
参考“为什么HashMap比Hashset快” 凭什么这么说?_2003Crimson的博客-优快云博客_hashset和hashmap效率
常用方法:
ArrayList: get add remove size set contains toArray(Arrays.asList())
Stack: push pop peek(不删)
LinkedList: offer poll
HashSet: add contains remove
HashMap: put get remove replace containsKey containsValue keySet values
~n=-n-1
int a=0xFFFFFFF1;//补码表示 最高位符号位 负数原码等于补码取反(除符号位)加1 a=-15
int b=~a;//b=-a-1=15-1=14