介绍

Java集合框架是一组接口和类的集合,它使得存储和处理数据更加有效率。

该框架有一些类,有很多函数使得程序员更加容易的处理集合类型数据。

后面的教程就是针对这些常用类展开,配合例子代码来给大家一一讲解,希望对自己和大家有所帮助。

再看下官方的解释:


Collections Framework是一个用来表示和操作集合的统一的架构。集合的框架包括了:

Interfaces:


这些是表示集合的抽象数据类型,接口允许集合完成操作,独立与其详细的实现。在面向对象的语言中,接口构成了体系架构;

Implementations:


这些是接口的具体实现。本质上,是一些可复用的数据结构;

Algorithms:


这些方法可以对接口实现的对象进行有用的计算,比如搜索、排序。这些算法是具有多态性的:也就是说,同样的方法可以用在

合适的接口的不同实现。本质上,是一些可复用的函数。

使用集合框架有什么好处?


Java的集合框架提供了一下优点:

1.减少编程的工作量:通过提供有用的数据结构和算法,集合框架能让你更专注的实现程序的核心功能,而不是去做一个底层的

“管道工”。

Java框架通过促进无关API的互操作性,使得你不用自己去实现不同API的适配

2.提高程序的速度与质量:集合框架提供了一些有用数据结构和算法的高性能、高质量的实现。

每个接口的不同的实现也是可以互换的,所以程序可以通过切换集合来做一些调整。

正因为你从实现数据结构的那些苦差事中脱离出来,你才可以有更多的实现去改善你自己程序的性能和质量

3.允许无关APIs的互操作:集合接口是API之间传递集合的一个“方言”,比如我的网络管理API有一个节点名的集合,而GUI工

具需要一个列标题的集合,即使是分开实现它们,我们的APIs也可以无缝的接合。

4.省力地学习和使用新API:

这是另一个领先的优势,设计者和实现者没必要在每次都重新设计API的时候都“推倒重来”地实现集合,而是直接使用标准的

集合接口就好了。

促进软件的复用:符合标准集合接口的新数据结构本质上是可以复用的。对于操作这些新数据结构算法也是一样可以复用的。

集合框架层级图

Set

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。

Set接口主要实现了两个实现类:

HashSet:为快速查找设计,HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。

TreeSet:TreeSet类实现了SortedSet接口,保存次序的Set,底层为树结构,能够对集合中的对象进行排序。

package com.dylan.collection;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; /**
* @author xusucheng
* @create 2018-01-21
**/
public class HashSetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("123");
set.add("123");//覆盖
set.add("456");
set.add("abc");
set.add("efg"); //Iterator遍历
Iterator it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
} //foreach遍历,前提是指定了元素类型为String
for(String str:set){
System.out.println();
}
}
}

List

List的特征是其元素以顺序存储,可以存放重复对象。

List接口主要实现类包括:

1. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。

数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。

当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适

合插入和删除。

2. Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,

避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

3. LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。

另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

关于ArrayList和Vector区别如下:

ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。

Vector提供indexOf(obj, start)接口,ArrayList没有。

Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

package com.dylan.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; /**
* @author xusucheng
* @create 2018-01-21
**/
public class ArrayListTest {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("W");
list.add("o");
list.add("r");
list.add("l");
list.add("d"); Iterator<String> it = list.iterator();
String str="";
while (it.hasNext()){
str+=it.next();
} //输出World
System.out.println(str);
}
}

Map

Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。

Map没有继承于Collection接口。从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

标准的Java类库中包含了几种不同的Map:HashTable, HashMap,TreeMap,LinkedHashMap

HashMap:  继承自AbstractMap; 不保证顺序;非线程安全;只支持iterator;key和value都可为null; 一般用于单线程环境中。

Hashtable:继承自Dictionary; 线程安全;支持Iterator和Enumeration;key和value都不可为null; 一般用于多线程环境中。

TreeMap:实现了sortedMap接口,实现了元素自动排序。

LinkedHashMap: Key和Value都允许null;有序;非线程安全;Key重复会覆盖、Value允许重复。

package com.dylan.collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; /**
* @author xusucheng
* @create 2018-01-21
**/
public class HashMapTest {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "H");
map.put(2, "e");
map.put(3, "l");
map.put(4, "l");
map.put(5, "o"); //iterator遍历
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
String str = "";
while (it.hasNext()) { str += it.next().getValue();
} //输出Hello
System.out.println(str);
}
}

四、总结

1、如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访

问元素,应该使用ArrayList。

2、如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一

个类,应该使用同步的类。

3、在除需要排序时使用TreeSet、TreeMap外,都应使用HashSet、HashMap,因为他们的效率更高。

4、要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

5、容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。一旦将对象置入容器内,便损失

了该对象的型别信息。

6、尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用

改变。这就是针对抽象编程。

注意:

1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。

2、Set和Collection拥有一模一样的接口。

3、List可以通过get()方法来一次取出一个元素。

4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

5、Map用put(k,v)/get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。HashMap会利用

对象的hashCode来快速找到key。

参考文章

https://yikun.github.io/2015/03/31/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/

https://beginnersbook.com/java-collections-tutorials/

Java集合框架学习(一)介绍的更多相关文章

  1. Java集合框架学习(一)List

    先附一张Java集合框架图. 从上面的集合框架图可以看到,Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Coll ...

  2. Java集合框架学习

    集合框架 集合框架的目标 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现必须是高效的. 该框架允许 不同类型的集合,以类似的方式工作,具有高度的互操作性. 对一个集合的扩展和适应必 ...

  3. 【java基础 11】java集合框架学习

    导读:本篇博客主要是从整体上了解java的集合框架,然后主要介绍几个自己在项目中用到的结构,比如说:hashtable.hashmap.hashset.arraylist等! 一.宏观预览 从宏观上看 ...

  4. Java集合框架学习笔记

    集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的长度不确定,就使用集合存储. 集合特点1.用于存储对象的容器.2.集合的长度可变.3.集合中不可以存储基本类型 集合容器因为内部的数据结 ...

  5. Java集合框架学习总结

    转自:http://www.cnblogs.com/oubo/archive/2012/01/07/2394639.html Oubo的博客 以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介 ...

  6. JAVA集合框架特征介绍

    数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架.在平常的学习开发中,灵 ...

  7. 【转】Java集合框架List,Map,Set等全面介绍

    原文网址:http://android.blog.51cto.com/268543/400557 Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含 ...

  8. 【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版

    原文链接: https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html 原文内容也一并附加在本文最 ...

  9. Java集合框架(Collection Framework)学习之 Collection与Map概貌

    写过Java的人都知道Java集合类,也用过Java集合类.Java集合类位于 java.util 这个包下,就像它的包名暗示的那样,Java集合类就是一套工具.它就像工匠的工具箱一样,它能给使用它的 ...

  10. 34、Java集合框架List,Map,Set等全面介绍(转载)

      Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构.   Java集合框架的基本接口/类层次结构: java.util.C ...

随机推荐

  1. JVM的GC学习

    JVM的GC学习 2023-12-28T17:20:25.182+0800: 7.363: [Full GC (Metadata GC Threshold) [PSYoungGen: 29067K-& ...

  2. [转帖]【性能】大页内存 (HugePages)在通用程序优化中的应用

    目录 1. 背景 2. 基于指纹的音乐检索简介 3. 原理 4. 小页的困境 5. 大页内存的配置和使用 6. 大页内存的优化效果 7. 大页内存的使用场景 8. 总结 LD_PRELOAD用法 原文 ...

  3. [转帖]prometheus的TCP alloc取值

    prometheus的TCP alloc取值 sockets: used:已使用的所有协议套接字总量 TCP: orphan:无主(不属于任何进程)的TCP连接数(无用.待销毁的TCP socket数 ...

  4. [转帖]TIDB-TIDB节点磁盘已满报警

    一.背景 今日突然收到tidb节点的磁盘报警,磁盘容量已经超过了80%,但是tidb是不放数据的,磁盘怎么会满,这里就需要排查了 二.问题排查 解决步骤 1.df -h查看哪里占用磁盘比较多,然后通过 ...

  5. [转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)

    我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估 ...

  6. [转帖]疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?

    疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换. linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这些 ...

  7. [转帖]Unixbench服务器综合性能测试方法及工具下载

    UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具. UnixBench会执行一系列的测试,包括2D和3D图形系统的性能衡量,测试的结果不仅仅只是CPU ...

  8. CentOS8 安装 SQLSERVER2019的简单过程

    1. 获取rpm包直接从微软官方网站即可 -rw-r--r-- 1 root root 820984 Apr 5 22:23 msodbcsql17-17.5.2.1-1.x86_64.rpm -rw ...

  9. 简单的获取ESXi服务器上面开启了多少个vCPU的办法

    开启ssh 执行命令 esxcli vm process list |grep Config |cut -b 17- |xargs cat |grep numvcpus |cut -d " ...

  10. vue3获取数据的注意点

    场景描述 在使用vue3的时候.我们很多人喜欢一个页面分成几个几个部分来写 这样做的目的是为了区分. 做的彼此的逻辑互相独立,互不干扰 但是有的时候,我们可能会去获取不属于自己区域的函数 这个时候我们 ...