1.JVM、JDK 、JRE分别是什么?

JVM:运行 Java 字节码的虚拟机
JDK:java开发工具包,包含jre
JRE:Java虚拟机和Java程序所需的核心类库等

2.Java语言有哪些特点?

跨平台性,一次编译,到处运行
面向对象(封装,继承,多态)
支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

3.Java有哪些数据类型?

基本数据类型
数值型
整数类型(byte,short,int,long)
浮点类型(float,double)
字符型(char)
布尔型(boolean)
引用数据类型
类(class)
接口(interface)
数组([])

4.switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

5.用最有效率的方法计算 2 乘以 8?

2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

6.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

12;-11 四舍五入的原理是在参数上加 0.5 然后进行下取整。

7.float f=3.4;是否正确?

不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,
因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。

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

对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。
而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。

9.访问修饰符

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public : 对所有类可见。使用对象:类、接口、变量、方法

10.Java 有没有 goto关键字?

goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。

11.final关键字有什么用?

用于修饰类、属性和方法;
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

12.浅谈final修饰的变量?

关于非静态成员变量赋值:
1.直接赋值 2.构造代码块赋值 3.构造方法赋值 一句话总结:赋值需要在创建对象之前
关于静态成员变量赋值:
1.直接赋值 2.静态代码块赋值
局部变量:
1.直接赋值 2.先声明后赋值

final只能保证引用永远指向固定对象,不能保证那个对象的状态不变

13.final finally finalize区别?

final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表
示该变量是一个常量不能被重新赋值。
finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块
中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调
用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的
最后判断。

14.this关键字的用法?

this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
this的用法在java中大体可以分为3种:
1.普通的直接引用,this相当于是指向当前对象本身。
2.形参与成员名字重名,用this来区分:this.name = name;
3.引用本类的构造函数 this(name),必须在构造函数中使用

15.super关键字的用法?

super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
super有三种用法:
1.普通的直接引用
2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分
3.引用父类构造函数

16.static存在的主要意义?

static的主要意义:
在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法!
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

static的独特之处:
1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
2.在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
3.static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!
4.被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

static注意事项:
1、静态只能访问静态。
2、非静态既可以访问非静态的,也可以访问静态的。

17.break ,continue ,return 的区别及作用?

break 跳出总上一层循环,不再执行循环(结束当前的循环体)

continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

18.在 Java 中,如何跳出当前的多重嵌套循环

使用:标志

public static void main(String[] args) {
ok:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println(“i=” + i + “,j=” + j);
if (j == 5) {
break ok;
}
}
}
}

19.重写与重载?

构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

20.== 和 equals 的区别是什么?

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

21.两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对,但是两个对象值相等,哈希码肯定是相等的。

为什么要有hashcode?
我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。
如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

22.为什么 Java 中只有值传递?

按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

23.JDK 中常用的包有哪些?

java.lang:这个是系统的基础类;
java.io:这里面是所有输入输出有关的类,比如文件操作等;
java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
java.net:这里面是与网络有关的类;
java.util:这个是系统辅助类,特别是集合类;
java.sql:这个是数据库操作的类。

24.BIO,NIO,AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

25.什么是反射机制?

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

26.反射机制优缺点?

优点: 运行期类型的判断,动态加载类,提高代码灵活度。
缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。

27.反射机制的应用场景有哪些?

反射是框架设计的灵魂。
①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:
1) 将程序内所有 XML 或 Properties 配置文件加载入内存中;
2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息;
3)使用反射机制,根据这个字符串获得某个类的Class实例;
4)动态配置实例的属性

28.Java获取反射的三种方法?

1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制

29.什么是字符串常量池?

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,
在创建字符串时 JVM 会首先检查字符串常量池,
如果该字符串已经存在池中,则返回它的引用,
如果不存在,则实例化一个字符串放到池中,并返回其引用。
例子:String str=new String(“aaa”);代码创建两个对象
String str=”i”与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str=”i”的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

30.String有哪些特性?

不变性:String 是只读字符串,是一个典型的 immutable 对象,
对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。
不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。

常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,
如果下次创建同样的对象时,会直接返回缓存的引用。

final:使用 final 来定义 String 类,表示 String 类不能被继承,
提高了系统的安全性。

31.String为什么是不可变的吗?

简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下图所以:
private final char value[];
1) String不可变但不代表引用不可以变
String str = “Hello”;
str = str + “ World”;
System.out.println(“str=” + str);
实际上,原来String的内容是不变的,
只是str由原来指向”Hello”的内存地址转为指向”Hello World”的内存地址而已,
也就是说多开辟了一块内存区域给”Hello World”字符串。

32.如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse()方法。

33.Integer a= 127 与 Integer b = 127相等吗?
相等
对于对象引用类型:==比较的是对象的内存地址。
对于基本数据类型:==比较的是值。
如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false

34.Error 和 Exception 区别是什么?

Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,
JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;

Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。

35.运行时异常和一般异常(受检异常)区别是什么?

运行时异常包括 RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。 Java 编译器不会检查运行时异常。
非运行时异常必须要抛出,比如sql异常,IO异常

36.JVM 是如何处理异常的?

在一个方法中发生异常,会创建一个异常对象,一步步抛出给JVM。可能有一系列的方法调用,最终才进入抛出异常的方法,
这一系列方法调用的有序列表叫做调用栈。

37.throw 和 throws 的区别是什么?

throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。
而throw则是指抛出的一个具体的异常类型。

38.try-catch-finally 中哪个部分可以省略?

可以省略catch或者finally。catch和finally不可以同时省略

39.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行,在 return 前执行;

40.NoClassDefFoundError 和 ClassNotFoundException 区别?

NoClassDefFoundError 是一个 Error 类型的异常,是由 JVM 引起的,不应该尝试捕获这个异常。
ClassNotFoundException 是一个受查异常,需要显式地使用 try-catch 对其进行捕获和处理

41.try {

throw new ExampleB(“b”)

} catch(ExampleA e){

System.out.println(“ExampleA”);

} catch(Exception e){

System.out.println(“Exception”);

}

请问执行此段代码的输出是什么?

输出:ExampleA。(根据里氏代换原则[能使用父类型的地方一定能使用子类型],
抓取 ExampleA 类型异常的 catch 块能够抓住 try 块中抛出的 ExampleB 类型的异常)

42.常见的 RuntimeException 有哪些?

ClassCastException(类转换异常)
IllegalArgumentException - 传递非法参数异常
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
ArithmeticException:数学计算异常。
还有IO操作的BufferOverflowException异常