集合详细总结(一)
1.1.数组和集合的区别
数组不是面向对象的,存在着明显的缺陷,而集合又弥补了数组的一些缺点,比数组在使用时更加灵活。
1.数组的效率高于集合
2.数组能存放基本数据类型和对象,而集合类中只能放对象。
3.数组容量固定且无法动态改变,集合类容量动态改变。
4.数组无法判断其中实际存有多少元素,length只告诉了array的容量。
5.集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。
6.集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
1.2.集合类体系结构
1.Collection包含List接口和Set接口
Collection接口存储对象不唯一且无序
List接口中可以通过index(索引)知道元素的位置,list集合中的每一个元素都有一个索引,它允许元素的重复,而且它还是有序的,这里的有序指的是存取有序,就是你按什么样的顺序存进去的,取出来还是什么样。
Set接口中是不允许元素重复的,而且无索引,不能使用普通for循环遍历,不保证集合元素的存取顺序,最多有一个空值,它继承自collection接口,所以可以使用collection的方法,底层是map实现机制。
Map接口并不是collection接口的子接口,但是仍然被看作是collection框架的一部分,Map使用键值对,key无序且唯一,value可以重复,不要求有序,每个键最多对应一个映射的值,而且不能有空值键
1.3.Collection集合概述和使用
- Collection集合概述
1.是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
2.JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现
- 创建Collection集合的对象
1. 多态的方式
2.具体的实现类ArrayList
- Collection集合常用功能(这些操作可以用于所有的单列集合)
- 添加 add(Object obj) addAll(Collection coll)
- 获取有效元素的个数 int size();
- 清空集合 void clear();
- 是否包含某个元素 Boolean contains(object obj):是通过equals来判断是否是同一个对象,本质上是拿集合中的元素与他值比较,又因为string类对equals进行了重写,比较的是字符串的内容 Boolean containAll(collection c)调用元素的equals方法比较,拿两个集合的元素挨个比较
- 是否空集合 Boolean isEmpty()
- 删除 (1)Boolean remove(Object obj) 通过元素的equals方法判断是否是要删除的那个元素,只会删除找到的第一个元素,只是把元素从集合删除,内存中还存在(2)boolean reMoveAll(Collection coll)(3)Boolean removeif(Object o)根据条件进行移除
- 取两个集合的交集 boolean retainAll(Collection c)把交集的结果存在当前集合中,不影响c
- 转成对象数组 Object[] toArray()
1.4.Collection集合的遍历
-
迭代器介绍
1.迭代器,集合的专用遍历方式
2.Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到
-
Iterator中的常用方法
1.boolean hasNext(): 判断当前位置是否有元素可以被取出
2.E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置
- 增强for循环
1.它是JDK5之后出现的,其内部原理是一个Iterator迭代器
2.实现Iterable接口的类才可以使用迭代器和增强for
3.简化数组和Collection集合的遍历
public static void main(String[] args) {
//创建集合对象
Collection<String> list = new ArrayList<>();
list.add("a");
list.add("b");
//1.增强for循环遍历输出
//数据类型一定是集合或者数组中元素的类型
//str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素
//list就是要遍历的集合或者数组
for(String str:list){
System.out.println(str);
}
//2.Iterator<E> iterator():返回此集合中元素的迭代器,
通过集合的iterator()方法得到
Iterator<String> it = list.iterator();
//用while循环改进元素的判断和获取
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
}
通过迭代器和增强for遍历输出是两种比较常见的方法,而迭代器中还有删除元素的方法
void remove(): 删除迭代器对象当前指向的元素
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
if("b".equals(s)){
//指向谁,那么此时就删除谁.
it.remove();
}
}
System.out.println(list);
}
}
2.List集合
2.1List集合的概叙和特点
-
List集合的概述
-
有序集合,这里的有序指的是存取顺序
-
用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
-
与Set集合不同,列表通常允许重复的元素
-
-
List集合的特点
-
存取有序
-
可以重复
-
有索引
-
2.2.List集合的特有方法
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
2.3.List集合的实现类
2.3.1List集合子类的特点
- ArrayList集合
底层数据结构是数组,允许添加重复的元素,添加的元素有序,
线程不安全,线程不同步,在多线程同时访问时,可以提高访问的效率,但是会降低访问的安全性,
它实现了list接口,动态数组,增删快,查询慢,它在查找某个index的数据时效率更高,遍历元素和随机访问元素的效率比较高,而添加和删除元素需要前后移动元素的位置,所以效率低,
当插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率,
-
LinkedList集合
底层数据结构是链表,存储的元素可以重复,而且是按添加顺序进行存储的,查询慢、增删快,插入和删除元素的效率比较高,
线程不安全,linkedList没有同步方法,如果多个线程同时访问一个list,必须自己实现访问同步,一种解决方法实在创建list时 构造一个同步的list,如:List List=Collections.synchronizedList(new LinkedList(....));对集合长度无限制,它实现了list和 Deque(双端队列)接口,一般称为双向链表,在插入和删除数据时效率更高,它实现了list接口,允许有null元素,linkedList 比arraylist需要更多的内存
ArrayList和LinkedList的区别和联系:
1.两者都实现了List接口,都具有List中元素有序、不唯一的特点。
2.ArrayList实现了长度可变的数组,在内存中分配连续空间,遍历元素和随机访问元素的效率比较高;
3.LinkedList采用链表存储方式,插入、删除元素时效率比较高
2.3.2LinkedList集合的特有功能
Void addFirst() 在列表头插入指定元素
Void addLast() 在列表尾插入指定元素
E getLast() 获取列表的最后一个元素
E getFirst() 获取列表的第一个元素
E removeLast() 删除列表的最后一个元素
E removeFirst() 删除列表的第一个元素
补充:
Collection和Collections的区别
Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。
Java中还有一个Collections类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。