继续以完成第三方帐号绑定

gitee
你已通过 QQ 授权,完善以下登录信息即可完成绑定

1、JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。JRE包含了我们运行代码需要的虚拟机,也就是JVM

2、String,StringBuffer,StringBuilder区别

  String StringBuffer StringBuilder
是否可变 String类包含hash和vlaue数组,value数组是final类型的,所以不可变 可变 可变
是否线程安全 不可变,安全 方法都加了synchronized,安全 方法没有加synchronized,不安全的

3、intern方法的作用

JDK6及以前调用String.intern()
若常量池中有,则返回常量池中这个字符串的引用
若常量池中没有,则拷贝一份对象,放到常量池(永久代)中;返回值是常量池(永久代)中对应字符串实例的引用。
JDK7及以后调用String.intern()
若常量池中有,则返回常量池中这个字符串的引用
若常量池中没有,则拷贝一份引用,放到常量池(堆)中;(JDK1.7将String常量池从Perm区移动到了Java Heap区)

4、String的字符数据真的没办法修改吗

可以使用反射
String s = "tiger";
Field f = s.getClass().getDeclaredField("value");
f.setAccessible(true);
f.set(s, new char[]{'k', 'e', y'});
这样修改value属性的访问权限就可以修改了

5、static可以修饰哪些内容?

1、可以修饰成员变量,可以直接用类调用变量

2、可以修饰成员方法,可以直接用类调用方法

3、可以修饰代码块,当类加载器载入类的时候执行,只会执行一次

4、可以修饰内部类,可以直接调用内部类

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属性赋值的区别

final修饰的属性,在实例创建的时候才会赋值。
static修饰的属性,在链接阶段的准备阶段赋初值,初始化阶段赋值。
static+final修饰的String类型或基本类型,JVM规范是在初始化阶段赋值,但是HotSpot VM在准备阶段就赋值了。
static+final修饰的其他类型,跟单纯static修饰(第2种)的流程是一样的。

8、静态方法不能访问非静态方法和变量

静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接去访问。非静态成员(变量和方法)属于类的对象,只有该对象实例化之后才存在,然后通过类的对象去访问。

加载阶段的第2步(将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构)会将所有static修饰的内容(包括静态属性、静态代码块、静态方法等)转为方法区的运行时数据结构,但此时非静态的方法和变量根本没经过初始化(没有内存),所以会失败。

9、类加载过程的线程安全吗?

Java类的加载和初始化过程都是线程安全的。具体原因如下: 加载 类加载整个过程是线程安全的,因为loadClass方法内有synchronized。 初始化 虚拟机会保证一个类的()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。

10、异常/Exception--类型

Error 和 Exception 都是Throwable的子类

Error是指一些是程序不正常不可恢复的错误,比如内存溢出,虚拟机错误,死锁等。

Exception是指异常,分为编译异常和运行时异常。

编译异常意思就是编译的时候压根就不通过,比如类不存在,属性不存在,方法不存在

运行时异常表示可以编译通过,但是程序跑的过程中会报错,比如空指针,数组下标溢出等

11、try/catch/finally的return顺序

返回值主要看finally里面有没有return,有的话返回finally里面的返回值

如果finally里面没有return,就看try有没有报错,报错了就返回catch里面的返回值,没有报错就返回try里面的返回值

12、字节流与字符流的区别

  字节流 字符流
基本单位 字节 字符
存在位置 存在于文件、内存中,硬盘上的所有文件都是以字节形式存在的 只存在于内存中
是否使用了缓冲
场景 适合操作文本文件之外的文件,比如视频图片等 适合操作文本文件
相关类 InputStream,OutputStream Reader,Writer

当然BufferedInputStream,BufferedOutputStream等也可以缓存,自己内部实现的

13、BIO、NIO、AIO--区别

  BIO NIO AIO
JDK版本 所有版本 JDK1.4及以后 JDK1.7及以后
异步/阻塞 同步阻塞。一个连接一个线程,从请求发起开始线程就一直阻塞指导操作完成

同步非阻塞。

一个请求一个线程。发送的请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时地询问IO操作是否就绪,这要求用户进程不停地去询问

异步非阻塞。

一个有效请求一个线程。用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行时机的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了

使用场景   连接数目多但是连接时间比较短的操作,例如:聊天服务器 连接数目多并且连接时间比较长

14、JAVA8中接口里面的default和static

jdk8之前interface里面只能放接口,jdk8之后用default修饰的接口可以拥有自己的方法体,在里面放一些自己的实现。

但是如果类如果继承了两个接口,两个接口都有同样名称的default方法,会报错,除非在里面将方法重写。

static也是用来修饰非抽象方法的,和以前的用法一样,调用的时候可以直接用 接口名+方法名 来进行调用

15、接口与抽象类的区别

  抽象类 接口
继承与实现 子类使用extends关键字来继承抽象类。只能继承一个抽象类 子类使用implements来实现接口
构造方法 可以有构造方法 不能有构造方法
普通方法 允许有普通方法 除了用default和static定义非抽象方法,其他都是抽象的
成员变量 允许有成员变量 只允许有常量(public static final类型)
访问修饰符 抽象方法可以是public,protected 抽象方法只能是public,默认为public abstract
main方法 可以有main方法 没有main方法
Top