1.概念:
每一组对象的全体形成一个集合(或简称集)。集合里的每一个对象叫做这个集合的元素。
集合存放的都是对象的引用,而非对象的本身,而基本数据类型是没有对象的,所以一般基本数据类型不能用集合存放,但是包装类将基本数据类型自动包装为引用数据类型
2.集合体系大概:
- Collection接口
- Map接口
- Iterator接口
- Enumeration接口
3.Collertion接口:
Collection接口又分为两个子接口
分别是List和Set。
List接口表示的是一个有序的集合,允许存放重复的元素;而Set接口则表示的是一个无序的集合,不允许存放重复的元素。
Collection接口的常用方法:
add(Object o):增加元素
addAll(Collection c):
clear():
Contains(Object o):是否包含指定元素
containsAll(Collection c):是否包含集合c中的所有元素
iterator():返回Iterator对象,用于遍历集合中的元素
remove(Object o):移除元素
removeAll(Collection c):相当于减集合
cretainAll(Collection c):相当于求与c的交集
size():返回元素个数
set(index,value):替换指定索引的值
get(index)获得指定下标下面的元素
toArray():把集合转换为一个数组
-
List接口:
List接口有三个实现类:ArrayList、LinkedList和Vector,它们都是有序的集合,可以存放重复的元素。
ArrayList:
是基于动态数组实现的,它的特点是查询快,增删慢;
ArrayList的默认长度为10,每次扩容为原来的1.5倍,会进行一个复制拷贝的操作,但是如果创造的时候带了长度,则不会进行扩容,它的空间浪费主要提现在list列表的结尾,有一定的容量空间,对比LinkedList的空间浪费则是,它每个元素都要额外的指针,所以每个元素都会浪费一定的空间;Vector的扩容则是两倍的扩容;
查询快是因为带了索引,增删慢是因为进行增删,后面的索引值需要跟着一起改变
LinkedList
是基于链表实现的,它的特点是查询慢,增删快;线程不安全但是效率高
Vector
是一个线程安全的实现类,与ArrayList类似,但是它的所有方法都是同步的,因此性能较差,一般不推荐使用。扩容是两倍
Iterator迭代器
迭代器是一种设计模式,是一个对象,可以遍历并选择序列中的对象,开发人员也不需要理解底层结构,迭代器通常被称为“轻量级”对象,因为创建的代价小
对集合对象使用iterator()方法,返回一个Iterator对象,然后可以调用对象的方法,
Iterator的方法 :
(1)next() 获得序列的下一个元素,如果是第一次调用则返回序列第一个元素next()方法,指针会移动到下一个元素,如果不注意的话会发生迭代异常
(2)hasNext()检查序列是否还有元素
(3)remove()将迭代器新返回的元素删除,没有使用next()方法则不能使用remove()方法,一次next()方法只能使用一次remove()方法
Set接口(无序,唯一,无索引):
Set接口也有三个实现类:HashSet、TreeSet和LinkedHashSet。
HashSet是基于哈希表实现的,它是一个无序的集合,不允许存放重复的元素;
哈希表依赖两个方法:hashcode()和equals():
(一般规则:对象equals 是true的话,hashCode需要相同,但是hashCode相同的对象不一定equals,这就是所谓的冲突现)
执行顺序: 首先判断hashCode()值是否相同
是:继续执行equals(), 看其返回值 否:就直接添加到集合
执行equals():是true:说明元素重复,不添加 是false:就直接添加到集合
最终: 自动生成hashCode()和equals()即可
TreeSet是基于红黑树实现的(自平衡二叉树),它可以对元素进行排序,不允许存放重复的元素;
如何保证元素的唯一:根据比较的返回值是否是0来决定
如何保证元素的排序:
自然排序(元素具备比较性) : 让元素所属的类实现Comparable(康不瑞波)接口
比较器排序(集合具备比较性): 让集合接收一个Comparator(康怕瑞特)的实现类对象
LinkedHashSet是基于哈希表和链表实现的,它可以保证元素的插入顺序(链表),不允许存放重复的元素(哈希表)
哈希表依赖两个方法:hashcode()和equals():
(一般规则:对象equals 是true的话,hashCode需要相同,但是hashCode相同的对象不一定equals,这就是所谓的哈希冲突)
执行顺序: 首先判断hashCode()值是否相同
是:继续执行equals(), 看其返回值 否:就直接添加到集合
执行equals():是true:说明元素重复,不添加 是false:就直接添加到集合
最终: 自动生成hashCode()和equals()即可
4.Map集合(双列集合):
A:Map集合的数据结构仅仅针对键有效,与值无关。
B:存储的是键值对形式的元素,键唯一,值可重复。
Map接口也有三个实现类:HashMap、TreeMap和LinkedHashMap。
HashMap是基于哈希表实现的,它是一个无序的集合,允许存放重复的键值对,但是不允许键重复,线程不安全,效率高;
map集合没有迭代器,map集合的迭代器本质,是将map集合转换成set集合后再使用迭代器
Set<Integer> set = map.keySet();
Iterator<Integer>it = set.iterator();
while (it.hasNext()) {
Integer key = it.next();
// 再通过key值得到value
String value = map.get(key);
System.out.println("k==" + key + ",v==" + value);
}
--------------entrySet循环遍历map集合-----------------------
Set<Entry<Integer, String>> set2 = map.entrySet();
Iterator<Entry<Integer,String>> it2 = set2.iterator();
while (it2.hasNext()) {
Entry<Integer,String> entry = it2.next();
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println("k==" + key + ",v==" + value);
}
--------------增强for循环循环遍历map集合-----------------------
Set<Integer> set3 = map.keySet();
for(Integer i : set3) {
System.out.println("k==" + i + ",v==" + map.get(i));
}
LinkedHashMap是基于哈希表和链表实现的,它可以保证键值对的插入顺序,不允许键重复,由链表保证元素有序,由哈希表保证元素唯一。
TreeMap是基于红黑树实现的,它可以对键进行排序,不允许键重复;
二叉树排序:
二叉树算法的排序规则:
1. 选择第一个元素作为根节点
2. 之后如果元素大于根节点就放在右子树,如果小于根节点就放在左子树
3. 最后按照中序(左中右)输出,就是有序的
代码实现思路:
1. 创建一个节点类Node
2. 添加节点方法
3. 输出的方法
4. 创建一个棵树
Iterator接口和Enumeration接口都是用于遍历集合元素的接口。
Iterator接口是Java 1.2引入的,它可以遍历所有实现了Collection接口的集合,支持删除操作;
Enumeration接口是Java 1.0就有的,它只能遍历实现了Enumeration接口的集合,不支持删除操作。一般来说,建议使用Iterator接口进行集合的遍历操作。
迭代器是Java集合框架中的一种通用的遍历机制,用于访问集合中的元素。Iterator接口是Java提供的一个迭代器接口,它提供了hasNext()和next()两个方法,通过调用这两个方法可以遍历集合中的元素。
Enumeration接口也是用于遍历集合中的元素的接口,但是它只提供了hasMoreElements()和nextElement()两个方法,它是Java早期集合框架中的接口,现在已经不太常用了。
在使用Iterator遍历集合时,可以使用remove()方法删除集合中的元素,而在使用Enumeration遍历集合时则没有这个功能。
常见的集合类都实现了Iterator接口,例如ArrayList、LinkedList、HashSet、TreeSet等。而Enumeration接口只被Vector和Hashtable所实现。
总的来说,Iterator接口是Java集合框架中比较常用的遍历接口,而Enumeration接口已经不太常用了。