今天说一下java中的容器,说的不好还请指正,感谢.
我们学过数组都知道数组是相同数据类型的有序集合,可以在其中放置对象或基本类 型数据,说白了就是容器.但是数组的长度一旦确定就不可以再进行改变,因此有时候不够灵活,不能随着需求的变化而扩容.
因此在不能事先确定所要存储的数据有多少时,就不能使用数组.我们需要一种灵活地、容量可以随时扩容的容器来装在我们的数据.这就是今天要说的容器类,又名集合框架.
集合框架的简单的体系结构如下:

-
Collection 接口是一组允许重复的对象
- Set 接口继承 Collection,无序不允许重复,使用自己内部的一个排列机制
- List 接口继承 Collection,有序允许重复,以元素安插的次序来放置元素, 不会重新排列
-
Map 接口是一组成对的键值对象,即所持有的是 key-value pairs.Map 中不能有重复的 key.拥有自己的内部排列机制
-
容器中可存放不同类型的数据,但元素类型都为引用类型,不能放置原生数据类型(使用装箱即可),使用泛型保留类型
1.Collection接口
Collection表示一组对象,这些对象也称为collection的元素,它是集中,收集的意思,就是把一些数据收集起来.
Collection接口的两个子接口:
- Set中的数据没有顺序,不可重复
- List中的数据有顺序,可重复
Collection中的一些方法如下图:

2.List接口
List接口位置有序允许元素重复
List中的方法多了一些关于位置(顺序)的方法,如下图所示:

3.ArrayList
ArrayList是List的子类,它与HashSet相反,允许存放重复元素,因此有序.
- ArrayList的底层实现是由可变数组(通过一些方法)实现的,通过数组拷贝实现容器可以根据内容进行动态扩容;
- ArrayList的优点是遍历和获取的效率高,因为我们可以根据索引直接定位到我们需要的元素;
- ArrayList的缺点是增删的效率低;
- 当ArrayList的容量不足以继续存放对象时,会自动的扩容,每次扩容原先容器大小的1.5倍;
- ArrayList可以使用多态
- 在单线程环境下,在大量做查询的业务下,适合使用ArrayList
4.为什么在定义一个容器时使用泛型
在JDK1.4之前类型不明确: 装入集合的类型都被当做Object对待,从而失去自己的实际类型.从集合中取出时往往需要转型,效率低,容易产生错误.
使用泛型之后可以增强程序的可读性和稳定性.
使用泛型,保留了容器中元素的类型,安全省心的使用容器.
5.迭代器与List集合遍历
1.迭代器
通常情况下,你会希望遍历一个集合中的元素.例如,显示集合中的每个元素.
一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口.
迭代器,使你能够通过循环来得到或删除集合的元素.ListIterator继承了Iterator,以允许双向遍历列表和修改元素.
使用迭代器时,要分三步走:
- 获取对象
- 判断是否存在下一个
- 获取元素
下面举例使用迭代器:
import java.util.*;
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("skr");
//1.获取迭代去对象
Iterator<String> ite=list.iterator();
while(ite.hasNext())//2.判断下一个元素之后有值 {
//3.内部移动位置,获取对应的元素
String str=ite.next();
System.out.println(str);
}
}
}
2. 列表迭代器
允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置
ListIterator 没有当前元素;它的光标位置 始终位于调用previous()所返回的元素和调用 next() 所返回的元素之间
示例:
public class ListDemo02 {
public static void main(String[] args) {
List<String> list=new ArrayList();
list.add("钢铁侠");
list.add("美国队长");
list.add("黑寡妇");
list.add("灭霸");
list.add("蜘蛛侠");
list.add("雷神");
System.out.println(list);
ListIterator it=list.listIterator();
while(it.hasNext()){
if("灭霸".equals(it.next())){
it.add("惊奇队长");
}
}
System.out.println(list);
}
}
结果:
[钢铁侠, 美国队长, 黑寡妇, 灭霸, 蜘蛛侠, 雷神]
[钢铁侠, 美国队长, 黑寡妇, 灭霸, 惊奇队长, 蜘蛛侠, 雷神]
注意惊奇队长是在灭霸之后添加的.
3.List集合遍历
List集合遍历有四种方法:
- 普通for循环
- 增强for循环
- 迭代器
- 列表迭代器
6.LinkedList
LinkedList 是一种可以在任何位置进行高效地插入和删除操作的有序序列
- LinkedList底层是由双向链表结构实现
- LinkedList的优点做增删效率高
- LinkedList的缺点做查询效率低
- 同时新增了一些有关于链表头和链表尾部的方法,这就意味着不能在定义一个LinkedList的时候使用多态.