首页 > 代码库 > Java自学笔记(四)—— 集合类总结
Java自学笔记(四)—— 集合类总结
今天来总结总结Java集合类。集合类又叫容器类,它封装了很多我们学过的数据结构,这些现成的集合类,实现了各种操作,使用起来非常方便,今天的总结也是以代码为主。
集合大致分为Set、List、Map三种体系。但实际上Java集合类主要由两个接口派生而出,Collection接口和Map接口。
Collection接口的子接口:
1.Set,无序,元素不可重复
2.Queue 队列
结果:
[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方法返回的元素
代码:
结果:
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的方法,看代码:
小王
小李
小董
小陈
小董第一次出现的索引位置是:2
[小王, 替换物,不明物体!!, 小董, 小陈]
Map是什么呢?它用于保存具有映射关系的数据,一组key,一组value。key与value之间存在单向一一对应关系,也就是通过指定的key,能找到唯一的value。
其实Map里的key集单拿出来,都可以算是一个Set(不可重复);而value拿出来,可以算是一个List(可重复,根据索引查询)。
2.HashTable 线程安全,但已经过时。
3.LinkedHashMap 双向链表维护key-value对的次序,略慢于HashMap。
4.Properties 便于处理属性文件。
5.TreeMap 利用红黑数来进行排序,总是处于有序状态。
6.EnumMap 所有key必须是单个枚举类的枚举值。
结果:
{1=A, 2=B, 3=C}
C
[1, 3]
接下来放大招,操作集合的工具类:Collections(记得有s,区分于Collection接口)
此工具类提供了大量方法对集合元素进行排序、查询、修改等操作。
对List:reverse()反转; shuffle()洗牌; sort()升序排序; swap()交换; rotate()平移;binarySearch()按二分法查找; max()找最大值; min()找最小值; fill()查找而且替换; frequecy()返回出现频率。
集合大致分为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()返回出现频率。
最后说说工具类这样的存在吧。我们原先使用的语序规则是类.调用类的方法(),就是主谓。像鸟.飞(),鱼.游()。但是有的时候,会需要对主语的行为进行补充,或者干脆是主语的被动动作,这样我们就可以使用工具类,像这样:厨房工具类.吃(鸟)或者厨房工具类.吃(鱼),依然符合语序。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。