集合家族

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

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. flask之视图函数从前端接收数据的方法

    一:从前端接收查询字符串  query-string 注意:get和post都可以在url后面添加查询字符串?a=1&b=2 测试工具:postman 1:get方式接收 视图函数 from ...

  2. ubuntu + JetSonNano+OpenCV3.4.8

    首先强调一点,如果要配置darknet环境,不建议安装该版本!!! 安装opencv前,建议先检测自己的系统是否已经装过其他版本, 检查方式: (1)查看是否安装opencv库: pkg-config ...

  3. 【CF1243C】 Tile Painting【思维】

    题意:给定长度为n的方块,要求染色,需要满足:当|j-i|>1且n%|j-i|==0时,两格颜色相同,求做多可以染多少种颜色 题解:求出n的所有质因子 1.若只有一种质因子,则答案为该质因子 2 ...

  4. 使用PHPExcel操作Excel用法实例分析

    本文实例分析了使用PHPExcel操作Excel用法.分享给大家供大家参考.具体分析如下: PHPExcel下载地址:http://www.codeplex.com/PHPExcel http://w ...

  5. div 上禁止复制的css实现方法

    div { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-se ...

  6. Failed to load resource: the server responsed with a status of 400 (Bad Request)

    浏览器报错:Failed to load resource: the server responsed with a status of 400 (Bad Request) ajax请求失败,一般情况 ...

  7. 【ABAP系列】SAP ABAP基础-程序优化及响应速度之LOOP

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP基础-程序优化及 ...

  8. 爬虫(十一)—— 请求库(三)pypeteer请求库

    曾经使用模拟浏览器操作(selenium + webdriver)来写爬虫,但是稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很容易就可以 ...

  9. javaweb的Filter过滤器设置全站编码

    FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...

  10. linux下shell显示git当前分支

    function git-branch-name { git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3 } functio ...