重载、重写
- 重载: 在同一个类中,同一个方法名可以有多个方法实现,根据参数类型不同、个数不同、顺序不同就可以表示不同的方法,在调用时根据参数匹配调用相应的方法,并且重载的方法返回值和访问修饰符也可以不同。
- 重写: 重写是指在子类继承父类后要对父类一些方法逻辑进行修改,修改父类的方法即为重写,这样在调用子类的方法时会执行子类重写后的逻辑。重写方法规则要求子类重写后的方法返回值类型范围和抛出异常范围不能大于父类,并且private 修饰的方法不能够被重写。
Final、Finally、Finalize
- final: 修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰方法时,也同样只能使用,不能在子类中被重写。
- finally: 通常放在try…catch的后面构造最终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
- finalize: Object类中定义的方法,Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作。
synchronized
- synchronized 是一种锁机制,synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
- synchronized 关键字修饰代码块时需要指定锁对象,同一个锁对象修饰的所有代码块同时只能有一个线程在执行。
- synchronized 关键字修饰方法时,默认锁对象是当前对象,所以该对象使用synchronized 修饰的所有方法同时只能有一个线程在执行,也即是只有一个方法在执行。
== 和 Equals 区别
- == : 如果比较的是基本数据类型,那么比较的是变量的值;如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)。
- equals: 如果没重写equals方法比较的是两个对象的地址值; 如果重写了equals方法后我们往往比较的是对象中的属性的内容。
public boolean equals(Object obj) {
return (this == obj);
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
java支持的集合
- List: List里存放的对象是有序的,同时也是可以重复的,List支持索引,拥有一系列和索引相关的方法,查询速度快。
- Set: Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
- Map: Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
ArrayList、LinkedList
- ArrayList 和 LinkedList 都是List的重要实现,ArrayList的实现是基于数组的数据结构,LinkedList是基于链表结构。
- 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要对列表进行遍历和移动指针。
- 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
- ArrayList 初始化大小为10,扩容时容量会变成原来的两倍,LinkedList 添加元素时添加新的节点,无序初始大小和扩容。
HashMap
- HashMap是Map集合的重要实现,在jdk1.8中,底层是基于数组+链表+红黑树实现,红黑树是链表长度达到8时的结构变换,提升查询和插入的效率。在红黑树长度减少到6时会再次转换为链表。
- HashMap的初始容量大小为16,扩容时数组长度会变为原来的两倍。