0920Java面试知识点准备

  1. 集合中哪些是线程安全,哪些不是线程安全的?

常见的集合如LinkedList+ArrarList+HashMap集合都是线程不安全的吗,通过查看集合中的成员方法可以看到没有添加synchronzied关键字.而线程安全的集合由Vector+HashTable,这2个集合中的成员方法添加了synchronzied关键字.同时还有一些CorruentHashMap等线程安全集合这里暂不做复述。

  1. ArrayList集合的内部实现原理?
    ArrayList集合内部的底层实现原理实际上就是一个可变长度的对象数组.
    通过向集合中添加元素或删除元素的同时,根据内存存储对象的数组长度与添加元素的长度进行对比判断,得出是否需要对对象数组进行扩容的依据.而ArrayList集合的删除元素方法是通过获取对象元素在对象数组中的位置,通过移动元素后面的对象移动到删除元素的位置上而实现的,同时将空出来的数组位置 设置为null,让GC垃圾回收期进行回收.同时ArrayList集合类继承了AbstractList类,并且实现List+RandomAccess+Servial接口,这样得以实现随机访问的原理.其中包含4个常量+3个变量.主要是序列化id,默认数组长度10,构造方法使用的默认空对象数组,空对象数组. 修改次数+对象数组存储位置+集合大小.数组对象存储在堆中,是一段连续的内存空间.每一个数组元素的下标都是知道的,是首地址+首地址*下标大小.但是对于插入元素来讲,需要移动前面或者后面元素的位置.所以总的来讲动态数组集合存在查询块,插入删除慢的特点.

  2. java中获取反射类的三种方式?反射主要应用于哪些方面?
    类名.class/this.getClass()/Class.ForName(“包名路径”)
    反射的目的主要是能够动态的获取加载到内存空间中的实例类文件,能够对类中方法和变量进行操作.反射能够获取到实例类中的成员变量及方法,主要通过Class类来实现.另外有一个@Annotation注解就是通过 创建一个@interface接口,添加自定义属性或者方法,然后在需要的地方结合注解 对方法 或者变量进行控制.

  3. HashMap集合的内部结构?
    数据+链表+红黑树。HashMap集合中的底层数据结构是数组+链表+红黑树.
    数组下标存储着链表的头结点,当链表中数量大于8的时候会将链表转换为红黑树,这是jdk1.8之后新增的一个特性.

    数组:在堆内存空间一段连续的内存空间,数组元素的位置都是已知的。下标位置=下标位置+下标位置*数组下标.所以查询效率很高,但插入或者删除元素需要调整其他数组元素的位置,所以较慢.

链表:在堆内存空间中不连续的一端存储区域.每一个节点至少存在着当前节点的位置以及下一个节点的位置.这样在查询的时候就需要从头开始遍历出所有元素的位置.所以查询效率很慢.但是在插入或者删除元素的时候,只需要考虑当前节点及前面节点的下一个节点位置即可。

HashMap集合中存在着Node<K,V>[] table哈希桶数组,说白了就是HashMap结构中的数组,Node<K,V>就是HashMap中的单链表结构,是集合中的静态内部类,实现Map.Entry<K,V>结构,存储着K,V键值对,hash数组下标的位置,以及下一个链表的位置.正式因为Hash集合存在着哈希碰撞,也就是不同的key可能产生想用的hashCode值,导致一个Node<K,V>哈希桶数组下标位置上需要放2个元素,那么就需要利用元素挂载在单链表上,如果超过8个采用红黑树结构. 数组扩容的原理其实就是当声明HashMap集合的时候有一个threhold最大容量长度,默认为16,当超过默认负载因子0.75,也就是12个的时候,就会调用resize()方法进行集合扩容。

  1. 关于时间复杂度的O(1)和O(n)的理解?
    拿List举例子,就是LinkedList集合增删快,查询慢.所以增删时间复杂度为O(1),
    查询复杂度为O(n)。而ArrayList集合查询快,增删慢.所以查询复杂度为O(1),
    增删复杂度为O(n)。简而言之就是复杂度高的是O(n),简单的是O(1)。

  2. java类加载机制底层实现原理?参考链接地址
    java类加载机制主要由3个过程,目的在于将类加载到jvm内存中.包含加载、连接、初始化.连接又包含3个过程,验证,准备,解析三个过程.
    加载: 将class文件加载到jvm内存中,称为类加载,类加载器由jvm提供.加载过程会为该类创建一个java.lang.Class对象,这也就是使用反射的前提条件.由jvm提供的加载器称为系统加载器.当然开发者也可以通过继承ClassLoader类来创建自己的类加载器.类加载器我无需等到该类使用的时候才加载,java虚拟机允许预先加载某些类.

    **连接:**当jvm将class文件加载到类中,生成一个class对象后,进入到连接阶段,连接阶段的过程包含 验证 准备 解析三个过程,主要目的是将类的二进制数据加载到jre中(java运行环境中).
    验证:主要用于检查类内部是否存在正确的内部构造.(java语言相对于c++语言来讲是安全语言,主要是因为java语言会有这个阶段,比如数组越界的问题).主要目的在于防止class文件的内部字节流内容不会对jvm虚拟机造成损害.主要包含4种验证:文件格式验证/元数据验证/字节码验证/符号引用验证.
    准备:连接的准备阶段主要为类的静态变量分配内存,设置默认的初始值.
    解析:将二进制数据中的符号引用转换为直接引用.符号引用是指任何字面量的引用,而直接引用适用于指向事物的指针.

    **初始化:**为类的静态变量设置正确的初始值.类似private static int a=10;
    在准备阶段将类的静态变量设置为0,而在初始化阶段是设置正确的初始值10,所以本质上是没有冲突的.

大致流程是这样的.java 编译器将java文件编译成class文件–》通过jvm提供的系统类加载器将classs文件加载到内存中,同时为每一个类创建一个Class类对象—>进入链接阶段,主要是将内存中的class文件转换为二进制数据放到jre环境中去—>验证二进制数据内部结构是否正确,如果出现不正确的结构如数组越界提示出来—>准备,为类中静态变量分配空间,并设置默认初始值–>解析,主要是将里面的符号引用转换为直接引用.–>初始化,将类中的静态变量设置正确的初始值.
在这里插入图片描述

  1. 类加载的时机?
    1.创建一个类的实例,也就是new一个对象
    2.访问类的静态变量
    3.访问类的成员方法
    4.实例化子类对象时首先需要加载父类
    5.Class.forName获取类
    说白了无非就是用到类的属性或方法的时候,或者在创建类实例的时候,会加载类.

  2. 类加载器分为哪几种?
    类加载的过程主要是将class文件加载到jvm内存中.并为类生成一个java.lang.Class类对象.java中用全限定名去区分不同的类.而jvm中则需要通过全限定名+类加载器去区分不同的类.因为不同的类加载器所加载的类是不通用的.比如pg包下的Person类,通过kl加载器加载,那么该class对象在jvm中的标识就是Person.pg.kl.

jvm中有3种预定的类加载器,当jvm启动的时候,会使用到下面三种类加载器.
根类加载器:主要用于加载java中的核心代码包.比如java_home下面jre文件下的rt.jar包(bootstrap loader).
扩展加载器;主要用于加载jre的扩展目录(extention loader).
系统类加载器:负责加载classpath路径下的class文件.一般来讲没有特别声明的都是通过该加载器加载的(system class loader).

  1. java中类加载机制有哪些?
    类加载的目的是将class文件加载到内存中.常见的类加载机制包含全盘加载,双亲委派,缓存机制.
    全盘负责:指的就是当使用类加载器去加载某个类文件并生成class对象时,该类的父类或者引用都由当前这个类加载完成.

双亲委派:双亲委派加载机制主要指的是当加载一个类的时候首先尝试使用该类的父类加载器去加载当前类,只有当父类加载器无法使用的时候,才使用当前的类加载器去加载当前类.

缓存机制: 缓存机制指的是只要加载过的类,都会被放入缓存.当一个class类需要被加载的时候,首先判断缓存中是否存在该class类,如果不存在再调用类加载器进行加载并缓存起来,方便下次的使用.这就是为什么修改了class文件后,需要重启jvm的原因了.因为该类已经被缓存起来了,下次使用还是用的缓存的,所以需要重启.

双亲委派机制的原理及优势?
双亲委派类加载机制主要是当需要加载当前类的时候,首先判断该父类加载器是否能够加载当前类,当然如果该父类还有上级,首先到最上级 然后依次递归到当前类,如果父类类加载器都没有办法,那么说明需要子加载器自己去想办法.

优势在于如果一个类被多次使用或者在不同的地方如静态变量或者讲台方法等需要类加载的时候,被多次加载那肯定不好的,所以双亲委派当该父类加载器加载之后,便不会在进行加载.其次是考虑到安全问题,类加载器加载类如果是java中的核心类如java.lang.Integer的话,那么如果网络上传一个同样的类,当发现该类已经被加载 便不会重新加载.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章