站在巨人们的肩膀上,此前已经有非常多这类的博文,再次感谢他们为我写这篇文章提供了创作动力和知识储备。本文在个人认为合理的答案后添加认为需要补充的知识点,若有错误希望指正,另外由于知识点多并且每个小点都需要翻阅大量资料故目前整理的知识点数量不是很多但是坚持每天至少更新一点。
侵删
一、Java基础
1. JDK 和 JRE 有什么区别?
两者是包含关系,JDK包含JRE,适用对象的不同,JDK是开发人员使用的开发工具,JRE是使用者需要的软件环境。
JDK包含JRE,是开发人员使用的软件开发工具,还包含了编译器javac,用于Java程序调试和分析的工具jconsole、jvisualvm等 。
JRE是Java程序使用者需要的运行环境,包含了Java虚拟机(jvm)和Java基础类库(lang,util等)的class文件,并且将基础类库打包成jar放在其目录的lib目录下。
扩展:
JDK(Java Development Kit):Java开发工具。
JRE(Java Runtime Environment):Java运行环境。
JConsole和VisualJVM都是JDK自带的性能分析工具,.都可用来分析查看堆内存使用量、cpu占用率、线程数、已加载类数、VM概要。
2. == 和 equals 的区别是什么?
两者都用来比较两个变量是否相同,但是==是地址对比,equals默认是地址对比但可以重写hashcode和equals方法进行值对比(例如String,Math,Integer的equals方法都进行了重写)
int a = 1;
int b = 1;
System.out.println(a == b); // true,基本数据类型对比值
String c = "c";
String d = c;
System.out.println(c == d); // true,两者引用地址相同
String e = new String("c");
System.out.println(c == e); // false,e使用new开辟了新的地址存储值
String f = new String("c");
System.out.println(e == f); // false,e和f都使用new
System.out.println(e.equals(f)); // true,String方法重写了equals方法,在对比地址值的基础上继续判断内容是否相同
扩展:
- 没有重写的情况下equals的实现方法就是==
- 对于基本数据类型和对象==都是对比地址的值是否相等
- 对于对象最好用equals来比较两个对象的内容是否相等,因为这两个对象可能指向不同的地址但是存储内容一致
- 成员变量,new生成的对象存在堆(heap)里
- 局部变量存在栈(stack)里
- 直接赋值和new区别:
以String为例,String a = “a”; 这段话可能不创建对象也可能创建一个对象,因为JVM中存在一个常量池,这个常量池存放直接赋值的对象,所以这段话在常量池已经有"a"时将其地址赋予a,若没有则在池中创建一个对象再将他的地址赋予a。
String a = new String(“a”);这段话至少创建一个对象,因为使用了new关键字,至少会在堆中创建一个a的String对象,也可能创建两个对象,若"a"不在常量池中则会在池中创建一个对象“a” - 对于整形数据-128~127之间会存在常量池,其他数值都是用new生成对象
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,正确的说法是两个对象equals为true则hashCode()一定相等,两个对象equals为false但hashCode()不一定不相等。
扩展:
- HashCode的存在主要是用于提高查找的快捷性
- hash算法尽量保证每个变量算出来的hash值不同但是还是存在相同情况
- 两个对象的hashcode相同不代表两个对象就相同,只能说明这两个对象在散列存储结构中存放于同一个位置
- 在String的equals方法中,判断完两个对象地址不相同后才开始值比对
- 假如一个拥有10000个字符串的数组,现在你要插入一个不重复的字符串,这个时候最坏的情况是需要遍历所有元素,每次遍历调用equals方法,在使用hashCode后每次遍历前先对比是否hash值是否相同,相同再调用equals方法,这样大大减少了查找的时间
4. 什么是Java虚拟机?为什么Java被称为平台无关的编程语言
Java虚拟机是一个可以执行Java字节码的虚拟机进程
Java被称为平台无关的编程语言归结于不同的平台装有不同的Java虚拟机,各个平台对应的Java虚拟机能够将相同的.class文件解释成各自平台所需要的机器码
扩展
- 平台CPU和操作系统的总称
- C语言为例:VC编译出来的C语言可执行文件exe能够在windows上运行而不能在linux上运行,linux上使用gcc编译的的执行文件也不能在windows运行
5. final 有什么作用?
凡是引用final关键字的地方皆不可修改,可用于修饰类、类变量和类方法
修饰类时该类不可继承
修饰类变量时该变量赋值后不可再进行更改,子类也不能重新赋值
修饰类方法时该方法不能被重写
6. 面向对象的特征
有三大特征封装、继承、多态
封装:封装的思想保证了类内部数据结构的完整性,使用户无法轻易直接操作类的内部数据,这样降低了对内部数据的影响,提高了程序的安全性和可维护性。
继承: 提高代码复用性,选择继承你就不需要再写一个拥有相同成员变量和相同方法的类,但缺点是类的耦合性增强了,这样以后你改动父类时就需要考虑子类会不会因为改而出现问题。
多态是在有继承的情况下出现的
以下方例子说明
扩展:
多态一个简单实例
class Animal{
public void shout(){
System.out.println("...");
}
}
class Cat extends Animal {
pulic void shout(){
System.out.println("喵喵喵");
}
}
public void main(String[] args){
Animal cat = new Cat();
cat.shout(); // 输出 "喵喵喵"
}
来源:CSDN
作者:I'm bald,I'm better
链接:https://blog.csdn.net/weixin_44090559/article/details/103761123