- int[] 无法转型为 Object[], 因而被当作一个单纯的数组对象 ; Integer[] 可以转型为 Object[], 可以作为一个对象数组。
- 队列,栈的遍历有两种方式,一种是foreach,他不会对集合元素剔除。另一种是
while(X.isEmpty() != true)
这会对集合内元素进行清空。 @HotSpotIntrinsicCandidate
说明函数实现被JVM用手写汇编或者IR优化了。- LinkedHashSet和LinkedHashMap支持记录插入顺序和访问顺序两种模式。具体调用为
new LinkedHashMap(initialCapacity, loadFactor, accessOrder)
- 二叉树的遍历有三种,前序遍历意味着从上往下操作二叉树;中序遍历意味着从左往右;后序遍历意味着从下往上操作;
- 在Java中一个字节等于8个bit,int型有4个字节,所以是4*8=32bit;所以能表达的数为-2^31~2^31-1;
- 可持久化数据结构,如Java的String,用于并发时可以对解决共享数据结构的并发修改提供一些帮助。
if(A){if(B)}else{}
和if(A && B)else{}
是不一样的,前者A真B假时不会执行else{}
后者会;if(A && B)else{do C}
等价于if(A){if(B)else{do C}}else{do C}
wait(long outime)
和wait()
的区别在于,前者的不仅仅可以通过notify(),notifyAll()
方法唤醒(进入就绪状态),还可以在时间超时后进入就绪状态。后者只能通过notify(),notifyAll()
方法唤醒。- ArrayList的
add(int index, T element)``set(int index, T element)
方法都会调用list.size()
方法来查看当前数组包含的元素个数,并以此来判断是否能在指定位置插入。因此,ArrayList并不能在一个没有元素的位置进行插入元素。这点和数组不同。如果要想提前设置某个下标的值,就要先填充List,方法如下:List<Integer> list = new ArrayList<>(Collections.nCopies(i, 1));
- 字符串的比较要用
a.equals(b)
- java类是单继承的:
classB Extends classA
,但是java接口可以多继承:Interface3 Extends Interface0, Interface1, interface……
- -
int与Integer的比较
①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
③两个都是new出来的,都为false
④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
子类与父类调用方法
- 若变量是父类,则只能调用父类方法
- 若变量是父类,但存的是子类,并且子类覆盖了父类方法,则调用子类方法(多态)
- 若变量是子类,则可以调用子类没有但是父类的方法(继承)
finally块和return
finally块在栈帧弹出前最后一秒执行,即将finally语句插入return之前(但是对原始变量无影响)。
public class Main {
public static void main(String[] args){
System.out.print(fun1()); //ACBD
}
public static String fun1(){
try {
System.out.print("A");
return fun2();
} finally {
System.out.print("B");
}
}
private static String fun2(){
System.out.print("C");
return "D";
}
}
父类的静态变量
若对子类调用的是父类静态变量(子类没有该变量),则子类不加载(不运行静态块)。