继承图
一、List接口的两个实现类ArrayList、LinkedList。
集合ArrayList:
特点:
1、有序的集合;
2、允许重复的元素;
3、有索引,可以使用普通的for循环遍历,因为该集合的底层是一个数组结构。
常用方法:
1、boolean add(E e);//添加一个元素
2、E get(int index);//获取索引编号对应的元素
3、E remove(int index);//根据索引删除
4、int size();//获取长度
另外,ArrayList与Array的最大区别在于是否可变长。
集合LinkedList:
特点:
1、有序的集合;
2、允许重复的元素;
3、底层是一个链表结构:查询慢,增删快;
4、包含了大量操作首层元素的方法。
注意:使用LinkedList集合特有的方法,不能使用多态。
常用方法:
1、void addFirst(E e);//指定元素插入到集合头部
2、void addLast(E e);//添加到集合结尾,相当于add()
3、void push(E e);//与addLast(E e)一样
4、E getFirst();//返回第一个元素
5、E getLast();//返回最后一个元素
6、E removeFirst();//移除并返回第一个元素;
7、E pop();//与 E removeFirst()一样
8、E removeLast();//移除并返回最后一个元素
9、boolean isEmpty();//判断集合是否为空
二、Set接口的两个实现类HashSet、LinkedHashSet。
集合HashSet:
特点:
1、不允许重复元素;
2、没有索引,不能使用普通for循环;
3、是一个无序的集合,存与取的顺序可能不一致;
4、底层是一个哈希表结构(数组+链表/红黑树)。
注意:HashSet存储自定义类元素时,自定义的元素需要重写hashCode()和equals()方法。
存储原理:底层是一个哈希表(数组+链表/红黑树)
1、数组结构:把相同哈希值的元素分为一组;
2、链表/红黑树结构:把相同哈希值的元素通过链表连接到一起。当链表的长度超过8位,就会把链表转换为红黑树。
3、Set集合在使用 add() 方法时,add() 方法会调用元素的 hashCode() 和 equals() 方法,判断元素是否重复。
集合LinkedHashSet继承了HashSet
特点:
1、不允许重复元素;
2、没有索引,不能使用普通for循环;
3、有序集合,底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表用于记录元素的存储区顺序,保证元素有序。
三、Map接口的两个实现类HashMap、LinkedHashMap。
Map接口的特点:双列集合(K,V),Key和Value的类型可以不同,Key不能重复,但Value可以重复,Key和Value一一对应。
常用方法:
1、V put(K,V);//添加一个元素,若Key存在,则Value替换,返回被替换的元素
2、V get(K);//获取指定Key的Value,若Key不存在,则Value返回null
3、V remove(K);//删除指定Key的元素,若Key不存在,则Value返回null
4、boolean containKey(K);//判断集合是否存在Key。
Map集合的两种了遍历方式:
1、通过键找值
步骤:
(1)Map集合的 Set<K> keySet()
方法返回 Key 的 Set 集合;
(2)遍历 Set 集合获取 Key;
(3)Map集合的 get(K) 找到 Value。
2、使用 Map 集合中的 Entry 对象
步骤:
(1)使用 Map 中的 entrySet() 方法把多个 Entry 取出来,存到一个 Set 集合中;
(2)遍历 Set 集合,获取每一个 Entry 对象;
(3)使用 Entry 的 getKey() 和 getValue() 获取键与值。
集合HashMap
特点:
1、底层是一个哈希表;
2、无序的集合。
集合LinkedHashMap继承了HashMap
特点:
1、底层是哈希表+链表;
2、有序的集合。
集合工具类Collections
Collections的一些静态方法:
1、<T> boolean addAll(Collection<T> C, T...elements);//往集合C中添加多个元素
2、void shuffle(List<?> list);//打乱集合顺序
3、<T> void sort(List<T> list);//默认升序排序
4、<T> void sort(List<T> list, Comparator<? super T>);//指定规则排序
注意:
1、使用第3种方法排序,自定义规则前提:被排序集合的元素,必须实现接口Comparable,重写方法comparaTo定义规则,规则(自己(this)- 参数:升序,反之为降序)。
2、使用第4种方法排序,自定义规则:使用匿名内部类重写规则,
sort(list, new Comparator<T>(){
public int compare(T o1, T o2){
return o1-o2;//左-右,升序
//return o2-o1;//右-左,降序
}
});