集合家族

  • 数组:存储相同类型的多个元素
  • 对象:存储不同类型的多个元素
  • 集合:存储多个不同类型的对象

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存储元素的步骤:

  1. 通过哈希算法计算元素的哈希值
  2. 判断集合中哈希值得位置是否已经有元素
  3. 若没有,则将元素添加到该位置
  4. 若有,使用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集合家族的更多相关文章

  1. 浅谈Collection集合

    俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ...

  2. Collection集合的功能及总结

    Collection集合是集合顶层接口,不能实例化 功能 1.添加功能 boolean add(Object obj):添加一个元素 boolean addAll(Collection c):添加一个 ...

  3. JAVA collection集合之 扑克牌游戏

    主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...

  4. Collection集合List、Set

    Collection集合,用来保存一组数据的数据结构. Collection是一个接口,定义了所有集合都应该包含的特征和行为 Collection派生出了两类集合 List和Set List接口:Li ...

  5. Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

    首先,我们先看一下Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组允许重复的对象.Collection接口派生了两个子接口Set和 ...

  6. java.util.Map按照key值合并的value的Collection 集合中。

    用java实现把多个map的内容合并的一个resultMap中 代码大致如下 /**  * @author Shalf  */ public class MapUtil { /** * 把partMa ...

  7. javad的Collection集合

    集合框架:★★★★★,用于存储数据的容器. 特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合 ...

  8. Java基础知识强化之集合框架笔记13:Collection集合存储学生对象并遍历

    1. Collection集合存储学生对象并遍历: 需求:存储自定义对象并遍历Student(name,age) 分析: (1)创建学生类 (2)创建集合对象 (3)创建学生对象 (4)把学生对象添加 ...

  9. Java基础知识强化之集合框架笔记12:Collection集合存储字符串并遍历

    1.  Collection集合存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)把字符串对象添加到集合中 (4)遍历集合 2. 代码示例: package cn.itcast ...

随机推荐

  1. maven 配置阿里云镜像

    编辑%maven_home%/conf/settings.xml文件,添加 <mirror> <id>aliyun-maven</id> <mirrorOf& ...

  2. 多边形面积计算公式 GPS经纬度计算面积

    最近在做地图相关面积计算显示工作,百度了很多关于多边形面积计算方面公式和代码,只能说贼费劲,最终完成了把结果展示下     原理:鞋带公式 定义:所述鞋带式或鞋带算法(也称为高斯的面积公式和测量员的式 ...

  3. Android SDK说明(图)

  4. LightOJ 1079 Just another Robbery (01背包)

    题目链接 题意:Harry Potter要去抢银行(wtf???),有n个银行,对于每个银行,抢的话,能抢到Mi单位的钱,并有pi的概率被抓到.在各个银行被抓到是独立事件.总的被抓到的概率不能超过P. ...

  5. 【leetcode】870. Advantage Shuffle

    题目如下: 解题思路:几千年前,一个古人曾经解过这个题目,他的名字叫做田忌,后人称他的解题思想叫做“田忌赛马”.言归正传,本题就是一个田忌赛马的问题,先将A与B进行排序,然后判断A[0]与B[0]的大 ...

  6. 定时任务crond

    在服务器上使用crond完成定时操作很方便, 下面简单记录一下. 常用的命令主要有以下三个: (1)编辑定时任务 crontab -e (2)   查看定时任务 crontab -l (3)  删除定 ...

  7. php接受post传值的方法

    这段时间在研究php的接口,利用jmeter模拟发送数据给php服务器,看php如何接收post传输过去的数据,遇到了几个问题,经过一番度娘之后终于有所理解,记录一下: 这里记录常用的两种post方式 ...

  8. SQL Server性能调优--索引

    序言 索引的概念 索引是什么 数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书.在数据库中,数据库程序使用索引可以快速查询到表中的数据,而不必扫描整个表. ...

  9. Oracle数据库字符集问题

    Oracle数据库的字符集问题,也涉及作为服务器操作系统的CentOS或者Windows的字符集与Oracle字符集之间的关联关系Oracle的字符集,这个问题的提出是因为两个原因:一是遇到一个DMP ...

  10. 冲刺CSP-S集训考试反思+其它乱写(密码私信)

    RT.开坑. 10.1 开门黑23333. 放假回来稍困,而且感冒似乎愈加严重,导致我正常考试基本睁不开眼.一个小时勉强把题读懂,神志恍惚如斯. 看T2觉得估计又是各种推柿子堆定理的数学大题,写了个暴 ...