首页 > 代码库 > Java自学笔记(四)—— 集合类总结

Java自学笔记(四)—— 集合类总结

今天来总结总结Java集合类集合类又叫容器类,它封装了很多我们学过的数据结构,这些现成的集合类,实现了各种操作,使用起来非常方便,今天的总结也是以代码为主。
集合大致分为Set、List、Map三种体系。但实际上Java集合类主要由两个接口派生而出,Collection接口和Map接口。
Collection接口的子接口:
1.Set,无序,元素不可重复
2.Queue 队列

3.List,有序,元素可以重复


一个个来细说,Set,可以想像成是一个大箱子,里面的东西是无序的,但是有一个条件就是元素不能重复。

Set的实现类:HashSet、TreeSet、EnumSet、LinkedHashSet。

其中HashSet最常用,散列算法用于保证查询快速执行;TreeSet利用树来保证集合元素处于排序状态;EnumSet中所有的元素都必须是指定枚举类型的枚举值;LindedHashSet使用链表维护元素的插入次序。

看代码:
import java.util.*;

public class setTest 
{
	public static void main(String[] args)
	{
		Collection<String> box = new HashSet<>();
		//增加元素
		box.add("pen");
		box.add("pencil");
		box.add("sugar");
		System.out.println(box);
		//删除元素
		box.remove("pen");
		System.out.println(box);
		//是否包含元素
		System.out.println("盒子里有没有糖?"+ box.contains("sugar"));
		//把集合转换成数组
		//注意虽然此处使用泛型将box定义为String型的HashSet,
		//但toArray的方法返回的依然是Object型
		Object[] o = new Object[5];
		o = box.toArray();
		for(Object tmpO : o)
		{
			System.out.println(tmpO);
		}
	}
}



结果:


[pen, pencil, sugar]
[pencil, sugar]
盒子里有没有糖?true
[Ljava.lang.Object;@1db9742
pencil
sugar


接下来是Queue。这个特征很明显了,FIFO嘛。事实上还可以实现堆栈的结构。
Queue的实现类:PriorityQueue、ArrayDeque、LinkedList
其中PriorityQueue保存队列元素不是按照加入队列的元素,并不严格遵守FIFO;ArrayDequeue代表一个基于数组实现的双端队列;LinkedList比较诡异,它既实现了Deque接口,又实现了List接口,因此它可以被当成双端队列来使用,也可以当作栈。
下面代码中遍历使用了Iterator。此接口有三个方法:
boolean hasNext():是否还有下一个元素
Object next(): 返回集合里的下一个元素
void remove(): 删除集合里上一次next方法返回的元素
代码:
<span style="font-family:Microsoft YaHei;font-size:18px;">import java.util.*;

public class queueTest
{
	public static void main(String[] args)
	{
		Deque<String> q = new ArrayDeque<>();
		//添加元素
		q.add("no.1");
		q.add("no.2");
		q.add("no.3");
		q.add("no.4");
		//遍历元素
		Iterator it = q.iterator();
		while(it.hasNext())
		{
			Object o = it.next();
			System.out.println(o);
		}
		//在首尾增加元素
		q.addFirst("a");
		q.addLast("b");
		it =  q.iterator();
		while(it.hasNext())
		{
			Object o2 = it.next();
			System.out.println(o2);
		}
		System.out.println(q.getFirst());
		System.out.println(q.getLast());
	
	}
}
</span>




结果:


no.1
no.2
no.3
no.4
a
no.1
no.2
no.3
no.4
b
a
b


再是List。特点是有序,线性,元素可重复。
List的实现类:ArrayList、Vector。
ArrayList更长用,但线程不安全。
List默认按照元素添加顺序设置元素的索引。既然是有序,所以它增加了一些关于index的方法,看代码:

import java.util.*;
 
public class listTest
{
	public static void main(String[] args)
	{
		List<String> classRoom = new ArrayList<>();
		
		classRoom.add("小王");
		classRoom.add("小李");
		classRoom.add("小董");
		classRoom.add("小陈");

		Iterator it = classRoom.iterator();
		while(it.hasNext())
		{
			Object o = it.next();
			System.out.println(o);
		}
		
		System.out.println("小董第一次出现的索引位置是:"+ classRoom.indexOf("小董"));
		//将index处元素替换
		classRoom.set(1,"替换物,不明物体!!");
		System.out.println(classRoom);
	}
}



结果:
小王
小李
小董
小陈
小董第一次出现的索引位置是:2
[小王, 替换物,不明物体!!, 小董, 小陈]


Map是什么呢?它用于保存具有映射关系的数据,一组key,一组value。key与value之间存在单向一一对应关系,也就是通过指定的key,能找到唯一的value。
其实Map里的key集单拿出来,都可以算是一个Set(不可重复);而value拿出来,可以算是一个List(可重复,根据索引查询)。


Map接口的实现类:

1.HashMap 一般场景常用,但线程不安全。
2.HashTable 线程安全,但已经过时。
3.LinkedHashMap 双向链表维护key-value对的次序,略慢于HashMap。
4.Properties 便于处理属性文件。
5.TreeMap 利用红黑数来进行排序,总是处于有序状态。
6.EnumMap 所有key必须是单个枚举类的枚举值。

示例代码:

import java.util.*;

public class MapTest
{
	public static void main(String[] args)
	{
		HashMap hm = new HashMap();
		//将key-value对放进HashMap里
		hm.put(1, "A");
		hm.put(2, "B");
		hm.put(3, "C");
		System.out.println(hm);
		//用get(key)获得对应的value
		System.out.println(hm.get(3));
		//用remove(key)删除相应key-value对
		hm.remove(2);
		//keySet()返回key组成的Set
		System.out.println(hm.keySet());
	}
}

结果:


{1=A, 2=B, 3=C}
C
[1, 3]


接下来放大招,操作集合的工具类:Collections(记得有s,区分于Collection接口)
此工具类提供了大量方法对集合元素进行排序、查询、修改等操作。
对List:reverse()反转; shuffle()洗牌;  sort()升序排序; swap()交换; rotate()平移;binarySearch()按二分法查找;  max()找最大值;  min()找最小值;  fill()查找而且替换;  frequecy()返回出现频率。


最后说说工具类这样的存在吧。我们原先使用的语序规则是类.调用类的方法(),就是主谓。像鸟.飞(),鱼.游()。但是有的时候,会需要对主语的行为进行补充,或者干脆是主语的被动动作,这样我们就可以使用工具类,像这样:厨房工具类.吃(鸟)或者厨房工具类.吃(鱼),依然符合语序。