JAVA 经典面试题

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 冲突过多, 导致 条目的单向链表过长, 随机访问时效率低. 因此降低条目单向链表的长度可以提高效率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值