1. 简述JDK
JDK(Java Development Kit)即Java开发工具包,是一个编写Java应用程序的开发环境。
JDK是整个Java的核心,包括了Java运行环境JRE(Java Runtime Envirnment、Java工具(javac/java等)和Java基础的类库(即Java API 包括rt.jar)。
jdk1.8目录包含:
bin:一堆exe文件,可执行的开发工具。例如:jconsole、javac、java、javadoc。
jre:java运行环境,包括JVM+Java基础&核心类库。 lib:包含dt.jar+tools.jar的常用类库,开发依赖包。
db:jdk从1.6之后内置了Derby数据库,它是是一个纯用Java实现的内存数据库,属于Apache的一个开源项目。用Java实现的,所以可以在任何平台上运行;另外一个特点是体积小,免安装,只需要几个小jar包就可以运行了。
include:java和JVM交互用的头文件。
2. 简述JRE
JRE(Java Runtime Environment)支持Java程序运行的标准环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)。包括了JVM的标准实现以及Java基础&核心类库。
JRE=JVM+Java基础&核心类库。
jre1.8目录包含:
bin:有java.exe但没有javac.exe,无法编译Java程序,但可以运行Java程序,可以把这个bin目录理解成JVM。
lib:Java基础&核心类库,如rt.jar,也包含JVM运行时需要的类库。
3. 简述JVM
JVM(Java Virtual Machine),即Java虚拟机,运行在操作系统之上,存在于内存中,与内存打交道,与硬件没有直接交互,是Java语言实现跨平台的核心。
JVM主要负责运行Java编译器编译后的字节码文件(*.class文件)。JVM在执行字节码时,把字节码解释成具体平台上的机器码执行。JVM自己无法执行,必须要联合JRE中的Java基础&核心类库才能使用。这就是Java的能够“一次编译,到处运行”的原因。
JVM是一种抽象,虚拟出来的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域,它负责执行指令,还要管理数据,内存和寄存器,指令集,寄存器,类文件的格式,栈,垃圾回收堆,存储区等。
4. JDK、JRE、JVM三者的有什么联系和区别
- JDK=JRE+工具
- JRE=JVM+各种类库
- JDK>JRE>JVM

5. 简述Java程序编译和运行的过程
1)编译
JVM中的java编译器将.java文件编译为.class文件。编译类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类, 然后引用。如果java编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件, 就会报"Cant found sysbol"的异常错误。
2)运行
java类运行的过程大概分为两个步骤:(1)类的加载 (2)类的执行。JVM并不是在运行时就会把所有使用到的类都加载到内存中,而是用到时才会加载进来,而且只加载一次。

6. 八种基本数据类型
| 序号 | 数据类型 | 位数 | 默认值 | 取值范围 |
|---|---|---|---|---|
| 1 | byte(位) | 8 | 0 | -2^7 - 2^7-1 |
| 2 | short(短整数) | 16 | 0 | -2^15 - 2^15-1 |
| 3 | int(整数) | 32 | 0 | -2^31 - 2^31-1 |
| 4 | long(长整数) | 64 | 0 | -2^63 - 2^63-1 |
| 5 | float(单精度) | 32 | 0.00 | -2^31 - 2^31-1 |
| 6 | double(双精度) | 64 | 0.00 | -2^63 - 2^63-1 |
| 7 | char(字符) | 16 | 空 | 0 - 2^16-1 |
| 8 | boolean(布尔值) | 8 | false | true、false |
7. &和&&的区别
&&:逻辑与,两True才为True,一False即为False。即:两真才为真,一假即为假。
& :逻辑与,两True才为True,一False即为False。即:两真才为真,一假即为假。
区别:
表达式(1) && 表达式(2),只有表达式(1)为True时,表达式(2)才会执行。
表达式(1) & 表达式(2),无论表达式(1)为True或False,表达式(2)都会执行。
8. float型float f=3.4是否正确
不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 或float f = 3.4f。在java里面,没小数点的默认是int,有小数点的默认是 double; int转成long 系统自动作没有问题,因为后者精度更高double转成float就不能自动做了,所以后面的加上个 f。
9. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
对于short s1=1; s1=s1+1;
由于s1+1运算的时候会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时候,编译器件将报告需要强制转换类型的错误。
对于short s1=1; s1+=1;
由于+=是java规定的运算符,java编译器会对它进行额外的强制转,因此可以正确编译。
10. int 和 Integer 有什么区别
- int是基本数据类型,Integer是引用数据类型;
- int默认值是0,Integer默认值是null;
- int类型直接存储数值,Integer需要实例化对象,指向对象的地址。
11. 在JAVA中,如何跳出当前的多重嵌套循环
第一种,使用带有标号的的break语句
here:
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
if (2 == j & 2 == i) {
break here;
}
}
}
第二种,外层的循环条件收到内层的代码控制限制
Boolean state = true;
for (int i = 1; i <= 4 && state; i++) {
for (int j = 1; j <= 4 && state; j++) {
if (2 == j & 2 == i) {
state = false;
}
}
}
第三种,使用try/catch强制跳出循环
try {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (2 == j & 2 == i) {
throw new Exception();
}
}
}
} catch (Exception e) {
System.out.println(a3+b3);
}
12. 详解Java的main函数
public static void main(String[] args)
public
public可访问权限最高,如果要是private那就没得玩了。
static
static变量不依赖于类的任何实例,只要类被加载(加载不等于实例化),jvm就可以直接找到他们而不需要创建关于类的任何对象。
void
与C系语言不同的是,java语言默认都是正常状态结束。也就是System.exit(0),异常结束是1。所以,java的主方法自然没有必要存在返回值,也就是void。
main
沿袭C系列main命名的主函数
String[]
接收参数
args
约定俗成
13. return 、break和continue的区别和作用
- return的功能是结束一个方法,不管这个return处于多少层循环之内,直接结束整个方法。
- continue的功能和break有点类似,区别是continue只是中止本次循环,接着开始下一次循环。而break则是完全中止循环。
- break用于完全结束一个循环,跳出循环体,开始执行循环之后的代码。
break不仅可以结束其所在的循环,还可结束其外层循环。此时需要在break后紧跟一个标签,这个标签用于标识一个外层循环。Java中的标签就是一个紧跟着英文冒号(:)的标识符。且它必须放在循环语句之前才有作用。
14. 异或运算符
一个数与0异或,值为这个数
互换两个变量的值,满足最低的空间复杂度.
示例:a = 5, b = 3
第一步:a = a ^ b; 6 = 5 ^ 3; 0101 异或 0011 = 0110
第二步:b = a ^ b; 5 = 3 ^ 6; 0011 异或 0110 = 0101
第三步:a = a ^ b; 3 = 6 ^ 5; 0110 异或 0101 = 0011
结果:a = 3; b = 5
获取数组中不重复数字。假设数组中非重复值,仅有一个。满足最低的空间复杂度
根据上个函数结论:两个相同的值异或值为0,a ^ 0 的值为 a(自然数)。可以使用^运算符解决。
15. 位运算应用
判断一个数是否是奇数 a & 1 == 1;
特点:最低位为1.
a & 1 == 1;
判断一个数是否是2的n次幂?
2^n:因子都是2;
时间复杂度:logn;
能否在常量时间复杂度内, 判断一个数是否是2的n次幂。
2^n的存储特点:只有一个1,后面全部是0.
(a & (a - 1)) == 0
用最有效率的方式求2 * 8的值 2 << 3;
<< 左移: 低位补0,高位丢弃
>> 右移: 高位补符号位, 低位丢弃
>>>无符号右移: 高位补0,低位丢弃
注意事项;
左移:左移n个单位,相当于乘以2^n;
右移: 右移n个单位,相当于除以2^n;
对于移位运算符来说,当操作数超出了字长时,实际移动 n mod 字长个单位。