1、面向对象编程有哪些特征?

抽象 封装 继承 多态


2、JDK 与 JRE 的区别是什么?

JDK包含JRE


3、Java 有哪几种基本数据类型?

byte short int long float double boolean char


4、== 和 equals 比较有什么区别?

基本类型:值比较
引用类型:地址比较

equals:实际是==,可以通过重写来修改


5、public,private,protected,默认的区别?


6、this 和 super 有什么区别?


7、short s1 = 1; s1 += 1;有错吗?

没有


8、short s1 = 1; s1 = s1 + 1;有错吗?

类型转换错误


9、float n = 1.8 有错吗?


10、i++ 和 ++i 的区别?

先赋值在+1 ,先+1在赋值


11、while 和 do while 有啥区别?

先判断在执行,先执行在判断


12、如何跳出 Java 中的循环?

continue;break;return;


13、如何跳出 Java 中的多层嵌套循环?

break loop;


14、& 和 && 的区别?

&位与运算,两边都为true,才为true。 &&逻辑与运算,第一个表达式为true,就为true


15、2 * 8 最有效率的计算方法是什么?

2<<3


16、数组有没有 length 方法?String 呢?

没有length,有size方法
有length


17、怎么理解值传递和引用传递?

方法入参传递基本类型,会拷贝副本,并将值传入
方法入参传递引用类型,会将当前引用地址传递至方法内


18、Java 到底是值传递还是引用传递?

是值传递。 Java 编程语言只有值传递参数。 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。 对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。


19、一个 “.java” 源文件的类有什么限制?

有什么限制? 这个是可以的,一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致。 每个编译单元只能有一个public 类。 这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。


20、Java 中的注释有哪些写法?

// // / */


21、static 关键字有什么用?

static 关键字主要有两种作用:
第一,为某特定数据类型或对象分配单的存储空间,而与创建对象的个数无关。
第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。
具体而言,static在Java语言中主要有四种使用情况:成员变量、成员方法、代码块及内部类。以下将分别对这4种情况进行介绍
(1)static成员变量(类变量)
虽然Java语言中没有全局的概念,但可以通过static 关键字来达到全局的效果。Java类态变量属于类,提供了两种类型的交量。用satic关键字修饰的静态变量和没有satie关键字的实例变量在内存中只有一个副本(所有实例都指向同一一个内存地址),只要静态变量所在的类被加载, 这个静态变量就会被分配空间,因此,就可以被使用了。对静态变量的引用有两种方式,分别为“类静态变量”和“对象静态变量”。
实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个副本。只能用“对象.静态变量”的方式来引用。
(2) static 成员方法
与变量类似,Java类同时也提供了static方法与非static方法。static 方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用。
static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static 方法也不能访问非static类型的变量。实现了单例。
(3).Static代码块
Static代码块又叫静态代码块,在类中独立于成员变量和成员函数的代码块。它不在任何一个方法体内,JVM在加载类的时候执行静态代码块,多个存在则顺序执行,常用来初始化静态变量。而且只被执行一次,如果是在主类中,会优先于main方法执行。
(4).Static内部类
被static修饰的类相当于外部类,但是内部类不能与外部类的类名相同,只有内部类才能被定义为static(可以理解为内部类也是类的一个成员)。


22、static 变量和普通变量的区别?

在不创建对象的情况调用static 变量


23、static 可以修饰局部变量么?

不能,因为局部变量在实例方法内部,在没有实例的情况下,不能对局部变量赋值


24、final 关键字有哪些用法?

final修饰类、方法、成员变量、局部变量、方法参数


25、final、finally、finalize 有什么区别?

final是指最终的,可以用来修饰类、方法、成员变量、局部变量、方法参数;
finally是try-catch-finally方法名中的最后一块,用于保证必要代码执行,一般用于释放资源
finalize是Object内方法,表示该对象在gc时,不会被立即回收


26、void 和 Void 有什么区别?

void表示方法没有返回值
Void是void的包装类,不能被实例化,一般用于返回null方法和null泛型


27、为什么 byte 取值范围为 -128~127?

byte是8位二进制,0-255,而且要包含负数


28、char 类型可以存储中文汉字吗?

不可以,char只能包含一个字节,而中文汉字需要两个


29、重载和重写有什么区别?

重载(Overload)
作用:
方法重载就是让类以统一的方式处理不同类型的一种手段,调用方法时通过传递给他们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
特点:
重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数的类型相关。
原则:
方法重载时,方法之间需要存在一定的练习,因为这样可以提高程序的可读性,并且我们一般只重载功能相似的方法。
注意事项:
1.重载的方法必须具有不同的参数列表。
2.不能通过访问权限,返回类型,抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。
4.可以有不同的返回类类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常

重写(Override)
作用:
重写体现了Java优越性,重写是建立在继承关系上的,它使语言结构更加丰富。在Java的继承中,子类既可以隐藏和访问父类的方法,也可以重写继承来的父类方法。这样方便了子类对父类方法的扩展。
特点:
方法的重写发生在继承类,实现类之中,重写后的方法与原方法有完全相同的返回值类型,方法名,参数个数以及参数类型,但是具体实现不同。
注意事项:
1.方法名必须相同,返回类型必须相同
2.参数列表必须相同
3.访问权限不同比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明成protected。
4.子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
5.构造方法不能被重写
6.继承过程中如果父类当中的方法抛出异常,那么子类中重写父类的该方法时,也要抛出异常,且抛出的异常不能多于父类抛出的异常,例如父类抛出了IOException那么重写这个方法时就不能抛出Exception


30、构造器可以被重写和重载吗?

不能


31、main 方法可以被重写和重载吗?

可以


32、私有方法能被重载或者重写吗?

可以重载,不能重写


33、Java 中的断言(assert)是什么?

调试程序的程式


34、Java 异常有哪些分类?

Exception RuntimeException-CheckedException Error


35、Error 和 Exception 有什么区别?

Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),他是异常处理机制的基本组成类型。
Exception和Error体现了java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常状态,不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源码里必须显示的进行捕获处理,这里是编译期检查的一部分。前面我们介绍的不可查的Error,是Throwable不是Exception。
不检查异常就是所谓的运行时异常,类似NullPointerException,ArrayIndexOutOfBoundsExceptin之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。


36、Java 中常见的异常有哪些?

image.png


37、Java 中常见的运行时异常有哪些?

ArrithmeticException ArrayIndexOutOfBoundsException NullPointException ClassCastException IllegalArgumentException InputMatchException


38、运行时异常与受检查异常有什么区别?

受检异常会在编译期报错


39、什么时候会发生空指针异常?

未对使用属性、方法来源的类判空


40、你知道有哪些避免空指针的方法?

Optional.ofNullable
if(Objects.nonNull())
equals 变量放后面
list返回空列表,不要返回null
使用assert
初始化赋默认值,不要返回null

41、throw 和 throws 的区别?

throw在方法内使用,对外抛出异常
throws对方法内抛出异常向上透传


42、try-catch-finally 中哪个部分可以省略?

finally


43、try 里面 return,finally还会执行吗?


44、int 和 Integer 有什么区别?

int是基本类型 默认值0,无需初始化,没有地址
Integer是包装类型,默认值null,需要初始化后使用,指向使用对象的地址


45、什么是包装类型?有什么用?

基本数据类型如int、long作为成员变量,如果没有赋初始值,那么默认是0。而包装类作为成员变量,没有赋初始值的话,默认为null。如果你使用基本类型,某个对象的某些基本数据类型成员变量没有设置值,你用insert方法插入,给你插入了0,可能跟你要的预期效果不一样,导致业务逻辑错误。


46、什么是自动装厢、拆厢?


47、你怎么理解 Java 中的强制类型转换?


48、你怎么理解 Java 中的自动类型转换?


49、你怎么理解 Java 中的类型提升?


50、switch 是否能用在 long 上?

不行


51、switch 是否能用在 String 上?

可以


52、switch case 支持哪几种数据类型?

/*
问题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上
基本类型的包装类(如:Character、Byte、Short、Integer)

switch可作用于char byte short int
switch可作用于char byte short int对应的包装类
switch不可作用于long double float boolean,包括他们的包装类
switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
switch中可以是枚举类型
/


53、String 属于基础的数据类型吗?

引用类型


54、String 类的常用方法都有那些?

1、和长度有关:
int length() 得到一个字符串的字符个数
2、和数组有关:
byte[] getByte() ) 将一个字符串转换成字节数组
char[] toCharArray() 将一个字符串转换成字符数组
String split(String) 将一个字符串按照指定内容劈开
3、和判断有关:
boolean equals() 判断两个字符串的内容是否一样
boolean equalsIsIgnoreCase(String) 忽略太小写的比较两个字符串的内容是否一样
boolean contains(String) 判断一个字符串里面是否包含指定的内容
boolean startsWith(String) 判断一个字符串是否以指定的内容开头
boolean endsWith(String) 判断一个字符串是否以指定的内容结尾
4、和改变内容有关:
String toUpperCase() 将一个字符串全部转换成大写
String toLowerCase() 将一个字符串全部转换成小写
String replace(String,String) 将某个内容全部替换成指定内容
String replaceAll(String,String) 将某个内容全部替换成指定内容,支持正则
String repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容
String substring(int) 从指定下标开始一直截取到字符串的最后
String substring(int,int) 从下标x截取到下标y-1对应的元素
String trim() 去除一个字符串的前后空格
5、和位置有关:
char charAt(int) 得到指定下标位置对应的字符
int indexOf(String) 得到指定内容第一次出现的下标
int lastIndexOf(String) 得到指定内容最后一次出现的下标


55、String 的底层实现是怎样的?

https://xie.infoq.cn/article/9ff230e91d0ec22f705c4c8f4


56、String 是可变的吗?为什么?

final类,一旦赋值,不可修改


57、String 类可以被继承吗?

final类,不可继承


58、String 真的是不可变的吗?

不是,可以通过反射破坏类的特性


59、String 字符串如何进行反转?

.reverse()


60、String 字符串如何实现编码转换?

String newStr = new String(oldStr.getBytes(), “UTF-8”);


61、String 有没有长度限制?是多少?

String 的长度是有限制的。 编译期的限制:字符串的UTF8编码值的字节数不能超过65535,字符串的长度不能超过65534; 运行时限制:字符串的长度不能超过2^31-1,占用的内存数不能超过虚拟机能够提供的最大值。


62、为什么不能用 + 拼接字符串?


63、StringBuffer 和 StringBuilder 的区别?

StringBuffer加了synchonized锁,效率比StringBuilder要低
多线程操作,StringBuffer比StringBuilder安全


64、StringJoiner 有什么用?

https://juejin.cn/post/6940944771179511816

  1. List<Integer> values = Arrays.asList(1, 3, 5);
  2. // 创建StringJoiner对象,指定好分隔符,前缀,后缀
  3. StringJoiner sj = new StringJoiner(",", "(", ")");
  4. // 遍历列表数据并将元素追加到StringJoiner
  5. for (Integer value : values) {
  6. sj.add(value.toString());
  7. }
  8. System.out.println(sj); // (1,3,5)
  9. // 指定好分隔符
  10. StringJoiner sj = new StringJoiner(",");
  11. // 添加元素
  12. sj.add("张三").add("李四").add("王五");
  13. // 转换为字符串
  14. String result = sj.toString();
  15. System.out.println(result); // 张三,李四,王五
  16. StringJoiner sj = new StringJoiner(",");
  17. sj.add("张三").add("李四").add("王五"); // 张三,李四,王五
  18. StringJoiner sj2 = new StringJoiner("-", "[", "]");
  19. sj2.add("赵六").add("田七").add("王八"); // [赵六,田七,王八]
  20. // 谁调用则合并时以谁为主
  21. // sj.merge(sj2);
  22. // System.out.println(sj); // 张三,李四,王五,赵六-田七-王八
  23. sj2.merge(sj);
  24. System.out.println(sj2); // [赵六-田七-王八-张三,李四,王五]

65、Java 所有类的祖先类是哪个?

Object


66、Object 类有哪些常用的方法?

getClass、clone、finalize、equals、hashcode、toString、wait、notify、notifyAll


67、普通类和抽象类有什么区别?

1、抽象类可以没有抽象方法,也可以有普通方法;
2、抽象方法不能声明为静态,抽象方法只需声明无需实现,没有主体,普通方法有主体;
3、抽象类的子类必须实现父类的抽象方法,否则该子类也是抽象类;
4、抽象类可以有构造方法,被继承时子类必须继承父类的一个构造方法;
5、含有抽象方法的类必须是抽象类;
6、抽象类不能被实例化;


68、静态内部类和普通内部类有什么区别?

普通内部类持有对外部类的引用,静态内部类没有持有外部类的引用。

普通内部类能够访问外部类的静态和非静态成员,静态内部类不能访问外部类的非静态成员,他只能访问外部类的静态成员。

一个普通内部类不能脱离外部类实体被创建,且可以访问外部类的数据和方法,因为他就在外部类里面。


69、静态方法可以直接调用非静态方法吗?

不可以


70、静态变量和实例变量有什么区别?

静态变量前要加上关键字static,实例变量则不会。实例变量是属于某个对象的属性,必须创建了实例对象,其中的实例变量才会分配空间,才能使用这个实例变量。静态变量不属于任何的实例对象,而是属于类,也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,就会被分配空间。总之就是,静态变量不需要创建任何的对象就可以直接使用,而实例变量需要先创建实例对象才能被使用。


71、内部类可以访问其外部类的成员吗?

可以


72、接口和抽象类有什么区别?

相同点
(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点
(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。


73、接口是否可以继承接口?

可以


74、接口里面可以写方法实现吗?

不可以


75、抽象类必须要有抽象方法吗?

可以没有


76、抽象类能使用 final 修饰吗?

不可以


77、抽象类是否可以继承具体类?

可以


78、抽象类是否可以实现接口?

可以


79、怎么查看一个 Java 类的字节码?

javap -verbose


80、Java 中的 UUID 是什么?

UUID全称:Universally Unique Identifier,即通用唯一识别码,定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全惟一的系统信息。 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。


81、Java 类初始化顺序是怎样的?

https://segmentfault.com/a/1190000004527951
(静态变量、静态初始化块)父、子>(变量、初始化块)>构造器 先父后子


82、为什么成员变量命名不建议用 isXXX?

如果是布尔类型,get方法会变成isxxx
1、boolean类型的属性值不建议设置为is开头,否则会引起rpc框架的序列化异常。

2、如果强行将IDE自动生成的isSuccess()方法修改成getSuccess(),也能获取到Success属性值,若两者并存,则之后通过getSuccess()方法获取Success属性值。


83、hashCode 有什么用?

hashCode是jdk根据对象的地址算出来的一个int数字,即对象的哈希码值,代表了该对象在内存中的存储位置。 我们都知道hashCode()方法是顶级类Object类的提供的一个方法,所有的类都可以进行对hashCode方法重写。
用于比较两个对象是否相等


84、hashCode 和 identityHashCode 的区别?

identityHashCode和hashCode的区别是,identityHashCode会返回对象的hashCode,而不管对象是否重写了hashCode方法。


85、什么是 hash 冲突?


86、equals 和 hashCode 的区别和联系?


87、两个对象 equals 相等, hashCode 也相等么?

一定相等


88、两个对象 hashCode 相等,equals 也相等么?

不一定相等


89、为什么重写 equals 就要重写 hashCode 方法?

因为Hash比equals方法的开销要小,速度更快,所以在涉及到hashcode的容器中(比如HashSet),判断自己是否持有该对象时,会先检查hashCode是否相等,如果hashCode不相等,就会直接认为不相等,并存入容器中,不会再调用equals进行比较。


90、Java 常用的元注解有哪些?

① @Retention: 定义注解的保留策略
SOURCE : 保留在源文件
CLASS : 保留在class文件
RUNTIME : 保留在运行时
② @Target:定义注解的作用目标
用于描述注解的范围,即注解在哪用。它说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)等。取值类型(ElementType)有以下几种:
CONSTRUCTOR:用于描述构造器
FIELD:用于描述域即类成员变量
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明
TYPE_PARAMETER:1.8版本开始,描述类、接口或enum参数的声明
TYPE_USE:1.8版本开始,描述一种类、接口或enum的使用声明
③ @Document:说明该注解将被包含在javadoc中
④ @Inherited:说明子类可以继承父类中的该注解
用于表示某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。


91、Java 泛型中的 T、R、K、V、E 分别指什么?


92、Java 金额计算怎么避免精通丢失?


93、Java 语法糖是什么意思?


94、transient 关键字有什么用?

java关键字,用于持久化时忽略属性序列化


95、如何实现对象克隆?

1.实现Cloneable接口,并重写object类中的clone方法,可以实现浅克隆,也可以实现深度克隆。
2.实现Serializable,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。
3.利用BeanUtils,apache和spring都提供了这个bean工具。只是他也是浅克隆。


96、对象克隆浅拷贝和深拷贝的区别?


97、Java 反射机制有什么用?


98、Java 反射机制的优缺点?


99、Java 反射机制 Class 类有哪些常用方法?


100、Java 反射可以访问私有方法吗?


101、Java 反射可以访问私有变量吗?


102、Class.forName 和 ClassLoader 的区别?


103、什么是宏变量和宏替换?


104、什么是逃逸分析?


105、什么是伪共享?有什么解决方案?


106、Java 有没有 goto 关键字?

没有,保留字


107、Java 中有没有指针的概念?

没有


108、Java 中的 classpath 环境变量作用?

用来指定java程序搜索路径的


109、Math.round(1.5) 等于多少?

2 +0.5取整


110、Math.round(-1.5) 等于多少?

-1


111、Java 8 都新增了哪些新特性?

Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。

方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。

新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

Date Time API − 加强对日期与时间的处理。

Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。


112、Java 8 中的 Lambda 表达式有啥用?

Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)


113、Java 8 中的 Optional 类有什么用?

用来解决空指针异常。


114、Java 8 中的 Stream 有啥用?

把真正的函数式编程风格引入到Java中


115、Java 8 中的@Repeatable 注解有什么用?

重复注解,即一个注解可以在一个类、方法或者字段上同时使用多次,如Spring中可以使用多个扫描组件来扫描多个包的注解。


116、Java 8 中的方法引用是指什么?

方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。


117、Java 8 中的函数式编程怎么用?


118、怎么创建一个 Stream 流?


119、Oracle JDK 和 OpenJDK 有啥区别?

OpenJDK的特点是更新频繁,实现快速迭代和高效试错,为Oracle JDK LTS版本打下基础。 Oracle JDK的特点是单版本长期支持,提供稳定可用的商业版本,商用收费,学习研究免费。 如需在开源基础上开发及问题优化维护或不那么注重稳定性,则可以选择OpenJDK。2022年2月16日