Collection集合家族
集合家族

- 数组:存储相同类型的多个元素
- 对象:存储不同类型的多个元素
- 集合:存储多个不同类型的对象
List
List继承自Collection接口,是有序可重复的集合。
它的实现类有:ArrayList、LinkedList、Vector、Stack
ArrayList
本质上是一个能存储任意类型的对象的动态数组,元素的删除和添加涉及到数组的扩容以及拷贝元素,所以效率很慢。由于数组是可以通过下标来查找的,因此查找速度快。
LinkedList
基于双向链表实现,增删快,查找慢。根据链表的性质,增加元素时只需让前一个元素记住自己就行,删除的时候让前一个元素记住后一个元素,后一个元素记住前一个元素,这种增删的效率比较高,但查找元素需要遍历链表,效率低。
public static void main(String[] args){
List<Dog> list = new LinkedList<>();
System.out.println(list.size());
Dog dog1 = new Dog("小苏","藏獒");
Dog dog2 = new Dog("小王","二哈");
Dog dog3 = new Dog("小李","金毛");
((LinkedList<Dog>) list).addFirst(dog1);
list.add(dog2);
((LinkedList<Dog>) list).addLast(dog3);
System.out.println(list);
System.out.println(((LinkedList<Dog>) list).getFirst());
System.out.println(list.get(1));
System.out.println(((LinkedList<Dog>) list).getLast());
}
Vector
基于数组实现,线程同步的遗留集合类,和ArrayList原理相同,但是线程安全,效率低。
Stack
后进先出
Set
Set继承自Collection接口,是无序不可重复的集合
它的实现类有HashSet、LinkedHashSet、TreeSet
HashSet
基于哈希表实现,元素存储的地址是该元素的哈希值。
HashSet存储元素的步骤:
- 通过哈希算法计算元素的哈希值
- 判断集合中哈希值得位置是否已经有元素
- 若没有,则将元素添加到该位置
- 若有,使用equals方法判断该元素和已有的元素是否相等,相等则不添加,不相等则添加
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("邵阳---长沙");
set.add("武汉---南京");
set.add("合肥---北京");
set.add("武汉---南京");
System.out.println("-------第一种输出方式:toString方法--------");
System.out.println(set);
System.out.println("-------第二种输出方式:增强for循环--------");
for (String str: set) {
System.out.println(str);
}
System.out.println("-------第三种输出方式:迭代器方法--------");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// set集合是无序的,因此没有下标,无法用for循环来遍历
}
@Test
public void setObject(){
Set<Student> set = new HashSet<>();
set.add(new Student("小贝 ",9));
set.add(new Student("小胡 ",19));
set.add(new Student("小贝 ",9));
set.add(new Student("小福 ",23));
Iterator<Student> iterator = set.iterator();
while (iterator.hasNext()){
/*
* 由于hash表示无序的,因此输出结果可能和存储结果不一致
*/
System.out.println(iterator.next().toString());
}
/*
* 若Student类重写了equals方法,则第二个小贝不会被存入set,
* 这种情况下只会比较两个小贝的名字和年龄的值,因为两个小贝的名字和年龄一样,因此他们被认为是两个相同的对象
* 若Student类没有重写equals方法,则第二个小贝会被存入set,
* 这种情况下只会比较两个小贝的地址,因为是两个不同的对象所以地址不同,因此他们被认为是两个不同的对象
*/
}
/*
* 被重写的equals方法
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
/*
* 注意基本类型的变量直接用==比较,而对象类型的,分情况讨论:
* 若只比较值,则用equals方法,因为String类重写了equals方法
*/
}
LinkedHashSet
基于哈希表和双向链表实现,元素有序且不可重复,存储步骤和HashSet一致,元素的顺序是其存储顺序
@Test
public void printLinkedHashList() {
Set<String> set = new LinkedHashSet<>();
set.add("绝地求生");
set.add("球球大作战");
set.add("守望先锋");
set.add("超级玛丽");
set.add("超级玛丽");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
/* 输出结果和存储结果一致:
* 绝地求生
* 球球大作战
* 守望先锋
* 超级玛丽
*/
}
TreeSet
TreeSet是基于红黑树的有序且不可重复的集合,元素的顺序和元素本身有关,和存储顺序无关
/*
* 这个方法在执行的时候会报错,因为在TreeSet在存储时不知道根据学生的姓名还是年龄来排序,准确地说,Student * 类没有实现Comparable接口,因此无法对Student排序。将一组乱序的数字或字符串存入TreeSet,重新输出会得到* 一组有序的数据,因为String类默认实现了Comparable接口。
* 报错信息如下:java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
*/
@Test
public void testSort() {
Set<Student> set = new TreeSet<>();
set.add(new Student("小贝 ",9));
set.add(new Student("小胡 ",19));
set.add(new Student("小贝 ",10));
set.add(new Student("小福 ",23));
Iterator<Student> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
/*
* 对Student类进行修改,让他继承Comparable接口,并重写Comparable里的comparaTo方法,按照学生的年龄进行* 排序
*/
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public void comparaTo() {
}
@Override
public int comparaTo(Student o) {
/*
* 结果为负,排在o对象之前
* 结果为正,排在o对象之后
* 结果为0, 说明两个对象相等
*/
return this.age - o.age;
}
}
Collection集合家族的更多相关文章
- 浅谈Collection集合
俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ...
- Collection集合的功能及总结
Collection集合是集合顶层接口,不能实例化 功能 1.添加功能 boolean add(Object obj):添加一个元素 boolean addAll(Collection c):添加一个 ...
- JAVA collection集合之 扑克牌游戏
主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...
- Collection集合List、Set
Collection集合,用来保存一组数据的数据结构. Collection是一个接口,定义了所有集合都应该包含的特征和行为 Collection派生出了两类集合 List和Set List接口:Li ...
- Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
首先,我们先看一下Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组允许重复的对象.Collection接口派生了两个子接口Set和 ...
- java.util.Map按照key值合并的value的Collection 集合中。
用java实现把多个map的内容合并的一个resultMap中 代码大致如下 /** * @author Shalf */ public class MapUtil { /** * 把partMa ...
- javad的Collection集合
集合框架:★★★★★,用于存储数据的容器. 特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合 ...
- Java基础知识强化之集合框架笔记13:Collection集合存储学生对象并遍历
1. Collection集合存储学生对象并遍历: 需求:存储自定义对象并遍历Student(name,age) 分析: (1)创建学生类 (2)创建集合对象 (3)创建学生对象 (4)把学生对象添加 ...
- Java基础知识强化之集合框架笔记12:Collection集合存储字符串并遍历
1. Collection集合存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)把字符串对象添加到集合中 (4)遍历集合 2. 代码示例: package cn.itcast ...
随机推荐
- jmeter性能工具 之监控cpu,内存等信息(四)
1.jmeter 本身不支持直接监控 cpu,内存等信息,需要去官网下载控件 JMeterPlugins-Standard-1.4.0.zip 解压好将其中\lib\ext\JMeterPlug ...
- Centos7.5中的SElinux操作命令说明
设置Selinux模式 setenforce 0 0表示警告模式 1表示强制模式 关闭要设置/etc/sysconfig/selinux下将"SELINUX=enforcing"改 ...
- Fabric的使用总结
环境说明 建议python版本:2.7 fabric版本:最新版(当前为1.10.2) fabric安装 通过pip.py的方式安装(详细可以在fabric官网了解) fabric执行py文件的方法, ...
- linux运维、架构之路-MySQL主从复制
一.MySQL主从复制原理图 MySQL主从复制原理:实现主从复制原理是三个线程完成的,主的I/O线程,备的I/O线程与SQL线程 1.首先主库db01需要开启binlog.授权一个replicat ...
- C#[WinForm]实现自动更新
C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...
- 【CDN+】 Spark 的入门学习与运行流程
前言 上文已经介绍了与Spark 息息相关的MapReduce计算模型,那么相对的Spark的优势在哪,有哪些适合大数据的生态呢? Spark对比MapReduce,Hive引擎,Storm流式计算引 ...
- TCP概述
1. TCP提供的服务 我们知道TCP是一个面向连接.提供可靠数据数据传输服务的传输层协议.面向连接意味着发送端和接收端在交换数据前需要建立一个连接,和我们平常打电话一样,在通话前,需要拨号建立连接. ...
- 在reshard过程中,将会询问reshard多少slots:
How many slots do you want to move (from 1 to 16384)?,取值范围为1~16384,其中16384为redis cluster的拥有的slots总数, ...
- org.w3c.dom。 XML解析 练习
HTML文档 1 import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; ...
- Cordova指令
安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld cordov ...