面试手册总结——java基础

本文围绕Java语言展开,介绍了其三大特性,即封装、继承和多态。还阐述了JDK与JRE的区别、包装类的作用等。同时对比了基本数据类型与封装类、==与equals等。此外,对循环、关键字、引用类型、序列化、泛型等Java基础内容进行了详细讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.java语言的三大特性

  • 封装
    属性可以描述事物特征,方法可以描述事物可做的操作。封装就是将同一事物的属性和方法归到一个类中,使其形成一个不可分割的独立实体。用户无需知道内部方法的实现细节,可以根据对象提供的外部接口访问。
  • 继承
    子类是父类的特殊化实现,父类私有的属性和构造方法不能被继承,静态方法,静态/非静态的属性不能被重写。
  • 多态
    子类以父类的身份出现(向上转型),调用子类的方法

2. JDK和JRE的区别

jdk为开发工具包,jre为运行环境。jdk包括jre

3. 为什么需要包装类

泛型使用的参数都是对象类型,无法直接使用基本数据类型

4. 基本数据类型与封装类的区别

  • 基本数据类型按值传递,封装类按引用传递
  • 基本数据类型在栈中创建,封装类对象在堆中创建,对象的引用在栈中创建

5. == 与equals的区别

== 比较的是内存地址和值,equals比较值
用法:

"".equals(a) 
 a==null

6. while和do/while循环区别

while在循环开始前会判断循环是否继续;do/while在结尾判断,会先执行一次循环体

7. float f = 3.4 是否正确?

不正确,3.4是double类型,这样复制属于向下转型,应使用float f = (float) 3.4 或者 float = 3.4F

8. IntegerCache

public class IntegerTest {
	public static void main(String[] args) {
		Integer a = 100, b = 100 ,c = 129,d = 129;
		System.out.println(a==b); // true
		System.out.println(c==d); // false
}
}

原因:integer在-128~127之间做了缓存,超过这个范围才会生成新的对象

9. Locale类

用来根据语言环境来动态调整程序的输出

10. final,finally,finalize区别及用法

  1. final
    是修饰符也时关键字
  • 被final修饰的类无法被继承
  • 定义常量
  • 被final修饰的方法无法被重写,但允许重载
  1. finally
    是关键字
  • 在异常处理时不管有没有异常被抛出或者捕获,都会执行,通常用于释放资源
  • 在正常情况下一定会被执行,除了至少两个极端条件
    • 对应的try块没有执行
    • try中jvm关机
  • finally块中如果有return语句,则会覆盖try/catch语句中的return语句,所以不要再finally块中存放return语句
  1. finalize
    GC在回收对象之前会调用该方法

11. hashCode()和equals

hashCode:可靠性低,效率高
equals:可靠性高,效率低
equals()相等的两个对象的hashCode()一定相等
hashCode()相等的两个对象的equals()不一定相等

  1. 只要重写equals,就必须重写hashCode。
    因为只重写equals,可能造成两个对象的hashCode却不一样,而将对象存储进HashMap等集合中时,就会造成数据的不唯一性()
  2. 什么时候需要重写hashCode?
    涉及到对象之间的比较大小就需要重写equals方法,而涉及到将对象存储进Hash存储结构中的就必须重写hashCode,虽然如此但建议同时重写这两个方法,因为也不知道后期会不会用到。
  3. 放入Hash结构的步骤
    在HashSet中插入同一个元素(hashCode和equals均相等)时,会被舍弃,而在HashMap中插入同一个Key(Value 不同)时,原来的元素会被覆盖。在这里插入图片描述

12. 浅拷贝与深拷贝

  • 浅拷贝:
    只复制原对象的值,不复制值的引用。
  • 深拷贝:
    复制原对象的值和引用。

13. String ,StringBuffer,StringBuilder

  • String:不可变对象,每次操作会生成新的String对象,然后将指针指向新的String对象,而其他两个是在原对象基础上操作,效率低下且浪费内存空间,所以经常改变字符串最好不使用String。
  • StringBuffer:线程安全,性能低(建议多线程使用)
  • StringBuilder:线程不安全,性能高(建议单线程使用)
String s = "a"; // 存放在常量池
String s = new String("a") // 存放在堆内存

14. static关键字

  1. 抽象方法不可以使用static
  2. 不可以在静态方法内部调用非静态方法
  3. 不可以修饰局部变量
  4. 内部类与静态内部类区别?
    静态内部类与外部类相互独立,可以看做是一个独立的外部类。普通内部类可以调用外部类的所有属性和方法,为外部类需要创建实例才可以调用内部类中的方法
  5. 不可以重写static或private方法

15. 重载和重写

都是实现多态的方式。
重载是实现编译时的多态,同名的方法有不用的参数列表,对返回类型没有要求。
重写是运行时的多态,重写要求与原来的方法相同的参数列表,返回类型。

16. 四种引用

  • 强引用:最普遍,例如String s = “abc”,变量s就是abc的强引用,只要存在就不会垃圾回收掉
  • 软引用:描述有用但非必须的对象,内存不足则回收。
  • 弱引用:内存不管是否足够都会回收
  • 虚引用:不像其他三个决定回收周期,必须与引用队列(ReferenceQueue)联合使用,在对象回收之前把虚引用加入到与之关联的引用队列中。

17. Comparator和Comparable接口,compareTo方法

Comparator比较器排序

public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1,Person o2) {
    }
}

Comparable自然排序

public class People implements Comparable<People>{
    @Override
    public int compareTo(People o) {
    }
}

compatrTo:比较两个字符串

18.序列化

  • 序列化:将对象转换为字节序列的过程;反序列化:是将字节序列转换成对象的过程
  • 何时需要序列化:当java对象需要在网络上传输或者持久化存储到文件中时,
  • 如何实现:让类实现Serializable接口
  • 数据不想序列化:字段前加transient关键字

19.泛型和类型擦除

java中的泛型是一种伪泛型,虚拟机中并没有泛型对象,只是存在于编译期的一种语法糖,在编译器会进行类型擦除,如果定义了上界则用上界替换;没有则用Object替换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值