JAVA——集合总结
一、集合类
1、集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
2、集合类和数组的区别
(1)数组虽然也可以存储对象,但长度是固定的;而集合长度是可变的。
(2)数组中可以存储基本数据类型,集合只能存储对象
二、Collection接口概述
1、Collection集合
- (1)Collection 是层次结构中的根接口。
- (2)Collection 表示一组对象,这些对象为 collection 的元素。这些元素有唯一的,有有序的,有无序的。
2、集合的集合体系
![](https://i-blog.csdnimg.cn/blog_migrate/3dc386923313b33ce4f95c0eaec0f146.png)
3、Collection接口成员方法:
- 添加功能 boolean add(object obj) 添加一个元素
- boolean addAll(Collection c) 添加一个集合的元素
- 删除功能 void clear() 移除所有元素
- Boolean remove(object o) 移除一个元素
- Boolean removeAll(Collection c) 移除一个集合
- 判断功能 boolean contains(Object o) 判断集合中是否包含指定的元素
- boolean containsAll(Collection c) 判断集合中是否包含指定的集合元素
- boolean isEmpty() 判断集合是否为空
- 获取功能 Iterator iterator() (重点)
- 长度功能 Int size() 集合中元素的个数
- 交集功能 boolean retainAll(Collection c)
- 把集合转换为数组 Object[] toArray()
4、集合的使用步骤
- A:创建集合对象
- B:创建元素对象
- C:把元素添加到集合
- D:遍历集合
5、Collection集合的遍历
- (1)将集合转化为数组 :Object[] toArray():把集合转成数组,可以实现集合的遍历
- (2)利用Iterator迭代器
步骤: - A:通过集合对象获取迭代器对象
- B:通过迭代器对象的hasNext()方法判断是否有元素
- C:通过迭代器对象的next()方法获取元素并移动到下一个位置
Collection c = new Collection();</br> Iterator it = c.iterator();</br> While(it.hasNext()){</br> String s = (String)it.next();</br> System.out,println(s);</br> }
迭代器为什么是一个接口,而不定义为一个类呢?
- 1. 假设迭代器定义的是一个类,我们就可以创建该类对象,调用该类方法实现集合的遍历。而Java提供了很多集合类,这些集合类的数据结构是不同的,所以,存储方式和遍历方式也应该不同,所以,迭代器没有定义为类。
- 2. 无论何种集合,都具备元素获取和判断的功能,所以通过接口将这两种方法提取出来,不提供具体实现。具体的实现以内部类的形式体现。
三、List集合
1、概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
2、List集合的特有方法
- 添加功能:void add(int index,E element)
- 删除功能:E remove(int index)
- 获取功能:E get(int index)
- 修改功能:E set(int index,E element)
- 迭代器:ListIterator listIterator()
3、List集合的特有遍历功能:由size()和get()组成
List list = new ArrayList(); //添加元素 …… //遍历 for (int x = 0; x < list.size(); x++) { String s = (String) list.get(x); System.out.println(s); }
4、List子类的特点
- (1)ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高;
- (2)Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低;
- (3)LinkedList:底层数据结构是链表,查询慢,增删快,;线程不安全,效率高。
到底使用谁呢?看需求。
【分析】
- 如果要安全:用Vector
- 不要求:ArrayList或者LinkedList
- 查询多;ArrayList
- 增删多:LinkedList
四、Set集合
1、set集合的特点:无序、唯一
2、HashSet集合:底层数据结构是哈希表(一个元素为链表的数组)
- (1)哈希表底层依赖两个方法:hashCode()和equals()
- 执行顺序: 首先比较哈希值是否相同 相同:继续执行equals()方法 返回true:元素重复了,不添加 返回false:直接把元素添加到集合 不同:就直接把元素添加到集合
- (2)如何保证元素唯一性的呢?
由hashCode()和equals()保证的
3、TreeSet集合:底层数据结构是红黑树(是一个自平衡的二叉树)
- 保证元素的排序方式 - a:自然排序(元素具备比较性):让元素所属的类实现Comparable接口
- b:比较器排序(集合具备比较性):让集合构造方法接收Comparator的实现类对象(重写Comparator()对象的Compare()方法)
TreeSet<tts = new TreeSet<T>(new Comparator<T>() { @Override public int compare(T T1,T T2){ } });
五、Map集合
1、概述
- (1)将键映射到值的对象
- (2)一个映射不能包含重复的键
- (3)每个键最多只能映射到一个值
2、Map接口和Collection接口的不同
- A:Map 存储的是键值对形式的元素,键唯一,值可以重复。
- B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。
3、Map接口功能概述
- A:添加功能:V put(K key,V value)
- B:删除功能:V remove(Object key) void clear()
- C:判断功能: boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty() - D:获取功能:V get(Object key)
- E:长度功能:int size()
4、Map集合的遍历
(1)方式一:键找值
- a:获取所有键的集合
- b:遍历键的集合,得到每一个键
- c:根据键到集合中去找值
(2)方式二:键值对对象找键和值
- a:获取所有的键值对对象的集合
- b:遍历键值对对象的集合,获取每一个键值对对象
- c:根据键值对对象去获取键和值
Map<String,Stringhm = new HashMap<String,String>(); hm.put("it002","hello"); hm.put("it003","world"); hm.put("it001","java");
方式1 键找值
Set<Stringset = hm.keySet(); for(String key : set) { String value = hm.get(key); System.out.println(key+"---"+value); }
方式2 键值对对象找键和值
Set<Map.Entry<String,String>set2 = hm.entrySet(); for(Map.Entry<String,Stringme : set2) { String key = me.getKey(); String value = me.getValue(); System.out.println(key+"---"+value);
六、Collections
1、是针对集合进行操作的工具类
2、(面试题)Collection和Collections的区别
- A:Collection 是单列集合的顶层接口,有两个子接口List和Set
- B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
3、常见的几个小方法:
- A:public static <T>void sort(List<T> list)
- B:public static <T>int binarySearch(List<?> list,T key)
- C:public static <T> T max(Collection<?> coll)
- D:public static void reverse(List<?> list)
- E:public static void shuffle(List<?> list)