一:集合概述
为了在程序中保存数目不确定的对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,集合按照其存储结构可以分为两大类:单列集合Collection和双列集合Map;
二:Collection接口
Colloction集合的遍历方式(以ArrayList集合为例):
//Collection集合遍历方式
Collection<String> c=new ArrayList<String>(); //创建集合
c.add("张三"); //添加数据
c.add("李四");
//1.迭代器
Iterator i=c.iterator();
while(i.hasNext())
{
Object tmp=i.next();
System.out.println(tmp);
}
//2.增强for循环
for(String s:c)
{
System.out.println(s);
}
//3.lambda表达式
c.forEach(new Consumer<String>() { //底层原理
@Override
public void accept(String t) {
// TODO Auto-generated method stub
System.out.println(t);
}
});
//c.forEach(t->System.out.println(t)); //简化后的lambda表达式
//4.for循环(适用于有索引的集合) //List接口的实现类能用,Set接口不能用
for(int i=0;i<c.size();i++){
System.out.println(c.get(i));
}
1.List接口
List接口继承自Collection接口,是单列集合的一个重要分支。List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,可以通过索引访问List集合中的指定元素。List集合的重要特点就是元素有序。List集合继承了Collection接口中的所有方法,还增加了一些操作集合的特有方法。
(1).ArrayList集合
ArrayList是List接口的一个实现类,本质是一个长度可变的数组,性质为:有序,不重复,无索引。大部分方法从Collection和List接口中继承的。优点:查询速度快;缺点:不方便在中间增删元素。
(2).LinkedList集合
LinkedList集合的本质是一个双向循环链表,性质为:有序,不重复,无索引。它的优缺点和ArrayList集合相反,定义了一些特有的添加和删除操作:
当用LinkedList集合表示一个栈,有两个特定的方法:
(3).并发修改问题
从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
解决方法:
ArrayList<String> a=new ArrayList<>();
a.add("张三");
a.add("李四");
a.add("李华");
a.add("张三");
a.add("王五");
a.add("李丽");
System.out.println(a);
//1.使用迭代器
Iterator it=a.iterator();
while(it.hasNext())
{
String name=(String)it.next();
if(name.contains("李"))
{
it.remove(); //处理并发修改问题
}
}
System.out.println(a);
//2.使用for循环
for(int i=0;i<a.size();i++)
{
String name=a.get(i);
if(name.contains("李"))
{
a.remove(name);
i--;
}
}
System.out.println(a);
以上两种集合虽然比较高效,但是存在并发修改问题,List接口还有一个实现类Vector,Vector实
现了List接口,并且是线程安全的。
(4).Vector集合
Vector集合是线程安全的,不存在并发修改问题,它提供了一个相对于其他List集合特有的遍历方法:
Vector<String> vector = new Vector<String>();
vector.add("apple");
vector.add("banana");
vector.add("orange");
Iterator it=vector.iterator();
Enumeration enumeration=vector.elements();
while(enumeration.hasMoreElements())
{
String string=(String) enumeration.nextElement();
System.out.println(string);
}
调用elements方法获取vector的Enumeration对象,使用Enumeration对象的两个方法遍历集合。
2.Set接口
Set接口同样继承自Collection接口,它与Colloction接口的方法基本一致,只是比Collection接口更加严格了,与List接口不同的是,Set接口中元素无序,且不重复。
(1).HashSet集合
HashSet接口确保不重复的原理:当调用HashSet集合的add方法添加元素时,首先调用当前存入对象的hashCode()方法获得对象的