1、jvm,jre,jdk的区别:
jvm是Java虚拟机,java跨平台的核心
jre是java运行环境,包括了jvm和一些基本类库
jdk是java核心,继承了jre和一些工具
jdk>jre>jvm
2、java数据类型
整数:byte、short、int、long
浮点数:float、double
字符:char
布尔:boolean
3、权限修饰符
public:任何包的任何类
protected:包内的任何类,以及包外继承了该类的子类
default:包内的任何类
private:该类
4、重写和重载的区别:
重写:发生在父子类中,方法名和参数列表相同,返回值类型一致,权限修饰符大于等于父类,如果父类被 private修饰则不能重写
重载:发生在一个类中,方法名相同,但是参数列表不同
5、string stringbuffer stringbuider区别:
string:string被finall修饰,对象不可变,每次都是new一个新的对象
stringbuffer:对象可变,加了同步锁,线程安全,速度比stringbuider慢
stringbuider:对象可变,线程不安全,但是速度比stringbuffer快
6、 == 和equals的区别:
==:如果比较的是常量,那么比较的就是值
如果比较的是引用数据类型,那么比较的就是地址值
equals:通过查看源码发现,object中的equals方法未重写时,调用的就是==方法
重写之后就是比较的值
7、集合
单列集合:
list:ArrayList:增删慢,查询快,底层是数组
LinkListL:增删快,查询慢,底层是链表
Set:hashSet:底层是哈希表,无序、唯一,通过hashcode和equals来保证唯一性
linkHashSet:底层是链表和哈希表,有序且唯一,通过哈希表保证唯一,通过链表保证有序
treeset:底层是红黑树,有序且唯一,通过自然排序和比较器排序保证有序
通过比较的值是否为0来保证唯一
双列集合:
Map:hashMap hashTable treeMap的区别
hashtable加了同步锁,线程安全
treemap是有序的
hashmap可以存null值,hashtable不行
hashmap:
扩容机制:默认长度16,当达到阈值0.75时进行扩容,扩容两倍
底层数据结构:jdk1.7之前是数组加链表,jdk1.8之后是数组加链表/红黑树,当数组长度超过64,链表长度超过8,则把链表转换成红黑树
如何添加数据,通过key用hashcode计算出hash值,在通过(数组长度-1)& hash计算出在数组上存放的位置,如果存放的位置上有元素,那就用equals比较,如果一样则覆盖,不一样则拉链法,jdk1.7之前采用的头插法,1.8采用的尾插法;
concurrentHashMap和hashtabe的区别:
为什么要讨论他们的区别,因为他们都是线程安全的,但是在实现线程安全的方式上不同
数据结构区别:concurrent在jdk1.7之前采用的是分段数组加链表,jdk1.8之后采用的是分段数组加链表/红黑树,hashtable则采用的是数组加链表
实现方式区别:concurrent采用的分段锁,把数据分段,每把锁,锁不同的数据,这样多线程场景下,就不会发生锁竞争,相当于线程安全且优化过后的hashmap;hashtable,虽然是线程安全的,但是他锁是锁整个hashtable,导致锁竞争激烈,效率低下。