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. 走进JDK(五)------AbstractList

    接下来的一段时间重点介绍java.util这个包中的内容,这个包厉害了,包含了collection与map,提供了集合.队列.映射等实现.一张图了解java中的集合类: AbstractList 一. ...

  2. SWPU-ACM集训队周赛之组队赛(3-11)G题题解

    点这里去做题 水水水水水,不难发现如下表 t 1 2 3 4 v 1 3 5 7 s 1 4 9 16 明显s=t*t 题目中对10000取模即取后四位,即对1000取余 #include<st ...

  3. 系统性能--CPU

    对于cpu,目前比较关心的是cpu的利用率还有cpu的load,或者还有cpu运行队列. cpu利用率 cpu利用率分为sys,us.分别为操作系统和用户进程所占用的cpu利用率.sys的占用,一般是 ...

  4. web安全基础

    web安全备忘 主机系统安全防护:防火墙控制 Web是一个分布式系统,一个站点多个主机布置,一主机布置多个站点:并发,异步,同步 主机安全配置文件修改与强化 web站点数据验证逻辑的常用技巧:功能性代 ...

  5. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

  6. 在Azure DevOps Server(TFS系统)中部署回退/回滚方案(Rollback)

    概述 Azure DevOps Server(之前名TFS)是微软公司实现软件研发.测试和部署一体化的全流程解决方案.在近几年的研发过程中,Azure DevOps Server 大幅增强了软件部署过 ...

  7. JavaScript中的constructor和继承

    概述 这是我在看JavaScript面向对象编程指南的时候,对constructor和继承的总结. 关于它们的详细知识,可以上网查到,所以我只写那些网上没有的. 内容 constructor的理解 c ...

  8. DBUtils的增删改查

    数据准备: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, us ...

  9. 转载 Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写.转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式 ...

  10. C# 窗体间传值

    Form1: 父窗体, Form2: 子窗体. 1.父窗体接收子窗体的返回值: public partial class Form1: Form { private void btnOpen_Clic ...