Java 基础八股文 34 卷(图解版)

本文详细介绍了Java的基础知识,包括封装、继承、多态等特性,以及Java的数据类型、接口与抽象类的区别、重载和重写、异常处理等。深入探讨了ArrayList与LinkedList的区别、HashMap在不同版本的特性、线程安全问题及其解决方案,如HashMap的线程不安全、ConcurrentHashMap的改进。此外,还讲解了单例模式、线程池参数、四种引用类型、深拷贝与浅拷贝等内容,是Java初学者和进阶者的重要参考资料。

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

1.介绍一下 java

开源,跨平台,面向对象
区别大小写
强类型语言

跨平台是因为 java 的 class 文件是运行在虚拟机上的,而虚拟机是有不同平台的

封装

1.把对象的属性和行为看成一个密不可分的整体,将这两者’封装’在一个不可分割的独立单元(即对象)中
2.信息隐藏,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓,或只允许使用对象的功能,而尽可能隐藏对象的功能实现细节。

继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

多态

1.方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
2.对象多态:子类对象可以与父类对象进行转换,而且根据其使用的子类不同完成的功能也不同(重写父类的方法)。
多态是同一个行为具有多个不同表现形式或形态的能力。Java语言中含有方法重载与对象多态两种形式的多态:

java 有哪些数据类型

在这里插入图片描述

3.接口和抽象类有什么区别?

接口是对行为的抽象,抽象类是对类(属性和行为)的抽象

接口:成员变量为常量 成员方法为抽象方法(无方法体) 无构造方法
接口可以多继承,抽象类不行

抽象类:成员变量为常量、变量 成员方法为抽象方法 ,普通方法pvm 无参带参构造

接口定义方法,不能实现,默认是 public abstract,而抽象类可以实现部分方法。
接口中基本数据类型为 public static final 并且需要给出初始值,而抽类象不是的。

4.重载和重写什么区别?

与返回值无关,与方法名相同,形参的参数个数与参数类型有关
子类继承父类 同名方法实现其他功能,就需要重写父类的方法,来实现特有的方法

5.常见的异常有哪些?

NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 索引越界异常
InputFormatException 输入类型不匹配
SQLException SQL异常
IllegalArgumentException 非法参数
NumberFormatException 类型转换异常 等等…

6.异常要怎么解决?

Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。

Throwable又派生出Error类和Exception类。

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

处理方法:
1.try()catch(){}

try{
   
// 程序代码
}catch(ExceptionName e1){
   
//Catch 块
}

2.throw
throw 关键字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,在异常处理中,try 语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出
3.throws
定义一个方法的时候可以使用 throws 关键字声明。使用 throws 关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。

7.arrayList 和 linkedList 的区别?

都是list接口的实现类。arrayList 底层是数组实现,linkedList 底层是链表实现
arrayList 查询快,增删慢 linkedList 查询慢,增删快
在这里插入图片描述
1.ArrayList 是实现了基于数组的,存储空间是连续的。LinkedList 基于链表的,存储空间是不连续的。(LinkedList 是双向链表)

2.对于随机访问 get 和 set ,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。

3.对于新增和删除操作 add 和 remove ,LinedList 比较占优势,因为 ArrayList 要移动数据。

4.同样的数据量 LinkedList 所占用空间可能会更小,因为 ArrayList 需要预留空间便于后续数据增加,而 LinkedList 增加数据只需要增加一个节点

8.hashMap 1.7 和 hashMap 1.8 的区别?

在这里插入图片描述

9.hashMap 线程不安全体现在哪里?

在 hashMap1.7 中扩容的时候,因为采用的是头插法,所以会可能会有循环链表产生,导致数据有问题,在 1.8 版本已修复,改为了尾插法

在任意版本的 hashMap 中,如果在插入数据时多个线程命中了同一个槽,可能会有数据覆盖的情况发生,导致线程不安全。

10.那么 hashMap 线程不安全怎么解决?

一.给 hashMap 直接加锁,来保证线程安全
二.使用 hashTable,比方法一效率高,其实就是在其方法上加了 synchronized 锁
三.使用 concurrentHashMap , 不管是其 1.7 还是 1.8 版本,本质都是减小了锁的粒度,减少线程竞争来保证高效.

11.concurrentHashMap 1.7 和 1.8 有什么区别

在这里插入图片描述

12.介绍一下 hashset 吧

hashset 底层是由哈希表来实现的

set 继承于 Collection 接口,是一个不允许出现重复元素,并且无序的集合.
HashSet 是基于 HashMap 实现的,底层采用 HashMap 来保存元素

元素的哈希值是通过元素的 hashcode 方法 来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。

13.什么是泛型?

数据类型的广泛称呼

泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

14.泛型擦除是什么?

因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。

15.说说进程和线程的区别?

一个进程包含一个或多个线程,一个应用程序的启动到关闭是一个进程,而某一个模块的运行是线程

进程是系统资源分配和调度的基本单位,它能并发执行较高系统资源的利用率.
线程是比进程更小的能独立运行的基本单位,创建、销毁、切换成本要小于进程,可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。

16.volatile 有什么作用?

1.保证内存可见性
可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。
2.禁止指令重排序
cpu 是和缓存做交互的,但是由于 cpu 运行效率太高,所以会不等待当前命令返回结果从而继续执行下一个命令,就会有乱序执行的情况发生

17.什么是包装类?为什么需要包装类?

Java 中有 8 个基本类型,分别对应的 8 个包装类

byte – Byte
boolean – Boolean
short – Short
char – Character
int – Integer
long – Long
float – Float
double – Double
为什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllSelects

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值