1.集合框架
Collection:(1)单列集合顶层接口;(2)Set 体系具有唯一性;(3)数据结构针对元素有效
List 体系(接口):有序(存取顺序一致),可重复
ArrayList:底层结构是数组,查询快(修改快),增删慢,线程不安全(实现不同步),效率高
Vector:底层结构是数组,查询快(修改快),增删慢,线程安全(实现同步),效率低
LinkedList:底层结构是链表,查询慢(修改慢),增删快,线程不安全(实现不同步),效率高
Set 体系(接口):无序,(存取的顺序不同),唯一性
HashSet:(底层依赖的是HashMap)底层数据结构是哈希算法,依赖于hashCode()和equals()保证唯一性
LinkedHashSet:底层数据结构是链表,具有唯一性,Set体系中唯一一个可以保证存取一致的集合类
TreeSet:底层数据结构是二叉树算法,具有唯一性,可以对元素排序
保证元素唯一性的方式:
第一种:让基本类去实现Comparable接口,然后重写接口中的compareTo()方法
compareTo()方法返回值是一个int类型:
如果是0:说明元素相同,不添加。
如果是正数: 就正序存储。(元素往右边放)
如果是负数: 就倒序存储。(元素往左边放)
第二种:创建TreeSet集合对象的时候,传一个比较器Comparator接口的 子类对象进来。
代码示例:
TreeSet<Person> ts = new TreeSet<>( new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
//按照年龄排序
return p2.getAge() - p1.getAge();
}
//重写接口中的所有抽象方法
} );
注意:
如果创建TreeSet集合对象的时候传入了比较器接口对象,并且基本类也实现了 Comparable接口,那么,排序的规则优先使用: 传入的比较器接口。
简单记:
如果两种排序方式都有,优先使用集合自带的比较器接口。
如果是升序(从小到大)排列:就是 this. - p.
如果是降序(从大到小)排列:就是 p. - this.
简单记:
前-后 就是从小到大, 后-前就是从大到小。
Map:(1)双列集合顶层接口;(2)键具有唯一性;(3)数据结构针对键有效
HashMap:底层数据结构是哈希算法,如果存储的元素,键是自定义类型,要保证键的唯一,必须重写 hashCode()和equals()方法。
输出语句直接打印对象,默认调用的是该对象的toString()方法,
如果打印的不是地址值,那么肯定该类或者该类的父类重写了Object类中的toString()方法。
LinkedHashMap:底层数据结构是链表,可以保证怎么存就怎么取(存取一致)
TreeMap:底层数据结构是二叉树算法,具有唯一性,可以对元素排序
存的键如果是自定义类型,如何保证键的唯一性?
第一种:自然排序
让该自定义类型去实现 Comparable接口,然后重写接口中的compareTo()方法
第二种:比较器接口
创建TreeMap集合对象的时候,传入一个比较器接口Comparator的子类对象,重写接口中的compare()方法
2.到底什么时候决定使用哪种集合?
答:看需求:
1,首先看是需要用单列集合还是双列集合
(1)单列集合: Collection
2-1.1,看是否需要元素唯一性
a,List:不唯一
3-1.2.a,看是否需要排序
HashSet:无序性
TreeSet:有序性
不明确的情况下,优先考虑使用 HashSet
b,Set:唯一
3-1.2.b,看增删多还是查询多
LinkedList:底层数据结构是链表,查询慢,增删快
ArrayList:底层数据结构是数组,查询快,增删慢
不明确的情况下,优先考虑使用 ArrayList
(2)双列集合: Map
2-2.1,看是否需要排序
HashMap:无序性,底层数据结构是哈希算法
TreeMap:有序性,底层数据结构是二叉树
不明确的情况,优先考虑使用 HashMap
3.HashMap 和 Hashtable 的区别:
HashMap:JDK1.2版本出现的,线程不安全,效率高。可以存null值和null键。
Hashtable:JDK1.0版本出现的,线程安全,效率低,不可以存null值和null键。
他们的相同点是:底层数据结构都是哈希算法,都是双列集合。
(HashTable正确写法是:Hashtable,因为集合的命名规范是JDK1.2版本以后出现的)
4.Collection和Map的区别:
Collection:单列集合顶层接口,子体系Set体系具有唯一性,数据结构针对元素有效。
Map:双列集合顶层接口,键具有唯一性,数据结构值针对键有效。
他们都是集合的顶层接口。
5.什么是并发修改异常?
答:ConcurrentModificationException (并发修改异常)
产生原因:
通过普通的迭代器遍历集合的时候,又同时往集合中添加元素
解决方案:
通过 ListIterator(列表迭代器)来遍历集合,并且通过列表迭代器中的add()方法往集合中添加元素。
6.HashCode()规则中值是多少?为什么?
答:是31,
1,是质数
2,不大也不小
3,好算,正好是2向左移动五位之后减一 |