集合的概念:
是对象的容器,定义了对多个对象常用的操作方法。可以实现数组的功能。
和数组的区别
1、数组长度固定,集合的长度是不固定。
2、数组可以存储基本类型和引用类型,而集合只能存引用类型。
Collection体系集合:
Collection父接口:
特点:代表一组任意类型对象的数据,无序无下标。下面的实现类,使用迭代器Iterator实现输出,或者使用增强for。
(1)List:Collection题下的子接口。
特点:有序有下标,元素可以重复。
独有方法:sublist[ ],返回了一个新的集合。
add(int index, Object o);
contains( ),比较方法是使用Object的equals方法,比较的是地址。
实现类:
- ArrayList( ):数组结构实现,必须开辟连续的空间。查询快,增删慢。运行效率快,线程不安全。创建的时候,默认是空的Object数组,长度为0。使用add方法第一次进行数据添加的时候,进行扩容,默认是10。第二次自动扩容为15,是1.5倍增长于之前。
//底层实现扩容的代码,grow()方法。
int [ ] new Capacity = oldCapacity+oldCapacity>>2;
//快速创建list集合,但是创建的是不可变的。
List<T> xx = Collections.emptyList();
//list.binarySearch(list,"str");方法,找到返回str下标,找不到
//返回应该插入位置的下标,前面加个负号,表示插入。
//清空集合,仅仅是清空集合里面的数据,对象本身并没有删除。
collection.clear();
//遍历的方法
for (Object object : collection) {
String str =(String)object;
System.out.println(str);
}
System.out.println("===============");
//遍历2 迭代器 类似于while循环
//collection.iterator();
//使用迭代器循环
Iterator it = collection.iterator();
while(it.hasNext()) {
//next() 取值,指针向下移动,指向下一个值
String s = (String)it.next();
System.out.println(s);
//不能使用collection删除方法,因为遍历同时不能使用集合(修改)删除方法,
//否则出现并发修改异常。ConcurrentModificationException (并发修改异常)
//collection.remove(s);
//使用迭代器的自己的删除方法 移除指针指向的值
//it.remove();
}
-
Vector( ):数组结构实现,查询快,增删慢。运行效率慢,线程是安全的。
-
LinkList( ):存储方式,双向链表结构。增删快,查询慢。
LinkList()独有的方法,addFirst( ),addLast( )。
(2)Set集合
特点:无序,无下标,元素不可以重复。
方法:全部继承来自Collection中的方法。使用foreach循环进行遍历。
底层实现是链表加上数组的结构。
1、HashSet (重点)
基于HashCode实现元素不重复,当存入的元素哈希码相同的时候,会调用==或equals方法进行确认。如果返回的结果为true,意味着找到了相同的元素
值,则拒绝存入。
2、LinkedSet
链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序。
3、TreeSet
基于排序顺序实现元素不重复。
实现了SortedSet接口,对元素集合自动排序。
元素的对象类型必须是Comparable接口,指定排序规则。
通过CompareTo方法判断元素是否重复。
(3)Map体系集合
Map父接口:
特点:称为映射。存储一对数据。键不可以重复,值可以重复。<K,V>
Map集合实现类:
- HashMap:线程不安全。运行效率快。允许null值存储进KEY或VALUE值。
- HashTable:线程安全。运行效率慢,不允许作为null值存储进KEY或VALUE。
- Properties:HashtTable子类,要求KEY或者VALUE都是String类型,通常用于配置文件的读取。
- TreeMap:实现了SortedMap接口,可以对key自动排序,key需要实现Comparable接口。