文章目录
- 前言
- Java基础
- `1、jdk和jre有什么区别?`
- `2、final在Java中有什么作用?`
- `3、有常量类了为什么还要使用枚举类?`
- `4、为什么使用包装类?`
- `5、==和equals的区别是什么?`
- `6、hashcode是什么有什么作用?`
- `7、重写hashcode为什么要重写equals?`
- `8、怎么解决Hash碰撞 ?`
- `9、Java有哪些引用数据类型?`
- `10、什么是Java序列化?什么情况下会使用到序列化?`
- `11、在Java中为什么不允许从静态方法中访问非静态变量?`
- `12、在Java中什么时候使用重载什么时候使用重写?`
- `13、实例化对象有哪几种方式?`
- `14、Java容器都有哪些?`
- `15、为什么要使用克隆?如何实现对对象的克隆?深拷贝和浅拷贝的区别是什么?`
- string
- 面向对象
- 接口
- 抽象类
- 继承
- 异常体系
前言
匿名内部类访问的局部变量为什么必须要用final修饰?
Java基础
1、jdk和jre有什么区别?
JDK(Java Development Kit),Java开发工具包
JRE(Java Runtime Environment),Java运行环境
JVM (java Virtual Machinejava),Java 虚拟机
JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库
对于Java的开发人员是必须要安装JDK的,因为里面放的是Java的开发工具。
但是对于Java程序的运行只需要安装JRE就够了。
由此我们梳理出一个非常简单的结构,JDK中包含JRE和JavaC等Java开发工具,而JRE又包含着JVM虚拟机。
Java程序的基本处理流程:
2、final在Java中有什么作用?
简述final关键字的作用
表示为最终的,可以修饰类,修饰方法,修饰变量
修饰类:表示类不可以被继承,把父类变成了太监类
修饰方法:表示方法不能被子类覆盖(形参列表和返回值不变,方法中业务进行改变),但可以进行重载(也就是可以设置不同的形参和返回值,但方法业务不能更改)
修饰变量:表示变量一旦被赋值就不能更改它的值
如果修饰的是静态变量 需要在声明变量时赋值或在静态代码块中进行赋值,
例如 : public static final int i = 10;或 static{静态代码块进行赋值}
如果修饰的是成员变量 可以在声明变量时赋值,调用时赋值,和在 普通代码块中进行赋值
{ 我是普通代码块 } static{ 我是静态代码块 }
如果修饰的是局部变量 可以声明时不进行赋值,但使用时一定要赋值,但不能进行第二次赋值。
3、有常量类了为什么还要使用枚举类?
为了限制参数的范围
当我们需要一些固定不变的数据时,就可以将其声明为静态常量,以方便复用,然后通过类名点方法名的方式调用获取到常量,虽然我们定义常量时,指定了一些不变的数据,例如 public static final int SPRING = 1; 当我们的某个方法需要传入这个常量时,通过传入的常量执行不同的逻辑,此时就会发现没有办法限制调用者传什么值进来,调用者不仅可以传入 常量 1 ,还能传入其他 int 类型的变量,当然可以在方法上面添加注释提醒调用者,或者在方法中对传入的非法参数进行特殊的处理。
这时就需要使用 枚举类 来解决这个问题,让方法接收一个枚举类,在枚举类中定义需要的数据类型,这样调用者如果不传一个我们定义好的枚举类进来,最多也只能传一个null,如果传一个我们定义好的枚举类,就可以通过枚举类的get方法获取对应的常量。这样就限制了调用者能够传递的数据类型。
4、为什么使用包装类?
5、==和equals的区别是什么?
1.equals和== 最大的区别是一个是方法一个是运算符。
2.==: 如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
3.equals(): 用来比较方法两个对象的内容是否相等。
注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
6、hashcode是什么有什么作用?
hashcode是一个对象的唯一标识符,它是根据对象的内容通过特殊算法计算出来的一个整数。hashcode主要用于在哈希表、集合、映射等数据结构中快速查找和定位对象,提高程序的效率。同时,它也是一些类库和框架在进行对象比较、对象去重等操作时的重要依据。
7、重写hashcode为什么要重写equals?
重写hashCode后再比较两个对象时,可以判断两个对象是否是同一个对象,而equals会比较两个对象的内容是否相同,只有当这两个条件都成立时,我们才能判定它们为同一个对象,我们在往HashMap,put元素时,就会先使用hashCode判断两个对象的code是否相同,如果相同再使用 equals 进行内容的比对,如果也相同,就能判定为同一个对象,然后进行返回,不进行元素的插入,但如果equals 的条件不成立,就表名这两个对象只是hashCode相同,但内容不同,可能发生了Hash碰撞,就会将需要擦插入的元素挂载到对应的链表。而这种业务操作是很常见的,大家就不约而同的在重写 hashCode后都去重写 equals 。
8、怎么解决Hash碰撞 ?
1、链地址法
对于相同的哈希值,使用链表进行连接。(HashMap使用此法)
优点
处理冲突简单,无堆积现象。即非同义词决不会发生冲突,因此平均查找长度较短;
适合总数经常变化的情况。(因为拉链法中各链表上的结点空间是动态申请的)
占空间小。装填因子可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计
删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。
缺点
查询时效率较低。(存储是动态的,查询时跳转需要更多的时间)
在key-value可以预知,以及没有后续增改操作时候,开放定址法性能优于链地址法。
不容易序列化
2、再哈希法
提供多个哈希函数,如果第一个哈希函数计算出来的key的哈希值冲突了,则使用第二个哈希函数计算key的哈希值。
优点
不易产生聚集
缺点
增加了计算时间
9、Java有哪些引用数据类型?
10、什么是Java序列化?什么情况下会使用到序列化?
11、在Java中为什么不允许从静态方法中访问非静态变量?
12、在Java中什么时候使用重载什么时候使用重写?
13、实例化对象有哪几种方式?
14、Java容器都有哪些?
15、为什么要使用克隆?如何实现对对象的克隆?深拷贝和浅拷贝的区别是什么?
string
16、string属于基本数据类型吗?
17、string为什么设计为flian ?
18、string,stringbuff,stringbiudre的区别?
19、string i = " a " 和 new string(" a ") 一样吗?
20、string类的常用方法有哪些 ?
String str = "abcdef";
System.out.println(str.length());//输出结果:6
String str = "abc";
System.out.println(str.charAt(1));//输出结果:b
String str = "abcabc";
System.out.println(str.indexOf('a'));//输出结果:0
String str = "abcdef";
System.out.println(str.subString(2));//输出结果:cdef
String str1 = "abc";
String str2 = "ABC";
System.out.println(str1.equals(str2));//输出结果:false
21、如何将字符串反转?
public static String reverse4(String s) {
return new StringBuffer(s).reverse().toString();
}
public static String reverse3(String s) {
char[] array = s.toCharArray();
String reverse = "";
for(int i = array.length - 1; i >= 0; i--)
reverse += array[i];
return reverse;
}
22、String str =new String(“ab”) 会创建几个对象 ?
public class StringNewTest {
public static void main(String[] args) {
String str = new String("ab");
}
}
根据反编译后字节码分析:
1、一个对象是:new关键字在堆空间创建的;
2、另一个对象是:字符串常量池中的对象"ab"。 (如果前后文中还有代码,并且已经有 ab 常量在常量池存在时,ab 将不再创建,因为在常量池只能存在一份相同的对象)
结论是至少是2个对象。
23、String str =“a”+ “b” 会创建几个对象 ?
public class StringNewTest {
public static void main(String[] args) {
String str = "a" + "b";
}
}
javap -v StringNewTest.class 反编译后, 部分片段如下:
“a” + “b” 在编译时,就已经编译为 ab, 被放到常量池中。
所以只有一个对象 :ab
注意:
如果前后文中还有代码,并且已经有 ab 常量在常量池存在时,ab 将不再创建,因为在常量池只能存在一份相同的对象。
24、new string a ➕new string b会创建几个对象?
对象1:new StringBuilder()
对象2:new String(“a”)
对象3:常量池中的"a"
对象4:new String(“b”)
对象5:常量池中的"b"
深入剖析:StringBuilder中的toString():
对象6:new String(“ab”)
强调一下,toString()的调用,在字符串常量池中,没有生成"ab"
面向对象
25、说说你所了解的面向对象的三大特征?
26、面向对象和面向过程有什么区别 ?
27、说一下你对面向对象的理解 ?
28、组合和继承的区别 ?
接口
29、为什么不直接在类里面写对应的方法, 而要多写一个接口(或抽象类)?
30、既然接口跟抽象类差不多, 什么情况下要用接口而不是抽象类?
31、说一下接口的特点?
32、接口如果被default关键字修饰会怎么样?
33、接口和抽象类有哪些区别?
34、接口和类的区别?
抽象类
35、什么是抽象类?什么情况下会使用抽象类?
36、抽象类可以被实例化吗?抽象方法呢?抽象方法可以被private关键字修饰吗?为什么?
37、普通类和抽象类有哪些区别?
38、抽象类中有构造方法吗 ?
39、抽象类可以用final声明么?
40、抽象类能否使用static声明 ?
41、抽象类的应用——模板方法设计模式
42、举例说明什么情况下会更倾向于使用抽象类而不是接口
继承
43、Java为什么不允许多继承?
44、组合大于继承,什么时候组合?什么时候用继承?
45、继承的优缺点 ?
46、什么时候需要重写父类的方法?重写后怎么调用父类的方法?
46、子类继承父类后会有哪些行为限制?
异常体系
47、throw和throws的区别 ?
48、try catch fianlly中如果catch中return了,Fianlly还会执行吗?
49、final finally finalize有什么区别 ?
50、平常在开发中都遇到过哪些异常 ?
统一异常处理怎么实现?
枚举类
包装类
IO流
封装:核心思想就是“隐藏细节”、“数据安全”,将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。所有的内容对外部不可见。\n继承:子类可以继承父类的属性和方法,并对其进行拓展。将其他的功能继承下来继续发展 。\n多态:同一种类型的对象执行同一个方法时可以表现出不同的行为特征。通过继承的上下转型、接口的回调以及方法的重写和重载可以实现多态。方法的重载本身就是一个多态性的体现。%