1.
String 与 StringBuffer 的区别, 哪个效率高?
通常情况下, String 是不可变的, 而StringBuffer是可以动态增长的.但String拼接字符串时,编译器会做优化, 因此, 性能不会低.
String 与 StringBuffer 都是使用char[] value存储值, 但初始容量不同.因此在编译器不做优化的情况且 StringBuffer 显式指定一个合适的初始值, 避免动态增长, 效率肯定高于 String.
String 与 StringBuffer的动态增长时, 都是调用的System.arrayCopy(). 因此效率是一致的.
结论: StringBuffer 必须给定一个显式的足够大的容量值, 来避免动态增长, 从而提高效率.
2.
各种排序算法在JAVA中的实现:
快速与归并排序:
Arrays.sort(Object[] , Comparator)
冒泡排序: j=length-1, 交换j, j-1
选择排序: j=length-1, 交换i, j
3.
JAVA 集合类:
Collection
├List : 有序, 可以重复
│├LinkedList : 非同步, 允许null元素, 适合修改
│├ArrayList :非同步, 允许null元素, 适合查询
│├CopyOnWriteArrayList : 写锁
│└Vector : 同步, 不允许null元素
│ └Stack : 后进先出
├Queue : 先进先出(PriorityBlockingQueue 比较特殊)
└Set : 无序, 不重复
Map
├Hashtable 同步, 不允许null元素
├HashMap 非同步, 允许null元素
└WeakHashMap 非同步, 弱引用
Array
存储集合对象内部
结论:
单线程下优先使用更加高效的非同步集合类.
集合类设置初始容量与加载因子.
根据功能选择合适的集合类.
4
分页
在分页算法中,影响查询速度的关键因素在于返回数据集的大小.
5
为什么重写equals,必须重写hashcode?
JAVA语言中有一条原则:
同一对象的hashcode必须保持相同.
提高HashMap的性能, 如果 HashMap中 不同对象的 hashcode 相同, 会造成hashcode冲突, 降低效率.
Set 对象会根据 hashcode 来检测重复元素, 如果同一对象的hashcode不同,会造成元素重复.
6
为什么hashcode冲突, 会降低效率?
HashMap 通过 Entry[] table 数组保存条目, 默认为16, 相同hashcode 的条目会添加到条目链表, 这种链表是单向的.
Entry[] table
Entry<K, V> next; // 指向下一个相同 hashcode 的条目
key 的 hashcode 决定条目在table的索引.
条目的 hashcode 通过 key.hashcode ^ value.hashcode.
如果条目的hashcode 冲突过多, 导致 条目的单向链表过长, 随机访问时效率低. 因此降低条目单向链表的长度可以提高效率.
String 与 StringBuffer 的区别, 哪个效率高?
通常情况下, String 是不可变的, 而StringBuffer是可以动态增长的.但String拼接字符串时,编译器会做优化, 因此, 性能不会低.
String 与 StringBuffer 都是使用char[] value存储值, 但初始容量不同.因此在编译器不做优化的情况且 StringBuffer 显式指定一个合适的初始值, 避免动态增长, 效率肯定高于 String.
String 与 StringBuffer的动态增长时, 都是调用的System.arrayCopy(). 因此效率是一致的.
结论: StringBuffer 必须给定一个显式的足够大的容量值, 来避免动态增长, 从而提高效率.
2.
各种排序算法在JAVA中的实现:
快速与归并排序:
Arrays.sort(Object[] , Comparator)
冒泡排序: j=length-1, 交换j, j-1
选择排序: j=length-1, 交换i, j
3.
JAVA 集合类:
Collection
├List : 有序, 可以重复
│├LinkedList : 非同步, 允许null元素, 适合修改
│├ArrayList :非同步, 允许null元素, 适合查询
│├CopyOnWriteArrayList : 写锁
│└Vector : 同步, 不允许null元素
│ └Stack : 后进先出
├Queue : 先进先出(PriorityBlockingQueue 比较特殊)
└Set : 无序, 不重复
Map
├Hashtable 同步, 不允许null元素
├HashMap 非同步, 允许null元素
└WeakHashMap 非同步, 弱引用
Array
存储集合对象内部
结论:
单线程下优先使用更加高效的非同步集合类.
集合类设置初始容量与加载因子.
根据功能选择合适的集合类.
4
分页
在分页算法中,影响查询速度的关键因素在于返回数据集的大小.
5
为什么重写equals,必须重写hashcode?
JAVA语言中有一条原则:
同一对象的hashcode必须保持相同.
提高HashMap的性能, 如果 HashMap中 不同对象的 hashcode 相同, 会造成hashcode冲突, 降低效率.
Set 对象会根据 hashcode 来检测重复元素, 如果同一对象的hashcode不同,会造成元素重复.
6
为什么hashcode冲突, 会降低效率?
HashMap 通过 Entry[] table 数组保存条目, 默认为16, 相同hashcode 的条目会添加到条目链表, 这种链表是单向的.
Entry[] table
Entry<K, V> next; // 指向下一个相同 hashcode 的条目
key 的 hashcode 决定条目在table的索引.
条目的 hashcode 通过 key.hashcode ^ value.hashcode.
如果条目的hashcode 冲突过多, 导致 条目的单向链表过长, 随机访问时效率低. 因此降低条目单向链表的长度可以提高效率.