集合家族

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

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. map接口、hashmap常用方法

    注意:map中键不能重复(是否重复是根据equals方法判断),否则新的会覆盖为旧的 范例: public class TestMap { public static void main(String ...

  2. 多个webView嵌套在UIScrollView里面内存优化

    之前一直纠结在使用UIWebView上,发现加载6个UIWebView占用了290M左右内存,切换时还会增加.后来看到一篇文章:http://blog.csdn.net/kongu/article/d ...

  3. 实现网页qq在线咨询功能

    在自己的网页中实现qq在线咨询,给图片或链接添加地址为:tencent://message/?uin=你的qq号码!就可以了. <a href="tencent://message/? ...

  4. [USACO17FEB]Why Did the Cow Cross the Road III G (树状数组,排序)

    题目链接 Solution 二维偏序问题. 现将所有点按照左端点排序,如此以来从左至右便满足了 \(a_i<a_j\) . 接下来对于任意一个点 \(j\) ,其之前的所有节点都满足 \(a_i ...

  5. FastDFS介绍(一)

    1.简介 FastDFS对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载.文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站.文档网站.图片 ...

  6. [CSS]CSS浮动塌陷及解决办法

    一. CSS浮动 先看一个例子 <html !DOCTYPE> <head> <title>HTML2</title> <style> .d ...

  7. 如何利用阿里视频云开源组件,快速自定义你的H5播放器?

    摘要: Aliplayer希望提供一种方便.简单.灵活的机制,让客户能够扩展播放器的功能,并且Aliplayer提供一些组件的基本实现,用户可以基于这些开源的组件实现个性化功能,比如自定义UI和自己A ...

  8. 轮询,WebSocket和P2P--记一次QQ交谈IM

    问题:

  9. php面试专题---13、AJAX基础内容考点

    php面试专题---13.AJAX基础内容考点 一.总结 一句话总结: ajax对提升用户速度,缓解服务器压力方面也是很有可取之处的,毕竟传递的数据少了 1.AJAX基础概念? Asynchronou ...

  10. C#如何获取系统downloads和documents路径

    https://stackoverflow.com/questions/7672774/how-do-i-determine-the-windows-download-folder-path 如果你通 ...