Java面试-基础问题整理

1. String类为什么是final的。

答:申明为final的类是不能被继承的,这防止了String类被子类修改。由于String类是被设计为Immutable的,也就是不可变的,用final修饰,能防止String类被子类修改成可变的。

题外话:

关于String不可变的原因,收集了以下几个点:

1.由于String常量池的设计,当需要创建String时,会先从常量池中找是否已经存在该值,如果有则返回其引用,而不是创建一个相同值的String对象。如果String可变,那改变一个值会将所有引用这个值的变量都改了。

2.String大量作为参数传递,如果String值可变,那在方法内部就可以改变String的值,这会非常麻烦,以及可能造成安全上的问题。

3.Because immutable objects can not be changed, they can be shared among multiple threads freely. This eliminates the requirements of doing synchronization.

关于如何创建不可变的类的规则:

1.immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。

2.Immutable类的所有的属性都应该是final的。

3.对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。

4.类应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。

5.如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)

(final关键字可以参考Java编程思想140,java核心技术卷一160)

2. Java集合类:list、set、queue、map实现类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4tKP8Fd4-1649848305760)(//upload-images.jianshu.io/upload_images/13866634-1fc2b5cca0bf318b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

HashSet, linkedHashSet,HashMap,linkedHashMap:都是基于散列表实现的,即链表数组。

LinkedHashMap继承了HashMap,并在node上多加了两个指针,来维护每个node之间的顺序,原有的hashmap的结构是没变的。

HashSet只是封装下HashMap,实际就是一个hashMap,只是这个map只能对键进行操作,set里的元素被当做是Map的key来存的,map的value存的是一个static final new object(),循环这个set其实就是取得HashMap的keySet来循环。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫(同音):cgmx9880(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能获取到学习资源,目前受益良多

LinkedHashSet继承了HashSet,调用的是HashSet里构造linkedHashMap的构造方法,实际就是个linkedHashMap,然后只能对map的key进行操作。

TreeSet,TreeMap: 都是基于红黑树实现的,特点是所得到的结果是经过排序的,次序由元素实现的Comparable或者Comparator决定。将元素加到TreeSet比HashSet慢,不过TreeSet是排序的。

PriorityQueue:是接口Queue的实现。 使用堆数据结构,堆是一个可以自我调整的二叉树,对树执行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。优先级队列可以按任意的顺序插入元素,却总是按照排序的顺序进行检索,也就是无论何时调用remove方法,总会获得当前优先级队列中最小的元素(即优先级最高的元素,习惯上将1设为最高优先级)。默认是按元素的自然顺序排序,如存储Integer,char,String类型的元素,也可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值