JAVA中的集合容器操作类

Java容器类库总共分为两个概念:

  1. Collection。标识所含元素的序列,这里面又包含多种集合类,比如List,Set,Queue;它们都有各自的特点,比如List是按顺序插入元素,Set是不重复元素集合,Queue则是典型的FIFO结构
  2. Map。这是一个“键值对”的集合对象,允许你通过键来查找值。把你的键对象与值对象关联,映射起来;而Map又细分很多中集合,比如HashMap,TreeMap这其中的实现的数据结构又有所不同,所以其使用的功能场景也有所不同

List集合

List是可以将元素维护在特定的序列中的集合。List继承自Collection类,并添加了属于自己大量的操作方法。具体有两种类型的List:

  • ArrayList:由名字就可以看出是数组形式的数据结构,所以查询访问元素非常快(索引查询),但是添加或者删除元素时慢
  • LinkedList:链表形式的数据结构,即查询是很慢(时间复杂度为O(n)),新增,删除数据是很快的

ArrayList的操作方法说明

注意:这里讨论的集合都是泛型集合

  • subList(int fromIndex,int toIndex)由原来的list构造从索引为fromIndex到toIndex之间的数据集合(包含fromIndex,toIndex)
  • set(int index,T element)在指定的index位置出用指定元素element代替
  • addAll(collection<? extends E> c)除了Collection.addAll,实例方法addAll也能在初始list中插入集合列表
  • add()集合类中最常用的添加数据的方法
  • toArray()创建一个具有合适尺寸的数组
  • ...

LinkedList

LinkedList也跟ArrayList一样实现了List接口,前面说了,它在删除和添加操作时(准确的讲是在中间插入)要比ArrayList更高效,但是访问要逊色于ArrayList。LinkedList还添加了使其用作栈、队列或双向链表的方法。他们彼此的方法也存在些许差异,所以在不同的List类型中用不同的方法操作集合是非常重要的。

  • getFirst和element方法完全一样,都返回列表的头,而不移除它,如果List为空则抛出异常—NoSuchElementException。peek方法同样是返回列表的头并不移除它,但是List为空则返回null而不会抛出异常


    这有点像C#的Linq.FirstOrDefault与Linq.First的区别

  • removeFirst与remove也是完全一样的,它们移除并返回列表的头部信息,而在列表为空是抛出NoSuchElementException异常。poll则列表为空是返回null

  • addFirst与add和addLast相同,都将元素插入到列表尾部或头部

  • removeLast移除并返回列表的最后一个元素

Stack

栈,是指“LIFO”先进后出的集合容器,最后一个压入的元素是第一个出来的,就好比我们洗碗一样(或者叠罗汉)第一个摆放的碗放在最下面,自然是最后一个拿出来的。Stack是由LinkedList实现的,作为Stack的实现,下面是《java编程思想》给出基本的Stack实现:

import java.util.LinkedList;
public class Stack<T> {
private LinkedList<T> storage = new LinkedList<>();
public void push(T v) {
storage.addFirst(v);
}
public T peek() {
return storage.getFirst();
}
public T pop() {
return storage.removeFirst();
}
public boolean empty() {
return storage.isEmpty();
}
public String toString() {
return storage.toString();
}
}

下面说一些方法的区别

peek和pop是返回T类型的对象。peek方法提供栈顶元素,但不删除栈顶,而pop是返回并删除栈顶元素;

Set

Set是保存不重复的集合容器,Set经常被用作判断某元素是否在集合中存在,所以查找就成为最重要的操作,在内部,Set选择一个HashSet的实现,它专门对快速查找进行了优化。

Set具有与Collection完全一样的接口,没有额外的任何功能。所以把Set就是Collection,只是行为不同(这就是多态);Set是基于对象的值来判断归属的,由于查询速度非常快速,HashSet使用了散列,HashSet维护的顺序与TreeSet或LinkedHashSet都不同,因为它们的数据结构都不同,元素存储方式自然也不同。TreeSet的数据结构是“红-黑树”,HashSet是散列函数,LinkedHashSet也用了散列函数;

如果想要对结果进行排序,那么选择TreeSet代替HashSet是个不错的选择

Map

Map具有将对象映射到其他对象的功能,是一个K-V形式存储容器,你可以通过containsKey()和containsValue()来判断集合是否包含某个减或某个值。Map可以很容以拓展到多维(值可以是其他容器甚至是其他Map):

Map<Object,List<Object>>

学C#的就知道,这就像字典基一样Dictionary<K,V>

Queue

队列与栈相反,是个先进先出“FIFO”的容器。即第一个放进去就是第一个拿出来的元素(从一端进去,从另一端出来)。队列常作被当作一个可靠的将对象从程序的某个区域传输到另一个区域的途径。

LinkedList提供了方法以支持队列的行为,并且实现了Queue接口。通过LinkedList向上转型(up cast)为Queue,看Queue的实现就知道相对于LinkedList,Queue添加了element、offer、peek、poll、remove方法

offer:在允许的情况下,将一个元素插入到队尾,或者返回false

peek,element:在不移除的情况下返回队头,peek在队列为空返回null,element抛异常NoSuchElementException

poll,remove:移除并返回队头,poll当队列为空是返回null,remove抛出NoSuchElementException异常

注意:queue.offer在自动包装机制会自动的把random.nextInt转化程Integer,把char转化成Character

总结

Java内置了大量容器操作对象:

  1. 数组,将数组与对象结合起来,数组一旦生成,容量就不允许修改
  2. Collection保存单一的元素,Map保存的是K-V键值对形式的元素对象,可以在集合中添加元素并自动调整尺寸。容器不能持有基本类型,但是自动包装机制会执行基本类型到容器中所持有的类型之间的转换
  3. List类似与数组,简历数字索引与对象的关联,都是排序好的容器,List能自动扩容
  4. ArrayList擅长随机访问,要插入删除元素,LinkedList合适
  5. Queue是LinkedList实现的
  6. Map对象映射对象的关联设计。HashMap主要用来快速访问;TreeMap保持“键”始终处于排序状态,没有HashMap快。LinkedHashSet保持元素插入的顺序,但通过散列函数提供了快速访问的能力
  7. Set可以用来去重,能提供最快的查询速度

Java还在处于初学阶段,还有很多知识面都还没有涉及到,等学到后面,又有新启发了,回过头来在补充

JAVA中的集合容器操作类的更多相关文章

  1. Java中各种集合(字符串类)的线程安全性!!!

    Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...

  2. Java中的集合和常用类

    Java中的常用类: ▪ Object类 ▪ Math类 ▪ String类和StringBuffer类(字符串) ▪ 8种基本类型所对应的包装类 ▪ java.util包中的类——Date类 Obj ...

  3. java中的集合/容器的数据结构

    最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...

  4. Java中的集合Collections工具类(六)

    操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集 ...

  5. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  6. Java中的集合(十四) Map的实现类LinkedHashMap

    Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...

  7. Java中的集合框架

    概念与作用 集合概念 现实生活中:很多事物凑在一起 数学中的集合:具有共同属性的事物的总体 java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象 在编程时,常常需要集中存放多 ...

  8. Java中的集合框架(上)

    Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...

  9. Java中的集合框架-Collections和Arrays

    上一篇<Java中的集合框架-Map>把集合框架中的键值对容器Map中常用的知识记录了一下,本节记录一下集合框架的两个工具类Collections和Arrays 一,Collections ...

随机推荐

  1. 修改chrome浏览器默认css样式的方法

    最近重新用起了ubuntu kylin,然后又碰到之前让我感到有些难受的一个小问题:用chrome浏览部分网页时,一部分粗体字十分难看,就像是宋体直接加粗那样. 之前就觉得这样看起来很难受,但是找到的 ...

  2. python数据结构之直接插入排序

    python数据结构之直接插入排序 #-*-encoding:utf-8-*- ''' 直接插入排序: 从序列的第二个元素开始,依次与前一个元素比较,如果该元素比前一个元素大, 那么交换这两个元素.该 ...

  3. javaweb中的乱码问题

    0.为什么需要编码,解码, 无论是图片,文档,声音,在网络IO,磁盘io中都是以字节流的方式存在及传递的,但是我们拿到字节流怎么解析呢?这句话就涉及了编码,解码两个过程,从字符数据转化为字节数据就是编 ...

  4. shell if 条件判断

    condition='123' if [ -z condition]; then echo "condition 是空的" fi 字符串判断: = 两个字符串相等. != 两个字符 ...

  5. LeetCode:151_Reverse Words in a String | 字符串中单词的逆反 | Medium

    题目:Reverse Words in a String Given an input string, reverse the string word by word. For example, Gi ...

  6. OC学习5——类和对象

    1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...

  7. Liferay7 BPM门户开发之20: 理解Asset Framework

    Asset框架用于将您开发的门户内容添加Liferay的核心系统功能.打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签. ...

  8. DRF项目工程基础包

    drf开发基础包 日常使用drf进行后端开发中,每次开发新项目就的做很多的工程基础配置操作,我觉得这样是没必要的,我们主要关注在业务的开发中,而不是每次都要做这些繁琐的基础操作,所以我把这些做了一个基 ...

  9. web.xml简介

    用于配置Web应用的相关信息,如:监听器(listener).过滤器(filter). Servlet.相关参数.会话超时时间.安全验证方式.错误页面等.例如: Servlet 3中的异步处理指的是什 ...

  10. 记CTC原理

    CTC,Connectionist temporal classification.从字面上理解它是用来解决时序类数据的分类问题.语音识别端到端解决方案中应用的技术.主要是解决以下两个问题 解决语音输 ...