String为什么设计不可变
主要有两个原因第一是缓存,第二是线程安全
- 缓存:在系统中字符串类型用的是非常广泛的,jvm对应字符串有特殊处理,有专门给它提供了一个字符串常量池,比如我定义十个相同的变量叫JAVA,实际上jvm字符串池中只会创建一个字符串。
- 线程安全:像string没有区分什么线程安全和线程不安全,它就是线程安全的,支持在多线程下进行操作
String的长度有限制吗
有的,它的长度限制分了编译期和运行期,像编译型具体多少忘记了应该是6w左右,运行期就是int的最大值。
泛型有什么优势?
泛型最大的优势是在定义的时候可以不确定类型,而是在使用的时候在确定类型,比如我使用List和List,不需要在额外定义其他list。
泛型其实也是一个语法糖,在编译的时候会进行类型擦除,类型会改成使用Object类型
什么是反射机制
反射可以在运行期间获取类的方法和属性,并且能动态地创建和操作对象
优点:
1、在运行判断任意一个对象所属类
2、在运行的时候调用一个对象方法
3、在运行的时候任意创建一个类的对象
缺点:
1、代码可读性变低
2、反射会影响代码性能
3、反射破坏了封装性
在我们开发中一般情况用不上反射,但是要掌握反射,因为很多框架底层代码都使用了反射
serialVersionUID 有何用途?
serialVersionUID(死瑞奥窝肾UID)
在java当中对象是保存在jvm中的堆内存中,如果jvm关闭了堆内存也会释放,对象也就消失了
java有个序列化的机制,java可以将对象序列化成二进制流,在使用的时候在进行反序列化
如果在代码中有定义serialVersionUID(死瑞奥窝肾UID)常量,在反序列化的时候进行比较,必须一致才会序列化成功,否则会抛出异常
枚举有什么特别和好处
枚举的valueOf可以自动对入参进行非法参数的校验
相当于普通常量,枚举中的方法更强
枚举可以自带属性,扩展性更强
!什么是AIO、BIO和NIO
- BIO:传统IO模型。 线程发起IO请求后,一直阻塞,直到缓冲区数据就绪后,再进入下一步操作,适合一些连接数比较小架构
- NIO:线程发起IO不堵塞,立刻返回结果,用户线程不原地等待IO缓冲区,可以先做一些其他操作,只需要定时轮询检查IO缓冲区数据是否就绪即可,适合轻操作操作的架构
- AIO:线程发起IO请求,立即返回,不需要定时轮询检查结果,异步IO操作之后会回调通知调用方,适合重操作架构
Java是值传递还是引用传递
值传递和引用传递最大的区别就是,在传递过程中有没有复制一个副本出来,如果是传递副本就是值传递,否则就是引用传递
Java对象传递是有复制的过程,所有java是引用传递
什么是深拷贝和浅拷贝
浅拷贝就是拷贝的对象的地址,而不是对象的本身,也就是说只要一方发生改变,其他浅拷贝也会发生改变
深拷贝就是拷贝对象的完整信息,它会创建一个新的对象并指向新的对象地址,也就是它们之间是互相不关联,修改也只会修改当前拷贝的对象。
什么是UUID
-
UUID是使用硬件+时间搓的方式随机全局唯一标识,在机器上生成唯一标识,它的目标是保证在对同一个时空所有机器都是唯一的
-
优点:不需要网络,本地可以生成
-
缺点:长度太长,并且因为是随机没有任何含义
Arrays.sort是使用什么排序算法实现的
Arrays.sort(骚特)对基本类型,int、double、char这些用的就是双轴快速排序
String是如何实现不可变的
在String类中,String类本身与保存字符串定义的char[]类型,都是使用的final([佛挨]了)修饰的
如果使用final自然是不可修改的,在String类型中没有提供追加、删除或修改
像string提供的对一些string操作的方法,都是new了一个新的string对象。
字符串常量是什么时候进入到字符串常量池的?
字符串常量池的数据有两种来源
1、编译期先进入到Class常量池,然后运行期进去到字符串常量池
2、运行期通过intern(音特)方法将字符串对象手动添加到字符串常量池中
String中intern的原理是什么
intern()(音特)的作用是,如果字符串在这字符串常量池里面存在会返回之前的引用对象,如果不存在会加入到字符串常量池里面,并且返回引用对象
final、finally、finalize有什么区别
- final(fai了):用于声明变量、方法或类,表示不可修改
- finally(fai了英):是异常语法的一部分,确保代码一定被执行
- finalize(fai了赖斯):是Object类的一个方法,用于在对象被垃圾回收前执行清理操作
为什么不建议使用异常控制业务流程
- 首先是性能问题,异常的生成和处理对性能消耗是很大的,因为涉及到填充栈跟踪信息,频繁地抛出和捕获异常会导致性能下降
- 二是回滚,如果捕获异常代码没处理好,可能会导致事务无法回滚
- 三是过度依赖异常了,万一哪一天这个异常发生了改变比如版本升级不再抛出这个异常了,而抛出其他异常,或者直接不抛出异常,那整个代码逻辑都需要更改