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. 后台获取url里面加密的参数中,特殊符号+获取到后端后是 一个空格的解决方法

    进行加密,加密后的参数中有个+号: 前端的url:http://mtest.cmread.com:8145/nap/p/QRcode.jsp?activityId=11206&vcode=O/ ...

  2. python之路(三)-深浅拷贝

    深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层.所 ...

  3. navicat for mysql安装与破解

    Windows系统的电脑 navicat for mysql 的安装软件以及破解包 方法/步骤     从网上下载需要用到的navicat for mysql 的安装软件以及破解包.   双击navi ...

  4. STL中的容器作为返回值

    分别以函数返回值方式和参数传引用方式测试了vector.map两种容器,代码如下: // testContainer.cpp : Defines the entry point for the con ...

  5. WPF 显示 mp3 专辑图片

    mp3 专辑图片是属于 mp3 的 tag 的一部分,安装 taglib# 的 nuget 安装包到项目.这里使用 TagLib.Portable https://www.nuget.org/pack ...

  6. Unity全面的面试题(包含答案)

    一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3D中 ...

  7. docker 安装Nginx

    1.使用镜像加速拉取nginx [root@192 ~]# $ docker pull registry.docker-cn.com/library/nginx:1.15 2.通过docker run ...

  8. Python语法基础——关于全局变量与局部变量

    1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,函数中使用的将是局部变量,例如: num = 100 def func(): num =  ...

  9. iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现

    最近同样是新App,设计稿里出现一种圆形进度条的设计,如下: 想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low ...

  10. spring boot 集成jsp

    刚开始操作的时候,遇到了个问题,在这记录一下.(因为自己是个新手,对maven项目结构不了解) 1.大概创建步骤如下 File-New-Project-Spring Initializr ,type选 ...