Java编程基础(九)
集合类
Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。
Java中提供了不同的集合类,这些类具有不同的存储对象,同时提供了相应的方法,以方便用户对集合进行遍历、添加、删除和查找指定的对象。
集合与数组的不同
数组的长度是固定的,集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。
说明
与数组相同,集合的索引也是从0开始
Conllection接口
Collection接口是层次结构中的根接口,构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List集合与Set集合是通用的。
List集合
List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。类似Java数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。
List接口
List接口继承了Collection接口,因此包含Collection接口中的所有方法。
List接口的实现
ArrayList类
ArrayList类实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢。
使用:
//创建ArrayList集合的对象
ArrayList<String> list = new ArrayList<>();
//添加元素
list.add("水菜丽");
//插入元素
list.add(2, "深田咏美");
//将newList1集合中所有的元素插入到list集合的末尾位置
ArrayList<String> newList1 = new ArrayList<>();
Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//使用集合工具类批量添加
list.addAll(newList1);
//将newList2集合中所有的元素插入到list集合的指定位置
ArrayList<String> newList2 = new ArrayList<>();
Collections.addAll(newList2, "xxx","yyy","zzz");//使用集合工具类批量添加
list.addAll(3, newList2);
//获取集合中元素的个数
int size = list.size();
System.out.println("获取集合中元素的个数:" + size);
//设置指定下标上的元素
list.set(1, "凉森尤梦");
//获取指定下标上的元素
String str = list.get(1);
System.out.println("获取指定下标上的元素:" + str);
//清空集合中所有的元素
//list.clear();
System.out.println("判断此集合中是否包含某个元素:" + list.contains("凉森尤梦"));
System.out.println("判断此集合中是否包含另一个集合:" + list.containsAll(newList1));
System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));
System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));
System.out.println("判断集合中是否没有元素:" + list.isEmpty());//(没有元素-true,有元素-false)
//根据元素删除元素
list.remove("水菜丽");
//根据下标删除元素
list.remove(2);
//从list集合中删除newList2中包含的所有元素 - 去除交集
list.removeAll(newList2);
//保留交集
list.retainAll(newList1);
//将集合转换为字符串
Object[] arr = list.toArray();
System.out.println("将集合转换为字符串:" + Arrays.toString(arr));
//获取集合中从开始下标处(包含)到结束下标处(不包含)的元素,并返回新的集合
List<String> subList = list.subList(1, 3);
System.out.println("截取元素:" + Arrays.toString(subList.toArray()));
System.out.println("-------------------");
//遍历1 -- for循环
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("-------------------");
//遍历2 -- foreach
for (String element : list) {
System.out.println(element);
}
System.out.println("-------------------");
//遍历3 -- Iterator
Iterator<String> it = list.iterator();//获取迭代器对象
while(it.hasNext()){//判断是否有可迭代的元素
String next = it.next();//返回下一个元素
System.out.println(next);
}
System.out.println("-------------------");
//遍历4 -- ListIterator
ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){//判断是否有可迭代的元素
String next = listIterator.next();//返回下一个元素
System.out.println(next);
}
LinkedList类
LinkedList类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象。需要向集合中插入、删除对象时,使用LinkedList类实现的List集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率较低。
LinkedList和ArrayList都实现了List接口,所以方法调用的是一样的
LinkedList新增的方法
while(!list.isEmpty()){
//删除第一个元素,并返回
String element = list.removeFirst();
System.out.println(element);
//删除最后一个元素,并返回
String element = list.removeLast();
System.out.println(element);
}
Set集合
Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象。 Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象。
Set接口
Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2比较,结果都不相等
Set接口的实现
HashSet类
HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证Set集合的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null元素。
使用:
//创建HashSet集合的对象
HashSet<String> set = new HashSet<>();
//添加元素
set.add("麻生希");
//将newSet1集合中所有的元素插入到set集合的末尾位置
HashSet<String> newSet1 = new HashSet<>();
Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//使用集合工具类批量添加
set.addAll(newSet1);
//获取集合中元素的个数
int size = set.size();
System.out.println("获取集合中元素的个数:" + size);
//清空集合中所有的元素
//set.clear();
System.out.println("判断此集合中是否包含某个元素:" + set.contains("樱井步"));
System.out.println("判断此集合中是否包含另一个集合:" + set.containsAll(newSet1));
System.out.println("判断集合中是否没有元素:" + set.isEmpty());//(没有元素-true,有元素-false)
//根据元素删除元素
set.remove("水菜丽");
//从set集合中删除newSet1中包含的所有元素 - 去除交集
set.removeAll(newSet1);
//保留交集
HashSet<String> newSet2 = new HashSet<>();
Collections.addAll(newSet2, "桥本有菜","樱井步","麻生希");
set.retainAll(newSet2);
//将集合转换为字符串
Object[] arr = set.toArray();
System.out.println("将集合转换为字符串:" + Arrays.toString(arr));
System.out.println("-------------------");
//遍历 -- Iterator
Iterator<String> it = set.iterator();//获取迭代器对象
while(it.hasNext()){//判断是否有可迭代的元素
String next = it.next();//返回下一个元素
System.out.println(next);
}
TreeSet类
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。
Iterator迭代器接口
//foreach底层使用iterator去实现
// String element;
// for(Iterator<String> it = list.iterator();it.hasNext();System.out.println(element)){
// element = it.next();
// }
迭代器的作用
有些接口类没有提供get()操作,可用迭代器来获得信息。所有Collection接口的子类、子接口都支持Iterator迭代器。
迭代器模式
迭代器(Iterator)模式,又称为游标(Cursor)模式。下面给出它的官方定义:提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节,这就是迭代器。
迭代器模式角色组成
迭代器角色(Iterator):负责定义访问和遍历元素的接口。
具体迭代器角色(Concrete Iterator):实现迭代器接口,并记录遍历中的当前位置。
容器角色(Container):负责提供创建具体迭代器角色的接口。
具体容器角色(Concrete Container):实现创建具体迭代器角色的接口——这个具体迭代器角色与该容器的结构相关。
总结
1、Iterator可遍历Collection下的集合
2、可以在遍历时,使用Iterator删除元素(注意:不能在迭代器中使用集合区删除元素;原因:操作数和内部操作数不一致就会导致报错)
3、遍历ArrayList集合可以使用ListIterator,并且使用方式和Iterator一样(注意:List接口下的实现类才能获取ListIterator的对象)
4、遍历ArrayList集合可以使用ListIterator对元素进行删除、添加操作
5、遍历ArrayList集合可以使用ListIterator指定下标、倒叙开始遍历
Map集合
提供了key到value的映射,Map集合中不能包含相同的key,每个key只能映射一个value。key还决定了存储对象的在映射中的存储位置,但不是由key对象本身决定的,二是通过一种“散列技术”进行处理,产生一个散列码的整数值。
Map接口
Map接口中除集合常用方法外的特殊方法
方法 | 功能描述 |
---|---|
put(K key,V value) | 向集合中添加指定的key与value的映射关系 |
containsKey(Object key) | 如果此映射包含指定的映射关系,则返回true |
containsValue(Object value) | 如果此映射将一个或多个key映射的指定值,则返回true |
get(Object key) | 如果存在指定的key对象,则返回该对象对应的值,否则返回null |
keySet() | 返回该集合中的所有的key对象形成的Set集合 |
values() | 返回该集合中所有值对象形成的Collection集合 |
Map接口的实现类
HashMap类
HashMap类是基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。HashMap类通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
TreeMap类
TreeMap类不仅实现了Map类的接口,还实现了Java.util.SortedMap接口,因此集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap类比HashMap类性能稍差。由于TreeMap类实现的Map集合中的映射关系是根据键对象按照一定的顺序排序的,因此不允许键对象是null。