Day_8/08(List集合和Set集合)
目录
一、List集合
1、ArrayList集合
2、LinkedList集合
1、增加元素
2、查询元素
3、修改元素
4、删除元素
二、Set集合
1、HashSet集合
2、LinkedHashSet集合
三、总结
一、List集合
List集合继承自Collection接口,元素是以线性方式存储的,元素有序并且可以重复,存入顺序就是取出顺序可以使用下标和迭代器或增强型for循环遍历获取元素。
常用的方法有:
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。
public E get(int index)
:返回集合中指定位置的元素。
public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
其实就是增删改查,前面讲Collection集合的时候已经接触过ArrayList了,所以稍后使用LinkedList来测试一下。
1、ArrayList集合
ArrayList是List的一个具体实现类,它以数组结构存储数据,这样的好处是方便查询和遍历元素,不过增加和删除元素相对来说慢一点,在日常开发中,查询和遍历元素使用的相对较多,所以ArrayList也是最常用的集合,不过也不要随意的使用ArrayList集合来完成任何需求,这样不严谨,不提倡使用。
前面讲Collectiong集合和iterator迭代器的时候已经使用过ArrayList集合来测试了,这里就不再演示。
2、LinkedList集合
LinkedList也是List集合的一个具体实现类,和ArrayList集合不同的是LinkedList集合使用的是链式结构来存储数据的,这样的好处是方便增加和删除元素,同时LinkedList集合还提供了大量首尾操作的方法,代码演示如下:
1、增加元素
import java.util.LinkedList;public class Test {public static void main(String[] args) {//创建LinkedList集合对象LinkedList<String> strLinkedList = new LinkedList<>();//1、LinkedList集合增加元素//使用add方法(默认添加在集合尾部)strLinkedList.add("asd");//添加元素到指定的下标strLinkedList.add(0,"sdf");}
}
我们如何直到元素添加成功了呢?有几种办法,第一种,看集合添加元素前后的长度,如果添加一个元素之后,集合的长度增加了1,那么就说明添加成功了,第二种,在没有指定元素添加位置时,add方法是会有一个boolean值返回来的,可以通过输出查看add方法返回的值来判断是否添加成功,第三种,遍历输出;对于添加在指定位置的add方法我们可以直接查看指定下标处的值是否为我们添加的元素,后面这两种办法有一点缺陷,那就是List集合是允许元素重复的,如果恰好我们指定添加元素的位置的值和添加的元素的值相同,那么就不好判断了,所以最好还是使用返回值和集合长度来判断,看代码演示:
public class Test {public static void main(String[] args) {//创建LinkedList集合对象LinkedList<String> strLinkedList = new LinkedList<>();//1、LinkedList集合增加元素//添加元素前集合的长度System.out.println("添加元素前集合的长度为"+strLinkedList.size());//使用add方法(默认添加在集合尾部)System.out.println("元素添加的状态:"+strLinkedList.add("asd"));//添加元素到指定的下标strLinkedList.add(0, "sdf");//添加元素后集合的长度System.out.println("添加元素后集合的长度为"+strLinkedList.size());}
}
运行结果:
结果很显然,集合的长度在添加两个元素之后增加了2,不指定位置添加元素的时候add方法返回了一个true,这样即证明了元素添加成功。
下面看LinkedList集合提供的首尾操作的方法(添加元素到集合的首部和尾部):
public class Test {public static void main(String[] args) {//创建LinkedList集合对象LinkedList<String> strLinkedList = new LinkedList<>();//1、LinkedList集合增加元素//添加元素前集合的长度System.out.println("添加元素前集合的长度为"+strLinkedList.size());//使用add方法(默认添加在集合尾部)System.out.println("元素添加的状态:"+strLinkedList.add("asd"));//添加元素到指定的下标strLinkedList.add(0, "sdf");//添加元素到集合的首部strLinkedList.addFirst("dfg");//添加元素到集合的尾部strLinkedList.addLast("fgh");//添加元素后集合的长度System.out.println("添加元素后集合的长度为"+strLinkedList.size());//增强型for循环遍历输出一下,查看元素"dfg"和元素"fgh"是否分别添加在集合的首部和尾部for (String str : strLinkedList) {System.out.println(str);}}
}
运行结果:
结果很明显,"dfg"添加在集合的首部了,"fgh"添加在了集合的尾部。
2、查询元素
//2、查询元素System.out.println("集合的第一个元素为:"+strLinkedList.getFirst()); //获取集合的第一个元素并输出System.out.println("集合的最后一个元素为:"+strLinkedList.getLast()); //获取集合的最后一个元素并输出System.out.println("集合的第三个元素为:"+strLinkedList.get(2)); //获取集合指定位置的元素
在前面的基础上加上以上两句语句,运行结果如下:
这两个方法都是返回集合的元素,因为我开始存入集合的都是String对象,所以直接输出对象,就是我们要的String字符串。
3、修改元素
现在我要把集合的第三个元素修改为"zxcv",看代码:
//3、修改元素System.out.println("修改的结果为:"+strLinkedList.set(2,"zxcv"));
运行结果:
这里怎么不对呢,我不是把第三个元素修改为"zxcv"了吗?怎么还是"asd"呢?其实它是修改成功了的,因为set方法修改元素后返回的是被修改的元素,它告诉我们哪个元素被修改了,再来查看一下第三个元素:
//3、修改元素System.out.println("被修改的元素为:"+strLinkedList.set(2,"zxcv"));System.out.println("修改后的元素为"+strLinkedList.get(2));
运行结果:
这就是LinkedList集合中元素的修改了。
4、删除元素
下面再来看看删除元素,代码如下:
//4、删除元素System.out.println("remove方法不带参数默认删除的元素为:"+strLinkedList.remove());System.out.println("remove方法删除元素\"zxcv\"的状态为"+(strLinkedList.remove("zxcv")?"成功":"失败"));//再次遍历集合列表,看看是否删除成功for (String str : strLinkedList) {System.out.println(str);}
运行结果:
很显然,集合里面第一个元素"dfg"被不带参数的remove方法删除了,而元素"zxcv"则是被带一个参数的remove方法删除了,并且都删除成功,除此之外,LinkedList集合还提供了删除首部元素和尾部元素的方法以及清空集合的方法,代码如下:
//4、删除元素
// System.out.println("remove方法不带参数默认删除的元素为:"+strLinkedList.remove());
// System.out.println("remove方法删除元素\"zxcv\"的状态为"+(strLinkedList.remove("zxcv")?"成功":"失败"));System.out.println("集合的第一个元素:"+strLinkedList.removeFirst()+"已被删除");System.out.println("集合的最后一个元素"+strLinkedList.removeLast()+"已被删除");System.out.println("集合删除首部元素和尾部元素后"+(strLinkedList.isEmpty()?"为空":"不为空"));strLinkedList.clear();System.out.println("集合清空元素后"+(strLinkedList.isEmpty()?"为空":"不为空"));
这里演示了删除集合首部元素和尾部元素以及清空集合的方法,并且用isEmpty方法来判断集合是否为空,从而判断集合是否清空,clean方法和isEmpty方法前面都讲过了,它们都是Collection里面有的方法,LinkedList集合实现了List集合,而List集合又是Collection的子类,所以这些方法是LinkedList集合和ArraysList集合共有的。
二、Set集合
继承自Collection接口,与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,反而比Collection接口更加严格了。与List接口不同的是,Set接口都会以某种规则保证存入的元素不出现重复。
1、HashSet集合
HashSet集合是根据对象的哈希值来确定元素在集合中的存储位置的,元素无序,存取顺序不能保证一致
代码如下:
public class Test {public static void main(String[] args) {//创建HashSet集合对象HashSet<String> strHashSet = new HashSet<>();//先添加几个元素strHashSet.add("qwe");strHashSet.add("wer");strHashSet.add("ert");strHashSet.add("rty");for (String str : strHashSet) {System.out.println(str);}}
}
运行结果:
代码很简单,就是添加几个元素,之后遍历输出,但是这里有一个问题,输出的结果顺寻并不是我存数据的顺序,这里就体现出了Set集合元素无序,存取顺序不能保证一致。
数据不能重复,使用hashCode()和equals()方法保证数据唯一性
代码如下:
//先添加几个元素strHashSet.add("qwe");strHashSet.add("wer");strHashSet.add("ert");strHashSet.add("qwe");
运行结果:
你看,这里我添加了两次元素"qwe",但是只添加进一个,所以当集合里面添加一个集合中已经有的元素时,是添加不进去的,因为hashCode方法和equals方法保证了数据的唯一性。
元素无序,没有下标和get方法,不能使用下标访问元素,只能使用增强型for循环和迭代器访问
//迭代器访问元素Iterator iter = strHashSet.iterator();while(iter.hasNext()){System.out.println(iter.next());}System.out.println("--------迭代器访问和增强型for循环访问分界线---------");//增强型for循环访问元素for (String str : strHashSet) {System.out.println(str);}
运行结果:
存储数据类型为自定义类的时候,必须重写自定义类里面的hashCode和equals方法
看一段代码:
public class Test {public static void main(String[] args) {//创建HashSet集合对象HashSet<Animal> strHashSet = new HashSet<>();//先添加几个元素strHashSet.add(new Animal("大黄","黄色"));strHashSet.add(new Animal("大黑","黑色"));strHashSet.add(new Animal("大黄","黄色"));for (Animal animal : strHashSet) {System.out.println("名字是:"+animal.name+",颜色是"+animal.color);}}
}
class Animal{String name;String color;public Animal(String name, String color) {this.name = name;this.color = color;}public Animal() {}
}
运行结果:
这里好奇怪啊,Set类集合里面怎么可以村相同的元素进去了呢?前面说过, Set集合是通过hashCode()和equals()方法来保证数据唯一性,现在我们在集合里面存放的是自己定义的数据类型,必须要重写hashCode()和equals()方法才可以,看代码:
PS:在ldea里面我们直接使用Alt+Insert组合键就可以自动生成了
public class Test {public static void main(String[] args) {//创建HashSet集合对象HashSet<Animal> strHashSet = new HashSet<>();//先添加几个元素strHashSet.add(new Animal("大黄","黄色"));strHashSet.add(new Animal("大黑","黑色"));strHashSet.add(new Animal("大黄","黄色"));for (Animal animal : strHashSet) {System.out.println(animal);}}
}
class Animal{String name;String color;public Animal(String name, String color) {this.name = name;this.color = color;}public Animal() {}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Animal)) return false;Animal animal = (Animal) o;return Objects.equals(name, animal.name) && Objects.equals(color, animal.color);}@Overridepublic int hashCode() {return Objects.hash(name, color);}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", color='" + color + '\'' +'}';}
}
运行结果:
此时发现,重写了hashCode()和equals()方法之后元素就不能重复了,这里我也重写了toString方法,这样就可以通过输出元素名来输出元素里面的值了。
2、LinkedHashSet集合
我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
在HashSet下面有一个子类java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。
代码演示如下:
public class Test {public static void main(String[] args) {//创建LinkedHashSet集合对象LinkedHashSet<String> strLinkedHashSet = new LinkedHashSet<>();//添加几个元素strLinkedHashSet.add("qaz");strLinkedHashSet.add("wsx");strLinkedHashSet.add("edc");strLinkedHashSet.add("qaz");//遍历输出for (String str : strLinkedHashSet) {System.out.println(str);}}
}
运行结果:
三、总结
1、List集合允许元素重复,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
2、Set集合不允许元素重复,使用hashCode和equals方法来保证元素的唯一性,元素无序,不能保证存入顺序和取出顺序一致,没有下标,只能通过迭代器或增强型for循环来访问。
Day_8/08(List集合和Set集合)相关推荐
- 1-17 Set集合和Map集合
Hash表 Hash,一般翻译做"散列",也有直接音译为"哈希"的,它是基于快速存取的角度设计的,也是一种典型的**"空间换时间"**的做法 ...
- scala集合和java集合的转换-List
scala集合和java集合的转换-List scala的List要想转换成java的list 需要导入对应的类scala.collection.JavaConverters._ import jav ...
- Map集合和List集合总结
Map集合和List集合哪个效率更高 List接口 List集合是一个元素有序(存储有序).可重复的集合,集合中的每个元素都有对应的索引,以便于查询和修改,List集合是允许存储null值的. Lis ...
- Collection集合和Map集合循环遍历三种方法
Collection集合的四种遍历方式: 1.迭代器 public static void main(String[] args) {List<String> list = new Arr ...
- Java-Collection集合和Map集合总结
本文欢迎转载,转载前请联系作者,经允许后方可转载.转载后请注明出处,谢谢! http://blog.csdn.net/colton_null 作者:喝酒不骑马 Colton_Null from CSD ...
- Set集合和List集合
List:有序可重复 ArrayList: 写入数据时,数据在尾部的时候快,取数快 LinkedList: 集合中间部分添加值和删除值得时候快 Set:不包含重复元素,但是无序, ...
- 7.Set集合总结(TreeSet集合和HashSet集合)
一.Set集合 1.Set集合特点 可以去除重复 存取顺序不一致 没有带索引的方法,所以不能使用普通的for循环遍历,也不能通过索引来获取.删除Set集合里面的元素. 2.Set集合中元素的遍历 二. ...
- HashMap集合和TreeMap集合
---------------------------HashMap集合的遍历 /第一种 package ji_he;import java.util.*;public class Example16 ...
- HashSet集合和TreeSet集合
-----------------------------------HashSet集合 ///HashSet集合的遍历 package ji_he;import java.util.HashSet; ...
最新文章
- 态势“知”多少,点开就知道
- shell 脚本 文件夹扫描获取文件
- 【maven插件】flatten-maven-plugin : 处理版本占位符
- Error与RuntimeException
- linux svn 常用命令
- scala闭包 变量_Scala闭包,自由和绑定变量,匿名函数
- 计算机软件登记文档,计算机软件著作权登记申请表范本
- 红宝书新日本语能力考试N1~N5全套资料PDF分享 ​​
- Centos7 下配置mail使用163邮箱发送邮件
- 第六章 使用 matplotlib 绘制热力图
- 关于请求_小七_新浪博客
- COOC+VOSviewer可取代任何文献计量与知识图谱软件
- OSChina 周一乱弹 —— 花式遛狗法
- pq下垂控制单相逆变器matlab仿真,学习下垂控制的逆变器并联原理,如何实现仿真P1?-控制器/处理器-与非网...
- 用函数调用编写程序,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。s=1+1/(1+2)+...+1/(1+2+3+...+n).)
- FTP上传成功之后却查找不到文件
- 为什么MD5算法不可逆,但网上有很多网站声称能够解密MD5
- 高新技术八大领域详细分类
- 计算机主机接电视机,电脑连接电视,详细教您电脑连接电视当显示器的方法
- 电气设备常用文字符号新旧对照表
热门文章
- 《自然杂志》19卷4期的 ‘探索物理学难题的科学意义'的 97个悬而未决的难题
- 直播、点播系统开发项目总结(本地视频、抓包视频、直播推流、网络直播、平台搭建等相关问题点记录)
- Oracle 插入insert语句
- 1421. 净现值查询(SQL)
- 卡巴斯基杀毒软件被曝出用户上网痕迹泄露漏洞
- 计算机word做课程表实验报告,《用Word制作课程表》“学讲方式”案例分析
- 实现用户端的充值、修改密码、查看个人信息、保存用户的信息到文件操作
- 如何开好项目例会︱中科南京软件技术研究院PMO项目主管薛晓娜
- mysql索引过长Specialed key was too long问题记录
- STC89C52RC的特殊功能寄存器