1. 数据类型专题
1.1. 为什么Java没有无符号整型?
- Java主要是用来处理业务逻辑的,无符号数的用处少
- 简化开发
1.2. Java中有没有指针?
有指针,但是隐藏了,开发人员无法直接操作指针,由jvm来操作指针
1.3. String是基本数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type)。
1.4. char类型变量能不能储存一个中文的汉字,为什么?
答:char用来储存一个Unicode编码字符,Unicode字符集包含了汉字,所以char类型自然就能存储汉字,但是在某些特殊情况下某个生僻汉字可能没有包含在 Unicode 编码字符集中,这种情况下 char 类型就不能存储该生僻汉字了
1.5. double能赋值给float吗(代码)
以下代码是否正确?1
float f = 3.4;
答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f = (float)3.4; 或者写成float f = 3.4F;
1.6. int能赋值给short吗?(代码)
以下代码是否正确?1
2short s = 1; // 正确
short s = 65536; // 错误。Incompatible types, Required short, Found int
short s = 1 是正确的。虽然说常量1是int类型,原则上int不能赋值给short,但是编译器看到常量1在short的范围内,所以会将常量1自动转换为short类型(注意这不叫隐式转换)
short s = 65536 是错误的。因为65536超过short的范围,编译器无法将65536自动转换为short,只好视为int,因为int无法赋值给short,所以报错

以下代码是否正确?1
2short s = 1;
s = s + 1; // 错误。Incompatible types, Required short, Found int
s = s + 1 是错误的。s + 1隐式转换为int,int无法赋值给short
以下代码是否正确?1
2short s = 1;
s += 1; // 正确,相当于 s = (short)(s + 1)
https://blog.csdn.net/weixin_42405708/article/details/81069625 有人从JVM反汇编的角度,论证s += 1与s = (short)(s + 1)完全一致
1.7. Integer和int有什么区别?
答:int 是 java 内置基本数据类型之一,java 为每个基本类型都提供了一个封装类,Integer 就是 int 的封装类(也叫包装类型);int 变量的默认值为 0,Integer 变量的默认值为 null,所以 Integer 可以区分出未赋值和值为 0 的区别;Integer 类内部提供了一些关于整数操作的方法,例如上文用到的表示整数的最大值和最小值。
1.8. 有了基本数据类型,为什么还要包装类型?
基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就有了包装类。包装类为其添加了属性和方法,丰富了基本类型的操作。这样在程序中,我们就可以统一以面向对象的方式来操作数据
包装类能区分0和null,但是基本类型不能区分。比如Student有一个score字段,代表分数。你用基本数据类型,就不能分区这个学生得了0分,还是没有成绩
1.9. 什么是装箱和拆箱?
装箱:把基本数据类型转换成对应的包装类型
拆箱:把包装类型转换为对应的基本数据类型
1.10. 手动装箱拆箱和自动装箱拆箱的主要区别?
手动装箱:显式调用包装类的valueOf,将基本类型转为包装类
自动装箱:编译器自动调用valueOf1
2Integer a = Integer.valueOf(1); // 手动装箱
Integer b = 1; // 自动装箱,编译器会自动调用Integer.valueof(1)
手动拆箱:显式调用包装类的intValue,将包装类转为基本类型
自动拆箱:编译器自动调用intValue1
2
3Integer a = 1;
int b = a.intValue(); // 手动拆箱
int c = a; // 自动拆箱
1.11. boolean占几个字节?
boolean不可能占1bit。因为计算机处理数据的最小单元是1byte=8bit
boolean单独使用时,相当于int,占4字节。《Java虚拟机规范》中提到,虽然Java定义了boolean数据类型,但JVM没有任何操作boolean专用的字节码指令。故编译之后用int来取代boolean。为什么用int而不是byte或short?因为int类型存取更高效。
boolean[]数组编译后会被byte[]数组代替,此时的boolean占1字节
但是也不能绝对说boolean就是占4字节或者1字节,因为这只是JVM规范。具体各个JVM实现(OracleJDK、OpenJDK)不一定会按照这个规范来
1.12. String的字面量和new创建方式一样吗?
1 | String s1 = "aaa"; // 通过字面量创建 |
字符串有new和字面量2种创建方式。但是字面量使用了缓存技术,故一般情况下均使用字面量方式创建。
- new创建:若常量区没有
"abc",则先在常量池创建"abc",再在堆中创建"abc"。若常量池已有"abc",则只用在堆中创建"abc"。最后栈中开辟s1,指向堆中的"abc"对象 - 字面量创建:若常量池没有
"abc",则先在常量池创建"abc",最后栈中开辟s1,指向常量池中的"abc"对象。若常量 池已经有"abc",则直接开辟s1,指向已存在的"abc"
2. 集合框架专题
2.1. 讲一下Java中的集合?
Java中的集合分为value和key-value两种,或者说分为Collection和Map两种
存储value(Collection)分为List和Set
- List是有序的(有序是指存储的顺序与添加时的顺序一致),可以重复的
- Set是无序的(无序是指存储的顺序与添加时的顺序不一致,LinkedHashSet是特例),不可以重复的。根据equals和hashcode判断,也就是如果一个对象要存储在Set中,必须重写equals和hashCode方法。
存储key-value的为Map.
2.2. ArrayList和LinkedList的区别?
ArrayList底层使用时数组。LinkedList使用的是链表。
数组查询具有所有查询特定元素比较快。而插入和删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。
链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或者删除的效率高。
ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList使用在查询比较少而插入和删除比较多的情况。
3. IO流整理
3.1. Java的IO流分为哪两种?
按功能来分:输入流(input),输出流(output)
按类型来分:字节流,字符流
3.2. 字节流与字符流的区别
以字节为单位输入输出数据,字节流按照8位传输
以字符为单位输入输出数据,字符流按照16位传输
3.3. 实现一个拷贝文件的工具类使用字节流还是字符流?
我们拷贝的文件不确定是只包含字符流,有可以能有字节流(图片、声音、图像等),为考虑到通用性,要使用字节流。
4. 基础语法整理
4.1. Java有没有goto?
答:goto 是Java中的保留字,在目前版本的Java中没有使用
4.2. “==”与equals有什么区别?
首先讲一下==的作用:
- 对于基本数据类型,判断值是否相等
- 对于引用类型,判断堆内存地址是否相等(是不是指向同一个对象)
equals是Object对象的一个方法,默认行为与与==是一致的。String以及所有的包装类都重写了该方法
4.3. String/StringBuilder/StringBuffer的区别
String/StringBuillder/StringBuffer都可以表示和操作字符串,字符串就是多个字符的集合
在内容上:
- String是不可变的,底层使用
final char value[] - StringBuilder/StringBuffer是可变的,底层使用
char[] value
在操作字符串时(如拼接操作),尽量使用StringBuilder/StringBuffer,而不去使用String。因为String不可变,每操作一次就要生成新的对象
StringBuffer与StringBuilder的区别:
- StringBuffer是线程安全的,底层所有方法都使用用
synchronized加锁,但加锁之后效率就变低 - StringBuilder是线程不安全的,没有加锁,所以相对StringBuffer,效率较高
4.4. final关键字有哪些用法
final可以修饰类、方法、变量。
final类:该类不能被继承,比如String
final方法:子类不能重写该方法
final变量:常量
4.5. static关键字有哪些用法
static可以修饰内部类、方法、变量、代码块
static修饰的类是静态内部类(外部类不能用static修饰)
static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象
static修饰变量是静态变量或者叫类变量
static修饰的代码块叫静态代码块,当类被加载类会被执行一次
4.6. Java中操作字符串使用哪些类?
String,StringBuffer,StringBuilder
4.7. ++i与i++的区别
++i:先赋值,后计算
i++:先计算,后赋值
4.8. Java常用包有那些
java.lang
java.io
java.sql
java.util
java.net
java.math
4.9. Java最顶级的父类是哪个
Object
4.10. Object类常用方法有那些?
equals
hashcode
toString
wait
notify
clone
getClass
4.11. java函数传参是值传递和引用传递
Java只有值传递(这里的引用传递是C++中的引用)
对于基本数据类型,传递的是它的副本
对于引用类型,传递的是引用的副本,还是按值传递
4.12. 实例化数组后,能不能改变数组长度呢?
不能,数组一旦实例化,它的长度就是固定的
4.13. 构造方法能不能重写?能不能重载?
可以重写,也可以重载
4.14. 什么是方法重载?
存在两个方法,方法名相同,但是参数类型或者参数个数不同
4.15. override、overwrite、overload的区别
override:覆盖
overwrite:重写
overload:重载
重写和覆盖是等价的,重载是指函数重载
4.16. 如何将字符串反转?
StringBuilder或者StringBuffer的reverse方法
1 | System.out.println(new StringBuilder("213").reverse()); |
4.17. 面向对象的语言有那些特征?
封装、继承、多态
4.18. Java中的继承是单继承还是多继承
Java中既有单继承,又有多继承。对于java类来说只能有一个父类,对于接口来说可以同时继承多个接口
4.19. 如果一个类中有抽象方法,那么这个一定是抽象类?
包含抽象方法的类一定是抽象类
4.20. 抽象类可以使用final修饰吗?
不可以。定义抽象类就是让其他继承的,而final修饰类表示该类不能被继承,与抽象类的理念违背了
4.21. 普通类与抽象类有什么区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法
抽象类不能直接实例化,普通类可以直接实例化
4.22. 除了使用new创建对象之外,还可以用什么方法创建对象?
Java反射
4.23. Java反射创建对象效率高还是通过new创建对象的效率高?
通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低
4.24. Java中集合框架的有几个?
Coillection、Map
5. JDBC整理
5.1. JDBC操作的步骤
- 加载数据库驱动类
- 打开数据库连接
- 执行sql语句
- 处理返回结果
- 关闭资源
5.2. 在使用jdbc的时候,如何防止出现sql注入的问题
使用PreparedStatement类,而不是使用Statement类
5.3. 怎么在JDBC内调用一个存储过程
使用CallableStatement
5.4. 是否了解连接池,使用连接池有什么好处?
数据库连接是非常消耗资源的,影响到程序的性能指标。连接池是用来分配、管理、释放数据库连接的,可以使应用程序重复使用同一个数据库连接,而不是每次都创建一个新的数据库连接。通过释放空闲时间较长的数据库连接避免数据库因为创建太多的连接而造成的连接遗漏问题,提高了程序性能。
6. 异常整理
6.1. Java中异常分为哪两种?
编译时异常
运行时异常
6.2. 说几个常见的编译时异常类?
NullPointerException:空指针异常
ArrayIndexOutOfBoundsException:数组下标越界
NumberFormatException:数字转换异常
IllegalArgumentException:参数不匹配异常
InstantiationException:对象初始化异常
ArithmeticException:算术异常
6.3. 如何自定义一个异常
继承一个异常类,通常是RumtimeException或者Exception
6.4. try.catch.finally是必须要存在的吗?
try块必须存在,catch和finally可以不存在,但不能同时不存在
6.5. throw与throws区别
throw 表示抛出异常。写在代码块内,throw后面跟的是一个具体的异常实例
throws 声明该方法会出现哪些异常。写在方法后面,throws后面跟的是异常类,异常类可以出现多个
6.6. Error与Exception区别?
Error和Exception都是java错误处理机制的一部分,都继承了Throwable类。
Exception表示的异常,异常可以通过程序来捕捉,或者优化程序来避免。
Error表示的是系统错误,不能通过程序来进行错误处理。
7. JVM专题整理
7.1. JDK和JRE的区别
JRE(java runtime environment)是指Java运行环境
JDK(java development kit)是Java开发工具包。JDK包含了JRE
7.2. 简单讲一下Java跨平台的原理
由于各操作系统(windows,liunx等)支持的指令集,不是完全一致的。就会让我们的程序在不同的操作系统上要执行不同程序代码。Java开发了适用于不同操作系统及位数的java虚拟机来屏蔽个系统之间的差异,提供统一的接口。对于我们java开发者而言,你只需要在不同的系统上安装对应的不同java虚拟机、这时你的java程序只要遵循java规范,就可以在所有的操作系统上面运行java程序了
8. 知识面扩展整理
8.1. Java之父是?
詹姆斯·高斯林(James Gosling)