Java编程基础(九)

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChlinRei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值