Java基础

57 阅读5分钟

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类的一个方法,用于在对象被垃圾回收前执行清理操作

为什么不建议使用异常控制业务流程

  • 首先是性能问题,异常的生成和处理对性能消耗是很大的,因为涉及到填充栈跟踪信息,频繁地抛出和捕获异常会导致性能下降
  • 二是回滚,如果捕获异常代码没处理好,可能会导致事务无法回滚
  • 三是过度依赖异常了,万一哪一天这个异常发生了改变比如版本升级不再抛出这个异常了,而抛出其他异常,或者直接不抛出异常,那整个代码逻辑都需要更改