集合概述:

集合和数组都可以保存多个对象,但是数组的长度不可变,集合可以保存数量变化的数据。java中的集合类主要由两个接口派生出,Collection和Map

Collection接口和Iterator接口:

概述:Collection接口是List,Set和Queue接口的父接口

Collection中的主要方法如下:

Collection接口中方法
方法名称 方法概述
boolean add(Object o) 该方法向集合中添加一个元素,成功返回true
boolean addAll(Collection c) 该方法将集合C中的元素添加到指定集合中,成功返回true
void clear() 清除集合中的元素
boolean contains(Object o) 返回集合里是否包含指定元素
boolean containAll(Collection c) 返回集合中是否包含集合c里的所有元素
boolean isEmpty() 返回集合是否为空
Iterator iterator() 返回一个Iterator对象,用于遍历集合里的元素
boolean remove(Object o) 删除集合中的指定元素
boolean removeAll(Coolection c) 从指定集合中删除所包含的c集合中的全部元素
boolean retailAll(Coolection c) 从集合中删除集合中不包含的元素
int size() 返回集合中元素的个数
Object[] toArray() 该方法把集合转化成一个数组
  1. package cn.itcast.collection;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.HashSet;
  6. import java.util.Iterator;
  7.  
  8. import org.junit.jupiter.api.Test;
  9.  
  10. public class CollectionTest {
  11.  
  12. @Test
  13. public void testCollection(){
  14. Collection c=new ArrayList();
  15. c.add("孙悟空");
  16. c.add(6);
  17. System.out.println("c集合的元素个数为"+c.size());
  18.  
  19. c.remove(6);
  20. System.out.println("c集合的元素个数为"+c.size());
  21.  
  22. System.out.println("c集合中是否包含孙悟空"+c.contains("孙悟空"));
  23. c.add("javaee实战");
  24. System.out.println("c集合中的元素"+c);
  25.  
  26. Collection books=new HashSet();
  27.  
  28. books.add("疯狂java讲义");
  29. books.add("javaee实战");
  30.  
  31. System.out.println("c集合是否完全包含books集合"+c.containsAll(books));
  32.  
  33. c.removeAll(books);
  34.  
  35. System.out.println("c集合中的元素"+c);
  36.  
  37. c.clear();
  38.  
  39. System.out.println("c集合中的元素"+c);
  40.  
  41. books.retainAll(c);
  42.  
  43. System.out.println("books集合中的元素:"+books);
  44.  
  45. }
  46.  
  47. @Test
  48. public void IteratorTest() {
  49. Collection<String> c=new ArrayList<String>();
  50. c.add("java编程思想");
  51. c.add("疯狂java讲义");
  52. c.add("数据结构与算法");
  53. Iterator it=c.iterator();
  54. while(it.hasNext()) {
  55. String book=(String) it.next();
  56. System.out.println(book);
  57. if(book.equals("疯狂java讲义")) {
  58. it.remove();
  59. }
  60. book="测试字符串";
  61. }
  62. System.out.println(c);
  63. }
  64.  
  65. }

  

上述代码主要展示了Collection的常用方法

testCollection方法的执行结果为:

  1. c集合的元素个数为2
  2. c集合的元素个数为1
  3. c集合中是否包含孙悟空true
  4. c集合中的元素[孙悟空, javaee实战]
  5. c集合是否完全包含books集合false
  6. c集合中的元素[孙悟空]
  7. c集合中的元素[]
  8. books集合中的元素:[]

IteratorTest方法的执行结果为:

  1. java编程思想
  2. 疯狂java讲义
  3. 数据结构与算法
  4. [java编程思想, 数据结构与算法]

  

Set集合:

概述:Set集合类似于一个罐子,程序可以依次把多个对象装进这个罐子里面,Set集合通常不能记住元素的添加顺序。Set集合与Collection集合基本相同。

Set三个常用实现类:

HashSet:

概述:

HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类。 HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。

特点:

1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化

2、HashSet不是同步的,如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。

3、集合元素值可以是null

存储数据原理:

HashSet按Hash算法来存储集合中的元素,HashSet的内部存储结构是数组加链表。

HashSet存储元素时首先会根据Hash算法计算出元素在内存中的位置,然后将数据存放在相应的位置。如果该位置已经存放有元素,那么接着调用equals方法判断这两个元素是否相等,如果相等则是同一个元素,不需要存储,如果不相等,说明是不同的元素,此时HashSet会在该位置上产生一个链表来存储这两个元素,此时HashSet的查找性能会降低。

注意点:

在程序中如果重写某个类的hashCode()方法,则同时也应该修改其equals方法。  

hashCode方法的重写规则:

1、在程序运行过程中,同一个对象多次调用 hashCode()方法应该返回相同的值。
2、当两个对象通过 equals方法比较返回tue时,这两个对象的 hashCode()方法应返回相等的值
3、对象中用作 equals方法比较标准的实例变量,都应该用于计算 hashCode值。

LinkedHashSet:

概述:

LinkedHashSet是HashSet的子类,它的功能和HashSet类似,LinkedHashSet也是根据元素的hashCode值来存储,但它同时使用链表维护元素的数据,这样使得元素看起来是以插入的顺序保存的。LinkedHashSet需要使用链表维护数据,因此性能方面要比HashSet低一点。

TreeSet:

TreeSet是SortedSet接口的实现类,正如SortedSet的名字所示,TreeSet可以确保元素处于排序状态。与HashSet相比,TreeSet还有其他几个方法。

TreeSet中特有方法
方法名称 方法概述
Comparator comparator() 如果 Tree Set采用了定制排序,则该方法返回定制排序所使用的Comparator;如果 TreeSet采用了自然排序,则返回nul
Object first() 返回集合中的第一个元素
Object last() 返回集合中的最后一个元素
Object lower(Object e)

返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是集合中的元素)

Object higher(Object e) 返回集合中位于指定元素之后的元素
SortedSet subSet(Object fromElement,Object toElement)   返回此Set的子集合,范围从 fromElement(包含)到 toElement(不包含)。
SortedSet headSet(Object toElement) 返回此Set的子集,由小于 toLerent的元素组成。
SortedSet tailSet(Object fromElement) 回此Set的子集,由大于或等于 fromElement的元素组成。
  1. package cn.itcast.collection;
  2.  
  3. import java.util.TreeSet;
  4.  
  5. public class TreeSetTest {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. TreeSet nums=new TreeSet();
  10. nums.add(5);
  11. nums.add(2);
  12. nums.add(10);
  13. nums.add(-9);
  14.  
  15. System.out.println(nums);
  16.  
  17. System.out.println(nums.first());
  18. System.out.println(nums.last());
  19. System.out.println(nums.headSet(4));
  20. System.out.println(nums.tailSet(5));
  21. System.out.println(nums.subSet(2, 8));
  22. }
  23.  
  24. }

 

运行结果:

  1. [-9, 2, 5, 10]
  2. -9
  3. 10
  4. [-9, 2]
  5. [5, 10]
  6. [2, 5]

上述代码展示了TreeSet的常用方法

各个Set集合的性能分析:

1、Hash Set和 TreeSet是Set的两个典型实现,到底如何选择 Hash Set和 Tree Set呢? HashSet的性能总是比 TreeSet好(特别是最常用的添加、查询元素等操作),因为 TreeSet需要额外的红黑树算法来维护有Set时,才应该使用 TreeSet,否则都应该使用 HashSet。

2、HashSet还有一个子类:LinkedHash Set,对于普通的插入、删除操作, LinkedHashSet比 HashSet要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历 LinkedHashSe会更快。

List集合:

定义:

List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1

list集合中特有的方法:

方法名称

方法描述

void add(int index,Object element)

将元素element插入到集合的指定位置

boolean addAll(int index,Collection c)

将集合c所包含的所有元素插入到List集合的Index处

Object get(int index)

返回集合index索引处的元素

int indexOf(Object o)

返回对象o在List集合中第一次出现的位置索引

int lastIndexOf(Object o)

返回对象o在List集合中最后一次出现的位置索引

Object remove(int index)

删除并返回Index索引处的位置

Object set(int index,Object element)

将index索引处的元素替换成element对象,返回被替换的旧元素。

list的基本使用:

  1. List books=new ArrayList();
  2. books.add(new String("轻量级javaee实战"));
  3. books.add(new String("疯狂java讲义"));
  4. books.add(new String("疯狂Android讲义"));
  5. books.add(new String("疯狂ios讲义"));
  6.  
  7. books.sort((o1,o2)->((String)o1).length()-((String)o2).length());
  8.  
  9. System.out.println(books);
  10.  
  11. books.replaceAll(ele->((String)ele).length());
  12. System.out.println(books);

  

list的迭代方法:

  1. String[] books = {"轻量级javaee实战","疯狂java讲义","疯狂Android讲义","疯狂ios讲义"};
  2.  
  3. List bookList=new ArrayList();
  4. for(int i=0;i<books.length;i++) {
  5. bookList.add(books[i]);
  6. }
  7.  
  8. ListIterator lit=bookList.listIterator();
  9. while(lit.hasNext()) {
  10. System.out.println(lit.next());
  11. lit.add("------分隔符-----");
  12. }
  13.  
  14. System.out.println("========下面开始反向迭代======");
  15. while(lit.hasPrevious()) {
  16. System.out.println(lit.previous());
  17. }

  

ArrayList和Vertor:

定义:

ArrayList和Vertor是list的实现类,list中的方法全部都适用于ArrayList和Vertor。ArrayList和Vertor的底层是用数组实现的,ArrayList或 Vector对象使用 initialCapacity参数来设置该数组的长度,当向 ArrayList或 Vector中添加元素超出了该数组的长度时,它们的 initialCapacity会自动增加。

Queue集合:

Queue用于模拟队列这种数据结构,队列是先进先出的数据结构。Queue接口中提供了

queue中的方法:

方法名称

方法描述

void add(Object e)

将元素加入到队列尾部

Object element()

获取队列头部元素,但是不删除

Boolean offer(Object e)

将元素加入到队列尾部,当使用容量有限的队列时,此方法比add效果好

Object peek()

获取头部元素,但是不删除

Object poll()

获取头部元素,并删除该元素

Object remove()

获取头部元素,并删除该元素

LinkedList:

LinkedList也是List的实现类,它与ArrayList不同,LinkedList的底层是基于链表实现。同时,LinkedList还实现了Deque接口,可以被当成双端队列来使用,因此既可以被当成“栈”来使用,也可以被当成队列使用

LinkedList的基本使用:

  1. public class LinkedListTest {
  2.  
  3. public static void main(String[] args) {
  4. LinkedList books=new LinkedList();
  5. books.offer("疯狂java讲义");
  6. books.push("javaee企业级实战");
  7. books.offerFirst("疯狂Android讲义");
  8. for(int i=0;i<books.size();i++) {
  9. System.out.println("遍历中--"+books.get(i));
  10. }
  11. System.out.println(books.peekFirst());
  12. System.out.println(books.peekLast());
  13. System.out.println(books.pop());
  14. System.out.println(books);
  15. System.out.println(books.pollLast());
  16. System.out.println(books);
  17.  
  18. }
  19.  
  20. }

  

List集合的性能分析:

  • ArrayList底层是数组实现的,查询速度快,增删速度慢,线程不安全
  • Vertor底层是数组实现的,但是Vertor是线程安全的,所以效率较低
  • LinkedList的底层是链表实现的,增删速度快,查询速度慢,线程不安全

如果经常做增删操作,则推荐使用LinkedList,如果经常使用查询操作,则推荐使用ArrayList,如果两个操作都多,则推荐使用ArrayList

Java——Java集合那些事的更多相关文章

  1. java之集合那些事

    集合概述: 集合和数组都可以保存多个对象,但是数组的长度不可变,集合可以保存数量变化的数据.java中的集合类主要由两个接口派生出,Collection和Map Collection接口和Iterat ...

  2. 谈谈Java的集合组件

    让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...

  3. 对JAVA的集合的理解

    对JAVA的集合的理解是相对于数组 1.数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) 2.JAVA集合可以存储和操作数目不固定的一组数据.  3.所有的JAVA集合都位 ...

  4. 【Java】集合_学习笔记

    一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...

  5. Github优秀java项目集合(中文版) - 涉及java所有的知识体系

    Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...

  6. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  7. java.util 集合框架集合

    java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...

  8. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  9. Java学习-集合(转)

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  10. java的集合框架之一

    java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...

随机推荐

  1. python3(三十四)unitTest

    """ 单元测试 """ __author__on__ = 'shaozhiqi 2019/9/23' class Dict(dict): ...

  2. java 中类为啥要序列化

    java里为什么要序列化?http://zhidao.baidu.com/link?url=7_wAQ8eAl28vcJPE5OKM5Y0Bo4aINNQokHhRmI9XPszEoTO5QF-gNb ...

  3. 谁说.NET不适合搞大数据,机器学习、人工智能

    SciSharp Stack SciSharp STACK: https://scisharp.github.io/SciSharp/ 基于.NET的开源生态系统,用于数据科学.机器学习和AI. Sc ...

  4. Python下将一般对象打印成Json

    有的时候,我们在写Python程序的时候,在处理复杂对象的时候,有的时候过程中调试,需要去看看产生的对象如何,有的时候我们可以把它打印成json来看,这个是个不错的办法. 对每一个对象写一个独立的打印 ...

  5. Flask基础-01.Flask简介

    Flask简介 Web应用程序作用 Web(World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档. 关于Web框架 1. 什么是Web框架? 1. 已经封装好了一段代码,协助程序 ...

  6. SSL 3.0 POODLE攻击信息泄露漏洞_CVE-2014-3566

    0x01 SSL3.0简介 我们知道最开始HTTP协议传输数据的时候,数据是不加密的,不安全的,网景公司针对此,推出了SSL(secure socket layer)安全套接层.SSL3.0时,IET ...

  7. [PHP] 调用微博API 发微博OAuth2.0

    在实际测试中出现很多问题, 第一就是按照文档调用ACCESS_TOKEN的时候费老劲啦,因为是编辑线上的,有好多中文空格,没有看出来!整了好久! 第二个就是在调用api发微博的时候出现乱码!必须把发送 ...

  8. 推荐一个小而美的Python代码格式化工具

    代码可读性是评判代码质量的标准之一,有一个衡量代码质量的标准是 Martin 提出的 “WFT” 定律,即每分钟爆出 “WTF” 的次数.你在读别人代码或者做 Code Review 的时候有没有 “ ...

  9. JasperReports入门教程(一):快速入门

    JasperReports入门教程(一):快速入门 背景 现在公司的项目需要实现一个可以配置的报表,以便快速的适应客户的需求变化.后来在网上查资料发现可以使用JasperReports + Jaspe ...

  10. Kylin on Parquet 介绍和快速上手

    Apache Kylin on Apache HBase 方案经过长时间的发展已经比较成熟,但是存在着一定的局限性.Kylin 查询节点当前主要的计算是在单机节点完成的,存在单点问题.而且由于 HBa ...