JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。JRE包含了我们运行代码需要的虚拟机,也就是JVM
2、String,StringBuffer,StringBuilder区别
3、intern方法的作用
4、String的字符数据真的没办法修改吗
5、static可以修饰哪些内容?
6、类加载过程
类的加载过程:加载=》链接(验证+准备+解析)=》初始化 =》使用=》卸载
1、加载(主要就是将java文件转为class文件)
通过类的全限定名(/连接的类路径)获取定义此类的二进制字节流
将这个字节流代表的静态存储结构转换为方法区的运行时数据结构
在内存中生成一个代表这个类的Class对象作为这个类的访问入口
2、链接(给静态变量赋初始值,符号引用替换成直接引用,意思就是加载的时候不知道引用对象的具体地址,只是用符号来代替,直接引用就是知道了内存中的具体的地址,将他替换掉)
2.1、验证
检查载入的class文件数据是否正确
2.2、准备
给类变量也就是静态变量分配内存,并且给他们设置初始值,这里有个特例,如果是static final类型的基本类型就直接赋值为最终的值
2.3、解析
将常量池中的符号引用替换成直接引用,能够替换成直接引用说明内存中被引种的目标已经存在了
3、初始化
执行类变量的赋值动作和静态代码块的执行 优先级 静态=》父类=》子类
4、使用
如果是第一次创建类的对象,就要执行初始化操作
在堆里面为对象属性分配空间,赋默认值
给实例变量赋值,执行初始化语句块
执行构造函数,检查有没有父类,有父类先执行父类的构造函数
执行本类的构造函数
另外=》对类初始化的场景
虚拟机规范严格规定: 有且只有 5 种情况 必须立即对类进行初始化(加载、验证、准备自然需要在之前执行):
遇到 new 、getstatic、putstatic 或 invokestatic 这 4 条字节码指令时,若没有对类进行初始化,则要先触发其初始化。
这4个指令含义是:使用 new 新建一个 Java 对象,访问或者设置一个类的静态字段,访问一个类的静态方法。
使用 java.lang.reflect 包的方法对类进行反射调用的时候,如果类没有进行初始化,则需要先触发其初始化。
当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
当虚拟机启动的时候,用户需要指定一个需要执行的主类(包含 main 方法的那个类),虚拟机会先初始化这个类。
当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。
7、static与final属性赋值的区别
8、静态方法不能访问非静态方法和变量
9、类加载过程的线程安全吗?
10、异常/Exception--类型
11、try/catch/finally的return顺序
12、字节流与字符流的区别
13、BIO、NIO、AIO--区别
BIO | NIO | AIO | |
JDK版本 | 所有版本 | JDK1.4及以后 | JDK1.7及以后 |
异步/阻塞 | 同步阻塞。一个连接一个线程,从请求发起开始线程就一直阻塞指导操作完成 |
同步非阻塞。 一个请求一个线程。发送的请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时地询问IO操作是否就绪,这要求用户进程不停地去询问 |
异步非阻塞。 一个有效请求一个线程。用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行时机的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了 |
使用场景 | 连接数目多但是连接时间比较短的操作,例如:聊天服务器 | 连接数目多并且连接时间比较长 |