-
ArrayList , Vector , LinkedList关系与区别?
a. ArrayList , Vector , LinkedList都属于List接口常用子类,其中ArrayList , Vector基于数组实现,LinkedList基于链表实现。
b. ArrayList采用懒加载策略,在构造方法阶段不初始化对象数组,在添加元素时才初始化对象数组(默认为10),扩容为原先数组的1.5倍,采用异步处理,线程不安全,性能较高。
在频繁查找以及尾部的插入与删除场景下使用ArrayList。
c. Vector当产生对象时就初始化内部数组(默认为10),扩容为原先数组2倍,采用synchronized同步方法,线程安全,性能很低(读读互斥)。
d. LinkedList采用异步处理,线程不安全。
频繁在任意位置进行元素插入与删除使用LinkedList。 -
jcf中fail-fast?fail-safe
什么是快速失败策略?
优先考虑出现异常的情况,当异常产生时,抛出异常,程序终止。
ConcurrentModificationException发生在Collection集合使用迭代器遍历时,使用了集合类提供的修改集合内容方法报错。而如果使用Iterator迭代器的remove()不会出现此错误。
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
modCount记录当前集合修改(结构化修改,增加或删除)的次数。
expectedModCount记录获取集合迭代器时当前集合的修改次数。
ConcurrentModificationException作用:避免多线程场景下的数据脏读问题。
fail-fast如何解决?
a. 遍历不要修改集合内容
b. 使用迭代器内部的删除方法
c. 使用fail-safe集合
fail-fast集合:java.util除了TreeMap以外的所有集合
fail-safe集合:juc包的集合(ConcurrentHashMap,CopyOnWriteArrayList)
-
Set与Map的关系?
Set就是value值相同的Map集合,现有Map再有Set,Set不允许数据重复。 -
hashCode与equals的关系
hashCode返回相等,equals不一定相等
equals返回相等,hashCode一定相等,如果不相等,说明同一元素重复存储,浪费空间。 -
Java中实现一个类的两个对象大小比较的方式(内部排序,外部排序)
java.util.Comparable接口(内部比较器):
若一个类实现了Comparable接口,就意味着该类支持排序,存放该类的Collection或数组,可以直接通过Collections.sort()或Array.sort进行排序。
实现了Comparable接口的类可以直接存放在TreeSet或TreeMap中。
public int compareTo (T o)
返回值三种情况:
返回正数:表示当前对象大于目标对象
返回0:表示当前对象等于目标对象
返回负数:表示当前对象小于目标对象
Comparator(外部排序接口):
若要自定义某个自定义类的顺序,而该类本身不支持排序(类本身没有实现Comparable)。我们可以建立一个该类的‘比较器’来进行排序,比较器实现Comparator即可。
‘比较器’:实现了Comparator接口的类作为比较器,通过该比较器来进行类的排序。
int compare(T o1, T o2);
返回值与compareTo返回值完全一样
实现了Comparator接口进行第三方排序–策略模式,此方法更加灵活,可以轻松改变策略进行第三方的排序算法。
Comparable接口与Comparator接口的关系:
Comparable是排序接口,若一个类实现了Comparable接口,意味着该类支持排序,是一个内部比较器(自己去和别人比)。
Comparator接口是比较器接口,类本身不支持排序,专门有若干个第三方的比较器(实现了Comparato接口的类)来进行类的排序,是一个外部比较器(策略模式)。