1. Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统(Windows,Linux,macOS)的特定实现,目的是使用相同的字节码,
他们都会给出相同的结果。
2.JRE是Java运行时环境。它是运行已编译Java程序所需的所有内容的集合。包括JVM,Java类库,java命令和其他一些基础构件。
JDK除了拥有JRE的一切之外,还有编译器(javac)和工具(如Javadoc和jdb)。它可以创建和编译程序。
**
3.在java文件通过javac编译器编译成字节码文件后,JVM类加载器首先加载字节码文件,然后通过解释器逐行解释运行。但是这种方式的执行速度相对较慢。
由于有一部分方法和代码块是经常需要别调用的(也就是所谓的热点代码),所有后面引进了JIT编译器,而JIT属于运行时编译。
JIT对指定字节码进行一次编译之后,会将对应的机器码保存下来,以便下次使用.
机器码的运行效率肯定是高于Java解释器去解释字节码文件的。所有Java在将字节码文件转化成可执行文件这一过程是采用解释器$JIT的方式。
4.Java中的可变长参数实质上是一个数组
**
5.静态方法不可以调用非静态成员。
)1.静态方法属于类,在类加载时就会分配内存,可以通过类名直接访问。
而非静态成员属于实例对象,只有在对象实例化之后才存在,所以需要通过类的实例对象去访问。
)2.在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。
6.重载和重写的区别。
)1.重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理。
方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
)2.重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法。
两同两小一大。
“两同”即方法名相同、形参列表相同;
“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
7.泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型实质上是为伪泛型,因为Java在运行期间,所有的泛型信息将被擦除,也就是类型擦除。
常用的泛型通配符有T,E,K,V,?
1).? 表示不确定的 Java 类型
2).T (type) 表示具体的一个 Java 类型
3).K V (key value) 分别代表 Java 键值中的 Key Value
4).E (element) 代表 Element
8.Java 基本类型的包装类的大部分都实现了常量池技术。
Byte,Short,Integer,Long这四种包装类默认创建了数值[-128,127]的相应类型的缓存数据,Character创建了[0,127]范围的缓存数据,Boolean直接返回false或true。
9.自动装拆箱。
1).装箱:将基本类型用它们对应的引用类型包装起来
2).拆箱:将包装类型转换为基本数据类型
不必要的情况下不要进行装拆箱,会影响系统性能
10.面向对象与面向过程的区别。
面向过程性能要比面向对象更高,但是没有面向对象易维护、易复用、易扩展。
11.String不可变。
1).保存字符串的数组被 `final` 修饰且为私有的,并且`String` 类没有提供/暴露修改这个字符串的方法。
2).`String` 类被 `final` 修饰导致其不能被继承,进而避免了子类破坏 `String` 不可变。
12.StringBuilder与StringBuffer的区别。
StringBuilder和StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,
不过没有使用final和private关键字进行修饰,而且还提供了许多修改字符串的方法比如append()方法。
线程安全性:StringBuffer()对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
**
性能:每次对String类型进行修改时,都会生成一个新的String对象,然后将引用指向新的对象。StringBuffer每次都对StringBuffer对象本身进行操作。
而不是生成新的对象并改变对象引用。相同情况下StringBuilder对性能的提升不大,但是有不安全的风险。
1).操作少量的数据:使用String
2).单线程操作字符串缓冲区下操作大量数据:使用StringBuilder
3).多线程操作字符串缓冲区下操作大量数据:使用StringBuffer
13.引用拷贝、深拷贝、浅拷贝。
1).引用拷贝就是两个不同的引用指向同一个对象
2).浅拷贝会在堆上创建一个新的对象,但是对象的内容与原对象相同。
3).深拷贝不仅会创建新的对象,而且对象的内容也会重新创建。
**