从头开始学java-会合(一)

从头开始学java--集合(一)

一.集合概述


什么是集合?
集合就是容器,存放东东的东东。存储数据用对象存,那存储对象的容器就是集合。
数组与集合的区别?
数组存储需要是固定长度的,集合长度不限。数组中对象必须是同一类型的,集合中可以是不同类型的。所以集合的类型更为广泛。

说白了,集合就是传说中的数据结构,只不过不用我们自己写了,java已经为我们提供好了一大堆集合类,我们只需要运用就可以啦,就不需要自己写那些数据结构啦!

常用的数据结构有线性表,链表,栈,树等,java中有ArrayList类等与之对应。

Collection分为两大类:

         List类:元素有序,可以重复,有索引。

         Set类:元素无序,不能重复,无索引。



从头开始学java-会合(一)
上图是java中常用的集合分类。

二.ArrayList类的使用

先看一下ArrayList类的增加,删除,清空,判断个数,判断是否为空,判断是否含有某对象等功能的例子:
import java.util.*;

public class CollectionTest1 {
	public static void main(String[] args)
	{
		//创建一个集合容器,使用collection接口
		ArrayList al = new ArrayList();
		
		//增加元素,add方法的参数类型是object类,集合中添加的都是对象的引用
		al.add("content1");
		al.add("content2");
		al.add("content3");
		//判断是否含有某元素
		System.out.println(al.contains("content1"));
		//获取集合元素个数,.size()方法
		System.out.println(al.size());
		//直接打印集合
		System.out.println(al);
		//删除集合元素
		al.remove("content1");
		//清空集合元素
		al.clear();
		//判断是否为空
		System.out.println(al.isEmpty());
		//取两个集合中的交集,存储在前一个集合中
		System.out.println(al.retainAll(al));
	}
}
结果:
从头开始学java-会合(一)

要点:
1.集合类在包java.util中,使用之前要导入这个包中的类。
2.使用集合时,创建一个相应的对象,通过对象集合进行操作。
3.集合中如果存的是对象,那么添加的都是对象的引用而不是对象本身。
4.add参数为Object类,可以接收所有的对象。

三.迭代器

因为各种数据结构实现不同,取出功能比较复杂,所以将取出元素这个操作进行了封装,被封装在容器类中,是一个内部类,以便方便访问类中的元素。取出操作。这些内部类取出操作都符合一些规则,所以都实现了一个接口,Iterator。如果我们自己设计了一个数据结构,实现这个接口也就实现了迭代器的功能。


import java.util.*;
 
public class CollectionTest2 {
	public static void main(String[] args)
	{
		ArrayList al = new ArrayList();
		
		al.add("content1");
		al.add("content2");
		al.add("content3");
		
		//获取迭代器的引用值,用it保存(迭代器是内部类,在创建外部类时已经创建了接口)
		Iterator it = al.iterator();
		//it.hasNext方法,判断是否有元素,如果有返回真,否则为假
		while(it.hasNext())
		{
			//it.next返回当前元素
			System.out.println(it.next());
		}
	}

}



要点:

1. 迭代器是一个内部类,实现一个接口。使用迭代器的时候,通过接口调用,用集合类的.iterator()方法返回迭代器在建立集合时建立的内部类对象实例。

2. 迭代器常用的方法.hasNext()判断是否还有元素。

3. 迭代器常用方法.Next(),返回迭代器中的下一个元素。



四.List集合


上面说过,List类中有索引,元素是有序的,可以重复。

所以List类中有一些特有的方法,即可以操作脚标的方法都是List的方法。

 

import java.util.*;

public class ListTest1 {
	public static void main(String[] args)
	{
		ArrayList al = new ArrayList();
		al.add("content1");
		al.add("content2");
		al.add("content3");
		
		//在指定位置添加元素
		al.add(1, "content0");
		System.out.println(al);
		
		//删除指定位置元素
		al.remove(1);
		System.out.println(al);
		
		//修改指定位置元素
		al.set(1, "content8");
		System.out.println(al);
		
		//通过脚标获取元素
		System.out.println(al.get(1));
		
		//通过脚标遍历
		for (int i = 0; i < al.size(); i++)
		{
			System.out.println(al.get(i));
		}
		
		//获取对象脚标
		System.out.println("index of content1 = " + al.indexOf("content1"));
		
	}
}<strong>
</strong>


要点:

List集合特有的方法一般都是跟脚标有关的。



五.List迭代器

当用迭代器操作时,我们有时也希望操作集合。但是我们在迭代的时候,用集合方式修改时会发生一些奇怪的异常:

import java.util.*;

public class ListTest2 {
	public static void main(String[] args)
	{
		ArrayList al = new ArrayList();
		al.add("content1");
		al.add("content2");
		al.add("content3");
		
		//如果我们用迭代器时,想通过Collection的方法修改List,会出现异常
		Iterator it = al.iterator();
		
		while(it.hasNext())
		{
			Object obj = it.next();
			if (obj.equals("content1"))
				al.add("content0");
			System.out.println(it.next());
		}
		
	}
}

结果:

从头开始学java-会合(一)

这个异常是说对象被并发修改时引发的异常。就是说要么用集合方式,要么用迭代器方式修改。

 

用迭代器方式修改时,方法比较少,只有三个方法,hasnext(),next(),remove()。

所以在这里我们如果想要用其他的方法,如添加或修改时,就要用派生于迭代器的List迭代器进行操作。

import java.util.*;

public class ListTest2 {
	public static void main(String[] args)
	{
		ArrayList al = new ArrayList();
		al.add("content1");
		al.add("content2");
		al.add("content3");
		
		//如果我们用迭代器时,想通过Collection的方法修改List,会出现异常
		ListIterator it = al.listIterator();
		
		while(it.hasNext())
		{
			Object obj = it.next();
			if (obj.equals("content1"))
				//增加
				it.add("content0");
		}
		System.out.println(al);
		
		//List还可以反向遍历
		while (it.hasPrevious())
		{
			System.out.println(it.previous());
		}
	}
}
结果:

从头开始学java-会合(一)

要点:

1.对于集合正在迭代的时候,要么用集合方式,要么用迭代器方式修改,不能同用,否则会引发异常。

2.使用List迭代器,可以比普通迭代器增加一些功能。


六.List子类特点

List分为ArrayList,LinkList,Vector三种

特点:

         ArrayList:底层数据结构用数组实现。查询速度很快,增删稍慢,线程不同步(默认长度是10,如果超过了10,那么就会新建一个大数组,将原来的东东拷贝到新的数组中)

         LinkList:底层数据结构用链表实现。增删速度很快,查询速度稍慢

         Vector:底层数据结构是数组结构,现在很少使用了。线程同步。

从头开始学java-会合(一)



其他知识点:三种List类型集合使用。