1. 对长度为n的线性表,在最坏情况下,比较次数:
快速排序、冒泡排序和直接插入排序:n(n-1)/2,
堆排序在最坏情况下的比较次数最少,是O(log2n)。
p.s. 快速排序最坏的情况是对有序数列排序,那么第一个元素需要比较n-1次,第2个元素需要比较n-2次,以此来推需要比较1,,,,n-1次等差数列求和得到(n)*(n-1)/2;
2. 数组初始化默认值
boolean数组初始化默认值为:[false, false]
byte数组初始化默认值为:[0, 0]
short数组初始化默认值为:[0, 0]
int数组初始化默认值为:[0, 0]
long数组初始化默认值为:[0, 0]
float数组初始化默认值为:[0.0, 0.0]
double数组初始化默认值为:[0.0, 0.0]
char数组初始化默认值为:[, ]
String数组初始化默认值为:[null, null]
3. 代码中注释太多,不会使编译后的程序尺寸变大
编写Java中的注释不会出现在可执行程序中。因此,可以在源程序中根据需要添加任意多的注释,而不必担心可执行代码会膨胀。
4. Object类包含的方法
1 | getClass | 获取运行时类型,返回值为Class对象 |
---|---|---|
2 | hashCode | 返回该对象的哈希码值,是为了提高哈希表的性能(HashTable) |
3 | equals | 判断两个对象是否相等,在Object源码中equals就是使用==去判断,所以在Object中equals是等价于==的,但是在String及某些类对equals进行了重写,实现不同的比较。 |
4 | clone | 此方法只实现了一个浅层拷贝,对于基本类型字段成功拷贝,但是如果是嵌套对象,只做了赋值,也就是只把地址拷贝了,所以没有成功拷贝,需要自己重写clone方法进行深度拷贝。 |
5 | toString | 返回一个String字符串,用于描述当前对象的信息,可以重写返回对自己有用的信息,默认返回的是当前对象的类名+hashCode的16进制数字。 |
6 | wait | 多线程时用到的方法,作用是让当前线程进入等待状态,同时也会让当前线程释放它所持有的锁。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,当前线程被唤醒 |
7 | notify | 多线程时用到的方法,唤醒该对象等待的某个线程 |
8 | notifyAll | 多线程时用到的方法,唤醒该对象等待的所有线程 |
9 | finalize | 对象在被GC释放之前一定会调用finalize方法,对象被释放前最后的挣扎,因为无法确定该方法什么时候被调用,很少使用。 |
5. java 形参和实参传递
1.java的基本数据类型是传值调用,对象引用类型是传引用。
2.当传值调用时,改变的是形参的值,并没有改变实参的值,实参的值可以传递给形参,但是,这个传递是单向的,形参不能传递回实参。
3.当引用调用时,如果参数是对象,无论对对象做了何种操作,都不会改变实参对象的引用,但是如果改变了对象的内容,就会改变实参对象的内容。
public static void main(String[] args) {
// write your code here
StringBuffer a = new StringBuffer("bi");
StringBuffer b = new StringBuffer("li");
operator(a, b);
System.out.println(a+","+b); // bli,li
}
public static void operator(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
}
6. Thread类的实例方法
(1) Thread类的实例方法.
(2) start 和run
用start方法才能真正启动线程,此时线程会处于就绪状态,一旦得到时间片,则会调用线程的run方法进入运行状态。
而run方法只是普通方法,如果直接调用run方法,程序只会按照顺序执行主线程这一个线程。
7. ArrayList扩容
(1)无参构造:public ArrayList();
这种是默认创建大小为10的数组,每次扩容大小为1.5倍
(2)指定大小:public ArrayList(20);
这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。
8. == 和equals
数值比较时:两者等价,比较的数值
对象比较时:如果equals不重写,两者等价,比较对象地址,即是不是一个对象
9. new String(“abc” + “ef”)+"gh"创建了几个对象
String str1 = "abc";
// 创建0或1个对象,在常量池中
String str2 = new String("abc");
// 创建1或2个对象,若常量池无abc, 先在常量池中创建abc,再在堆中创建对象str2,将abc的引用赋值给str2
String str = "abc" + "def";
// 创建了1个对象(因为编译时,编译器优化为abcdef)
String str = "abc" + new String("def");
// 创建了5个对象:
// 常量池中分别有“abc”和“def”
// 堆中对象new String("def")和“abcdef”
// 还有一个StringBuilder
// ⚠️注意:“abcdef”不在常量池中存
上述Java虚拟机在编译的时候会优化,会创建一个StringBuilder 的append()方法来进行字符串的拼接,实际效果类似:
String s = new String("def");
new StringBuilder().append("abc").append(s).toString();