:问题:
抽象:Java支持创建只有接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
抽象和封装的不同点:抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。
Iterator和ListIterator的区别是什么?
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
LinkedHashSet:改动较少时,频繁遍历时使用,它的顺序是添加进入的顺序,按添加顺序遍历。(基于链表的)
LinkedHashMap:是hashMap的子类,可以按插入的顺序遍历。(基于链表的),也可以按访问的顺序。
Array和ArrayList的不同点:数组,列表,静态,动态,任意类型,对象类型。
ArrayList和LinkedList都实现了List接口,不同点有?
ArrayList是基于动态数组的,LinkedList是基于链表的;因此ArrayList的随机读写性能大于LinkedList,而LinkedList的add(指定位置)的操作性能大于ArrayList,因为ArrayList需移动数据。若果是add到尾端,还是ArrayList效率高(不考虑扩容)。但是LinkedList的remove时除了头部元素的删除性能较好,中部的删除性能不如ArrayList,因为需随机查。
RandomAccess接口是一个标志接口,本身未提供方法,派生于RandomAccess的对象可以认为是快速随机访问的。如ArrayList,Vector。
Comparable(对象内部)和Comparator(对象外部)接口是干什么的?
Java提供了只包含一个compareTo()方法的Comparable接口。Java提供了包含compare()方法的Comparator接口。
选择Comparable接口还是Comparator?
一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。继承于他的接口主要有Set 和List.
Collections.sort( personList )
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:(必须再定义一个实现于Comparator的工具类完成对对象的排序等问题)
Collections.sort( personList , newPersonComparator())
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。
Java优先级队列(Priority Queue)?
优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头。
20:JVM永久代中会发生垃圾回收?
年轻代分为:Eden,S1,S2;
当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
当永久代(Perm)满时也会引发Full GC,会导致Class、Method元信息的卸载
System.gc()被显示调用,也会发生Full GC。
Full GC:对整个堆进行整理,包括Young、Tenured和Perm。
Perm代主要保存class,method,filed等对象,这部分的空间一般不会溢出。
GC有两种类型:Scavenge GC和Full GC。
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC。
持久代是个比较神奇的概念,应该是Hotspot虚拟机里所特有的一个代。它是方法区的一部分,按常理不应该属于堆。并且在通过jvm参数设定各个区域大小的时候,可以很明显的发现持久代和堆的大小是需要分别指定的,两者不是一个整体。
java8之后 Hotspot 虚拟机从堆中彻底删除了永久代。
—把方法区中的String和静态变量移到了堆中。
—把其他的东西(比如类结构)放到了本地内存中,JVM会直接负责这部分的内存回收。