Java复习第一周

289 阅读8分钟

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 字长个单位。