Java中级开发工程师知识点归纳

时间:2021-03-09 16:43:23 JAVA认证 我要投稿

Java中级开发工程师知识点归纳

  为方便考生们备考java认证相关知识点,yjbys小编为同学们带来最新java认证考试知识点归纳,希望同学们好好复习!

Java中级开发工程师知识点归纳

  1.接口和抽象类的区别

  ①抽象类里可以有构造方法,而接口内不能有构造方法。

  ②抽象类中可以有普通成员变量,而接口中不能有普通成员变量。

  ③抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。

  ④抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只有public和默认类型。

  ⑤ 抽象类中可以包含静态方法,接口内不能包含静态方法。

  ⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。

  ⑦一个类可以实现多个接口,但只能继承一个抽象类。

  ⑧接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用。

  2.Java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些?

  ①程序计数器:线程私有,当前县城执行的字节码的行号指示器。

  ②虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型。

  ③本地方法栈:为虚拟机使用到的Native方法服务。

  ④Java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域。

  ⑤方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

  ⑥运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。

  ⑦直接内存:不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,容易引起OOM异常,NIO会调用,不受Java堆大小的限制。

  3.HashMap和HashTable区别?

  ①Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

  ②Hashtable的方法是同步的,而HashMap的方法不是,因此HashTable是线程安全的,但是代码的执行效率上要慢于HashMap。

  ③HashMap允许空值和空键,但是HashTable不可以。

  ④HashMap非同步实现Map接口,是一个“链表数组”的数据结构,最大承载量是16,可以自动变长,由Entry[]控制(key,value,next),hashCode()判断key是否重复。

  ⑤建议需要做同步,使用ConcurrentHashMap,降低了锁的粒度。在hashMap的基础上,ConcurrentHashMap将数据分为多个segment,默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁得几率,提高并发效率。这里在并发读取时,除了key对应的value为null之外,并没有使用锁。

  4.ArrayList和LinkedList区别?

  ArrayList基于数组实现,LinkedList基于链表实现,ArrayList增加和删除比LinkedList慢,但是LinkedList在查找的时需要递归查找,效率比ArrayList慢。关于多线程方面,如果要求线程安全的,有一个Vector,不过比较多的使用的是CopyOnWriteArrayList替代ArrayList,CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主的情况。

  5.Set接口

  ①HashSet是Set接口的典型实现,HashSet按hash算法来存储元素,因此具有很好的存取和查找性能。特点:不能保证元素的排列顺序,顺序有可能发生变化;HashSet是异步的;集合元素值可以是null;当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来确定该对象在HashSet中存储的位置。HashSet还有一个子类LinkedHashSet,其集合也是根据元素hashCode值来决定元素的存储位置,但它同时用链表来维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHashSet集合元素时,它将会按元素的添加顺序来访问集合里的元素。所以LinkedHashSet的性能略低于HashSet,但在迭代访问全部元素时将有很好的性能,因为它以链表来维护内部顺序。

  ②TreeSet是SortSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态。TreeSet不是根据元素插入顺序进行排序的,而是根据元素的值来排序的。TreeSet支持两种排序方法:自然排序和定制排序。

  ③EnumSet中所有值都必须是指定枚举类型的值,它的元素也是有序的,以枚举值在枚举类的定义顺序来决定集合元素的顺序。EnumSet集合不允许加入null元素,否则会抛出NullPointerException异常。EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象。

  ④总结:A、HashSet的性能比Treeset好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的Set时,才会用TreeSet。B、EnumSet是性能最好的,但它只能保存枚举值。

  C、它们都是线程不安全的。

  注:Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。

  关于HashSet,条目数和容量之和来讲,迭代是线性的。因此,如果迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选得太大,既浪费空间,也浪费时间。默认的初试容量是101,一般来讲,它比你所需要的要多。可以使用int构造函数来指定初始容量。要分配HashSet的初始容量为17:

  Set s=new HashSet(17);

  HashSet另有一个称作装载因数(load factor)的"调整参数(tuning parameter)"。

  区别:

  1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。

  2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.

  3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.