Collection接口

  • Collection集合框架的层次结构
graph TDA[Collection接口] --> B(List接口)A --> C(Set接口)A --> D(Iterator接口)B --> E(ListIterator接口)D --> EB --> F(ArrayList)B --> G(LinkedList)B --> H(Vector)C --> I(HashSet)C --> J(TreeSet)H --> K(Stack)

在这里无法显示,补图

  • List 有序集合,允许相同元素和null

    • LinkedList 非同步,允许相同元素和null,遍历效率低插入和删除效率高
    • ArrayList 非同步,允许相同元素和null,实现了动态大小的数组,遍历效率高,用的多
    • Vector 同步,允许相同元素和null,效率低
      • Stack 继承自Vetor,实现一个后进先出的堆栈
  • Set 无序集合,不允许相同元素,最多有一个null元素
    • HashSet 无序集合,不允许相同元素,最多有一个null元素
    • TreeSet 有序集合,不允许相同元素,最多有一个null元素

Map接口

graph TDA[Map接口] --> B(HashMap)A --> C(HashTable)A --> D(TreeMap)

  • Map 没有实现Collection接口,key不能重复,value可以重复,一个key映射一个value

    • Hashtable 实现Map接口,同步,不允许null作为key和value,用自定义的类当做key的话要重写hashCode和equals
    • HashMap 实现Map接口,非同步,允许null作为key和value,用的多
    • TreeMap 实现Map接口,非同步
    • WeakHashMap 实现Map接口

Collection接口

  • Collection是最基本的集合接口,一个Collection代表一组Object即Collection元素(Elements)

  • 由Collection接口派生的两个接口是List和Set

  • List接口

    1. List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能够使用索引来访问List中的元素,类似于Java的数组
  • LinkeList类
    1. LinkedList实现了List接口,允许null元素,LinkenList底层才用了双向链表来存储数据,每个存储着上一个节点和下一个节点的地址以及本节点的数据。
    2. LinkedList没有同步方法。如果多线程同时访问一个List,则必须自己实现访问同步,解决方法是在创建List时构造一个同步的List
    3. 查询效率低,删除新增效率高
    4. 双向链表存储
List<Object> list1 = Collections.synchronizedList(new LinkedList<>());
  • ArrayList类
    1. ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList底层采用动态数组的存储方式,便利效率非常高,ArrayList是线程不安全的。
    2. 线性存储
    3. 查询效率高,新删效率低
  • Vector类
    1. Vector非常类似ArrayList,但是Vector是同步的
  • Stack类
    1. Stack继承自Vector,实现一个后进后出的堆栈
    2. Stack刚创建后是空栈
  • Set接口

    1. Set是一种无序的并且不包含重复的元素的Collection,用equals判断是否相同
    2. Set最多有一个null元素
  • HashSet类
    1. HashSet是哈希表实现的,HashSet中的数据是无序的,可以放入null,当只能放入一个null
    2. HashSet存的数据不能重复
    3. HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
    4. 哈希值散列存储
  • TreeSet
    1. 自然循序排序,二叉树结构存储
  • ArrayList和LindedList的区别:
    1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
    2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
    3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

Map接口

  • Map没有继承Collection接口,Map提供key到value的映射

  • 一个Map中不能包含相同的key,每个key只能映射value

  • Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key映射

  • Hashtable类

    1. Hashtable继承Map接口,实现一个key-value映射的哈希表
    2. 任何非空(non-null)的对象都可作为key或者value
    3. Hashtable是同步的
  • HashMap类

    1. HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key
  • WeakHashMap类

    1. WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

集合操作工具类

  • jdk提供了一个集合操作工具类,包含了一组静态的方法,实现了对集合进行查询,排序,拷贝等操作
//创建一个集合保存20个随机整数
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {list.add(new Random().nextInt(100));
}
System.out.print("排序前的数据:");
for (Integer i : list) {System.out.print(i+"\t");
}
Collections.sort(list);//使用工具类进行排序 --是升序排序
Collections.reverse(list);//使用工具类对集合进行反向存储
System.out.println();
System.out.print("排序后的数据:");
for (Integer i : list) {System.out.print(i+"\t");
}
System.out.println();
System.out.println("集合中最大值为:"+Collections.max(list));
System.out.println("集合中最小值为:"+Collections.min(list));

List集合

  1. List集合保存的数据有顺序的
  2. List集合保存的数据可能有重复保存,有重复
  3. ArrayList类实现的集合是一个数组列表,在内存存储时是连续存放的,具有很高的查询性能Vector类的功能与ArrayList一致,在内存存储时是连续存放的,具有很高的查询性能
  4. ArrayList是线程不安全的,Vector是线程安全的,ArrayList的效率高于Vector,Vector的安全性高于ArrayList
  5. List集合默认保存Object类型的数据
  6. 新增集合中的数据:存放数据,保存数据没有做数据类型的检查
  7. 同一对象可以保存两次

Set散列结合

  1. Set集合保存的数据是唯一的,不会重复的
  2. Set集合保存的数据是无序的(不会根据添加数据的先后顺序进行保存,取数据也不会按照添加的先后顺序进行获取)
  3. HashSet类在新增数据时效率很高,查询效率没有List集合高
    TreeSet类实现了一个SortedSet接口,使用树形结构实现了可排序的集合
  4. HashSet具有较高的新增性能,TreeSet具有较高的查询性能
//使用Set集合,生成1-25之内,不重复的7个随机整数
//Set<Integer>泛型编程,泛型集合
//泛型集合在定义变量时,使用尖括号声明要保存的数据的具体类型(泛型)
Set<Integer> set = new HashSet<>();
while(true) {//集合不能保存基本数据类型,当保存基本数据类型到集合中时,会进行自动装箱成Interger对象set.add(new Random().nextInt(25)+1);//随机生成的数据可能有重复,相同的数据不会重复添加到set集合中if (set.size()>6) break;
}
for (Integer i : set) {//定义集合时使用了泛型集合,即声明了要保存的数据类型,取数据时可以直接获取目标类型的数据System.out.print(i+"\t");
}

链表集合

  1. 链表集合的元素有三个信息构成:它会保存前后数据的信息(地址),具有很高的修改性能
  2. 链表结构在存储信息时不一定是连续存放的,查询效率没有ArrayList高
  3. LinkeList类实现了链表结构

队列集合

  1. 队列结构具有先进先出,后进后出的特点
  2. Queue接口和Deque接口决定了队列的操作
  3. LinkedList类实现了队列接口,可以按照队列的操作进行保存
  4. addFirst,addLast
//队列结构
Deque<String> deque = new LinkedList<>();
//数据新增
deque.add("第一条数据");//添加一条数据到队列的尾部
deque.addLast("第二条数据");//添加一条数据到队列的尾部
deque.addFirst("第三条数据");//双端队列可以添加数据到队列的头部
//查询数据
System.out.println("队列集合的长度为:"+deque.size());//输出的结果为3
System.out.println(deque.getLast());//双端队列可以从尾部读取数据,输出结果为第二条数据
System.out.println(deque.element());//从头部取出数据不删除,输出的结果为第三条数据
System.out.println(deque.removeLast());//从尾部取出数据并删除,输出结果为第二条数据
System.out.println("队列集合的长度为:"+deque.size());//输出的结果为2

栈集合

  1. 栈结构具有先进后出,后进先出的特点
  2. Stack类实现了栈结构
  3. push压栈,pop去除栈顶数据并将其移出,peek取出数据并移出
//栈结构
Stack<String> stack = new Stack<>();
//新增-压栈
stack.push("第一条数据");//压栈是存储一个数据到当前数据栈的栈顶(坑的最上面)
stack.push("第二条数据");
stack.push("第三条数据");
//取数据-弹栈
System.out.println("栈集合的长度为:"+stack.size());//输出的结果为3
System.out.println(stack.peek());//返回栈顶的数据,不移出数据,输出结果为第三条数据
System.out.println(stack.pop());//返回栈顶的数据并移出,输出结果为第三条数据
System.out.println("栈集合的长度为:"+stack.size());//输出的结果为2
stack.remove(stack.pop());//remove方法不是栈的操作方法,而是Collection集合的方法
System.out.println("栈集合的长度为:"+stack.size());//输出的结果为1

Map映射结构集合

  1. 当有两个数据需要管理才有具体意义时,可以使用Map集合
    即Map集合用于存放有关联关系的两个数据,两个数据合成一个Map元素
  2. Map接口有两个常用的:HashMap和HashTable
  3. HashMap线程不安全,效率更高,HashTable线程安全,效率较低
  4. HashMap可以用null作key和value,HashTable不允许
Map<String, Double> map = new HashMap<>();
map.put("No1", 88.0);//自动装箱,需要数据类型匹配才能装箱
map.put("No2", 66.0);
//集合的遍历
//map结合的遍历一般包含两个步骤
//1. 是对key的遍历,通过对key进行遍历找出所有的key
//2. 遍历后,根据每一个可以获取key对应的值
Set<String> keys = map.keySet();//keySet方法获取所有的key
Iterator<String> iterator = keys.iterator();//本例使用迭代接口进行迭代
while(iterator.hasNext()) {String key = iterator.next();//循环迭代每一个keyDouble score = map.get(key);//Map集合有个get方法,可以根据key根据key获取相应的value值System.out.println(key+"\t"+score.doubleValue());//遍历输出所有数据
}//删除数据,根据key就可以删除
map.remove("No1");//修改数据,根据key调用Map类的put进行替换修改
map.put("No2", 100.0);

集合类的选择

  • Set内存放的元素不允许重复,List存放的元素有一定的顺序
  • Map的应用主要在利用键/值进行快速查询
  • ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好
  • HashSet和TreeSet的区别在于集合内元素是否排序

集合中的异常

  • ClassCastException 在集合中取得元素对象在进行类型转换的时候类型不匹配
  • UnsupportedOperationException 当底层实现没有实现上层的相关方法的时候由Collection抛出该异常
  • ConcurrentModificationException 当采用Iterator遍历集合时,如果此时集合中的元素被改变则Iterator遍历抛出此异常
  • IndexOutOfBoundsException 集合中元素引用的索引值超出界限(<0或>size())
  • NoSuchElementException LinkedList中getLast,getFirst等方法取元素的时候List为空

泛型

  • 泛型的语法:Collection coll = new ArrayList(); jdk6
  • Collection coll = new ArrayList(); jdk7
为什么要使用泛型?
  • 为了实现在保存数据时,进行类型的检查,获取数据时不用进行类型的检查。
  • 在保存数据时由编译器进行语法检查,如果类型不匹配则无法通过编译
  • 一个集合一般只保存一种数据类型
  • 定义一个集合,用于保存一组小鸟的信息
  • 泛型集合可以在保存时做类型检查,避免集合中出现无效的数据
  • 使用了泛型集合后,取数据时可以不做类型的检查
2. 请介绍一下List和ArrayList的区别,ArrayList和HashSet的区别
  • List是接口,ArrayList是实现该接口的类
  • ArrayList底层是动态数组,有序且可重复
  • 而HashSet是实现了Set接口底层是HashMap不能重复且无序
  • ArrayList初始大小为10,增长算法为1.
  • 简单的说ArrayList是有序可重复,HashSet是无序不可重复

Java中Collection接口相关推荐

  1. JAVA中Collection接口的方法

    以下是本人从API上复制的内容,只是方便自己查找记忆. compact1, compact2, compact3 java.util Interface Collection<E> pub ...

  2. Java 中 Comparable 接口的意义和用法.

    在之前的博文中已经介绍了Java中Collection 接口和 Collections类. http://blog.csdn.net/nvd11/article/details/21516075 一, ...

  3. Java集合Collection接口中的常用方法演示

    Java集合Collection接口中的常用方法演示 添加 add(Objec tobj) 和 addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 vo ...

  4. java.util (Collection接口和Map接口)

    1:Collection和Map接口的几个主要继承和实现类                  1.1  Collection接口 Collection是最基本的集合接口,一个Collection代表一 ...

  5. JAVA中常用接口的介绍及使用示例 java lang Comparable

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...

  6. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  7. Objective-C 入门(七)协议 protocol(JAVA中的接口)

    Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...

  8. Java中的接口命名[关闭]

    本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...

  9. java中接口什么时候用_我什么时候应该在java中使用接口?

    在Java中精确使用接口的一个很好的例子将是理想的,适用于任何特定的规则. 看看丹以前所有的问题,他似乎只是逐字逐句地张贴家庭作业/考试问题. 令人惊讶的是,这些不是考试题或其他-今天才找到这个网站, ...

  10. java中的接口的定义以及实现关系

    一.什么是接口? - 硬件接口:设备之间的连接方式 - 软件接口:程序代码,特殊的类,表示一种规范,是具有N个方法的特征集合. java中的接口: 专家说的多个抽象类的抽象就是接口. interfac ...

最新文章

  1. python与excel的关系-Python 与 Excel 不得不说的事
  2. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session
  3. java 管道流PipedInputStream,PipedInputStream和随机访问文件 RandomAccessFile
  4. mysql -- 索引的使用
  5. win10系统VMware Workstation与Device/Credential Guard不兼容怎么办
  6. mysql 缓冲区_mysql 线程级别的缓冲区
  7. 数据库分页技术的实现及高效率分页技术方案
  8. DotNet微信公众号简介
  9. 听说你想进玩TikTok?
  10. python入门必备10个坑_python中的基础坑
  11. pptp,l2tp获取登录用户信息用pppd参数即可
  12. UNIX环境高级编程习题——第七章
  13. lopatkin俄大神精简中英俄系统Windows 10 Home 18362.145 19H1 Release x86-x64 RU-EN-CN NANO
  14. 软件测试方法-测试用例
  15. 微信Java SDK开发文档
  16. 大学生搭建自己的web项目服务器心得
  17. IDEA插件系列(67):ReadHub插件——新闻阅读器
  18. 硬盘换个计算机怎么启动,更换硬盘后,从U盘启动安装win7的13步方法
  19. 如何处理“WLAN没有有效的IP配置”这一问题?
  20. 【论文笔记_自蒸馏_2020】Regularizing Class-wise Predictions via Self-knowledge Distillation

热门文章

  1. 坐标c语言输入数组中,求助 C语言中如何利用二维数组计算多个坐标之间的距离...
  2. JSONObject.toBean方法复制不成功
  3. Oozie 安装及 examples app 的使用
  4. 【转】C语言编程中static变量详解
  5. file_operation(文件操作)file(文件)inode(节点)
  6. 变量声明和定义及extern 转载
  7. 这10个idea小技巧,让我的开发效率提升了10倍
  8. 深入理解Thread.sleep()函数
  9. Flask 下载中文名文件
  10. JavaScript专题之跟着 underscore 学节流