Java面试 汇总-补充
Java基础以及多个比较
- Collections.sort排序内部原理
在Java 6中Array.sort()和Collections.sort()使用的是MergeSort(),而在Java 7中,内部实现变成了TimSort,其对对象间比较的实现要求更加严格。
MergerSort():归并排序
TimSort():起源于归并排序和插入排序的混合排序算法 - HashMap原理,Java 8 做的改变
一文读懂HashMap
从实现结构来讲,HashMap的实现是数据+链表+红黑树(JDK1.8增加了红黑树部分)。
HashMap最多只允许一条记录的键为null。HashMap为非线程安全。
ConcurrentHashMap为线程安全。解决碰撞,出现冲突是运用拉链法,将关键词为同义词的节点链接在一个单链表中,散列表长m,则定义一个由m个头指针组成的指针数组T,地址为i的节点插入以T(i)为头指针的单链表中。Java8中冲突的元素超过限制(8),用红黑树替换链表。
HashMap:数组的默认长度为16,HashTable数组的默认长度是11
新的Entity插入位置永远在链表的最前面
null key总是存在放Entity[]数组的第一个位置
线程安全:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
链表法: - String 和 StringBuilder的区别
1)可变与不可变:String不可变,每一次执行‘+’都会形成一个新的对象,所以频繁改变字符串的情况中不用String,以节省内存。
2)是否多线程安全:StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
StringBuffer和String均是线程安全的。 - Vector和ArrayLIst的区别
1)ArrayList在内存不够时默认是扩展50%+1个,Vector是默认扩展1倍。
2)Vector是属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。 - HashMap与HashTable的区别
1)历史原因:HashTable继承于Dictonary类,HashMap继承于abstractMap
2)HashMap允许空的键值对,但最多只有一个空对象,而HashTable不允许。
3)HashTable同步,而HashMap非同步,效率上比HashTable要高。 - ConcurrentHashMap和HashTable的比较(两个线程并发访问map中同一条链,一个线程在尾部