Skip to content

Java基础

抽象类和接口的区别是什么?

异同点接口抽象类
与类的关系(多)实现(单)继承
成员变量静态常量(类常量)[实例/静态][变量/常量]
抽象方法
构造方法
实例化不能直接实例化, 必须被实现接口或继承抽象类
继承多继承单继承
设计目的约束类的行为代码复用,强调所属关系

==equals的区别是什么?

对比项==equals
基本类型比较值不支持
引用类型比较内存地址未重写时采用==比较

重写后比较对象的内容

字符串常量方式创建和new方式创建有什么区别?

字符串常量方式创建:

查找常量池中是否存在该字符串对象

a. 如果存在直接复用常量池中的字符串对象

b. 如果不存在则在常量池中新建该字符串对象

字符串new方式创建:

查找常量池中是否存在该字符串对象

a. 如果存在则不会在常量池中创建该字符串对象

b. 如果不存在则在常量池中创建该字符串对象,并且在堆中创建该字符串对象,返回堆中字符串对象的引用。

简答: 如果字符串常量池中不存在该字符串对象,首先会在常量池中创建该字符串对象,然后会在堆中创建该字符串对象

异同点常量方式创建new方式创建
内存位置字符串常量池
行为有则复用,无则新建每次新建
常量池总是使用可能触发常量池创建
对象复用复用不复用,每次新建
内存占用节省内存内存开销大

StringStringBuilderStringBuffer有什么区别?

异同点StringStringBufferStringBuilder
线程安全安全,常量安全,synchronized非安全
性能较低中等高效
父类ObjectAbstractStringBuilder
可变性不可变可变
适用场景修改、拼接较少多线程修改、拼接单线程修改、拼接

为什么StringBuilder的拼接效率高?

  1. String没有拼接能力, String的+拼接底层采用SB.append方法完成拼接, 还需要toSTring转为SB字符串才行, 频繁地向堆中申请空间, 造成资源浪费, 耗时比较久
  2. StringBuilder自始至终 持有一个StringBuilder对象, 运行效率高, 运行速度快

为什么String类是不可变的?

  1. 保存字符串的数组被private final修饰, 并且未提供/暴露修改这个数组的方法
  2. String类被final修饰, 使其不能有子类, 避免子类修改String

注意: jdk9之前, 底层是char[], jdk9+, 底层是byte[]

String类的常用方法有哪些?

java
String() 构造方法
length() 获取长度
charAt() 获取指定位置的字符
indexOf() 获取字符(串)首次出现的位置
lastIndexOf() 获取字符(串)末次出现的位置
substring() 获取子串, 左闭右开区间
split() 拆分字符串
trim() 去除字符串两端的空白字符
contains() 判断是否包含指定字符序列
replace() 替换字符(串)
getBytes() 获取字节数组
equals() 判断字符串是否相等
equalsIgnoreCase() 判断字符串相等(忽略大小写)
startsWith() 判断字符串开头
endsWith() 判断字符串结尾
toLowerCase() 转成小写
toUpperCase() 转成大写
ValueOf() 数字转字符串
isBlank() 判空
isEmpty() 判空

重载(overload)和重写(override)有什么区别?

异同点重载重写
发生范围同一个类子类
方法名相同相同
参数列表不相同相同
访问权限无限制>=父类
返回值类型无限制基本类型=父类
引用类型<=父类
异常类型无限制<=父类
发生阶段编译期运行期
静态方法可以重载不能重写(可以被继承)
final方法可以重载不能重写(可以被继承)
构造方法可以重载不能重写(不能被继承)

泛型有什么优势?泛型有什么局限?

异常有哪些分类?

怎么处理异常?

final关键字的作用是什么?

[[jvm]]

基于 MIT 许可发布