jvm 、 jre 、 jdk 有什么区别
jdk = jre + 编译工具 + 开发工具 ;jre = jvm + 核心类库
访问修饰符有哪些
public > protected > default > private
final、finally、finalize的区别
final: 类、方法、变量 finally: 异常语句中 finalize: gc启动,对象被回收的时候调用
static静态方法能不能引用非静态资源
不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。
讲讲面向对象三大特性
封装、继承、多态
java是如何实现多态的
运行时多态: 3个必要条件
重载和重写的区别是什么
- 重写发生在子类与父类之间,方法名和参数都一样
- 重载是在一个类里面,方法名一样,参数不一样
重载的方法能不能根据返回值区分
不能,因为调用时并不能指定返回值类型,编译器不能区分你要调用的是哪一个函数
抽象类和接口的区别
- 方法实现细节
- 成员变量
- 静态代码块和静态方法
- 继承: 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
java创建对象有几种方式
- new
- copy
- serial
- 反射
什么是不可变对象,好处是什么?
不可变对象指对象一旦被创建,状态就不能再改变,任何修改都会创建一个新的对象,如String、Integer及其它包装类,不可变对象最大的好处是线程安全
值传递和引用传递的区别
- 值传递:指的是在方法调用时,传递的参数是值的拷贝,也就是说传递后就互不相关了。
- 引用传递:指的是在方法调用时,传递的参数是引用地址,也就是说传递前和传递后都指向同一个引用。
== 和 equals的区别
- == :比较的是基本类型,判断基本类型的值是否相等,用于引用类型,判断两个引用的地址是否相等
- equals: 主要用于两个对象之间,判断一个对象是否等于另一个对象是否相等,两种情况:
- 没有复写equals() 方法, 等价于 ==
- 重写了equals()方法
规范要求equals方法具有以下特性:
- 自反性
- 对称性
- 一致性
- 传递性
为什么重写equals方法,必须重写hashcode方法?
因为Hash比equals方法的开销要小,速度更快,所以在涉及到hashcode的容器中(比如HashSet),判断自己是否持有该对象时,会先检查hashCode是否相等,如果hashCode不相等,就会直接认为不相等,并存入容器中,不会再调用equals进行比较。
这样就会导致,即使该对象已经存在HashSet中,但是因为hashCode不同,还会再次被存入。 因此要重写hashCode来保证: 如果equals判断是相等的那hashCode值也要相等。
String、StringBuilder、StringBuffer的区别是什么?
是否可变 是否线程安全
String为什么设计成不可变的?
- 便于实现字符串池
- 使多线程安全
- 避免安全问题
- 加快字符串处理速度
什么是字符串常量池?
java中常量池的概念主要有3个
全局字符串常量池 , class文件常量池 , 运行时常量池
定义 jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用, 如果不存在,初始化,并将该字符串放入字符串常量池中。 字符串常量池的位置也是随着jdk版本的不同而位置不同。在jdk6中,常量池的位置在永久代(方法区) 中,此时常量池中存储的是对象。在jdk7中,常量池的位置在堆中,此时,常量池存储的就是引用了。 在jdk8中,永久代(方法区)被元空间取代了。
包装类型是什么?基本类型和包装类型有什么区别?
装箱、拆箱 区别三: null,范型,效率
int 和 Integer的区别
包装类、new、引用、null
Integer变量和int变量对比
拆包、相等
两个new生成的Integer变量对比
非new生成的Integer变量和new Integer变量对比
两个非new生成的Integer变量对比
什么是反射
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
书栈
这种通过Class实例获取class信息的方法称为反射
反射的本质 - csdn
java类加载:java类加载就是类加载器根据类的全限定名把.class的二进制字节码代表的静态存储结构转化为方法区的运行时数据结构,然后在内存中生成代表该类的Class对象,一个类有且只有一个Class对象。每次生成Java对象实际上都是通过这个Class对象获取整个类的结构并生成相应的java对象。(接口和抽象类也会被加载为class对象)
所以如果能够在运行时拿到Class对象,就可以生成java对象并进行调用,这就是java反射的本质。
为什么需要反射 - csdn
- 情景一:不得已而为之
- 调用的是网络的.class文件
- 注解
- 情景二:动态加载
- 动态代理
- 情景三:避免将程序写死到代码里
- 根据配置文件加载不同的类,而不需要重新编译
反射的缺点 - csdn
- 性能开销
- 破坏了封装性
- 内部曝光
java中的范型是什么
范型就是将类型参数化,其在编译是才能确定具体的参数。这种参数类型可以用在类、接口、方法的创建中,分别成为范型类,范型接口,范型方法。
使用范型的好处是什么
Object
如果使用 Object 来实现通用、不同类型的处理,有这么两个缺点:
- 每次使用时都需要强制转换成想要的类型
- 在编译时编译器并不知道类型转换是否正常,运行时才知道,不安全。
对比Object
- 类型安全
- 不需要强制类型转换
- 潜在的性能收益
原理
类型擦除
java序列化和反序列化是什么
序列化是指把java对象转换为字节序列的过程,而反序列化是指把字节序列恢复为java对象的过程
两种序列化serializable 和 externalizable 的对比
存储信息、实现方法、性能
Error 和 Exception 区别是什么
Exception 和 二者都是 throwable 的子类,各自都包含大量子类。
- Exception 程序本身可以处理的异常,可以通过 catch 来进行捕获,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。 又可以分为运行时异常(runtimeExceiption 又叫非受检查异常)和非运行时异常(又叫受检查异常)。
- Error: 属于程序无法处理的错误 ,我们没办法通过 catch 来进行捕获 。例如,系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,一旦这类错误发生,通常应用程序 会被终止,仅靠应用程序本身无法恢复。
常见的异常有哪些
ERROR: 内存不足,堆栈溢出,违法访问,实例化错误
Exception: 类造型异常,找不到类异常,算术条件异常,数组索引越界异常,索引越界异常,实例化异常,属性不存在异常,方法不存在异常,空指针异常,数字格式异常,字符串索引越界异常