java编写一个集合类_Java集合类

数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关。刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈”对我说了一句:不会用集合类就等于没学过Java。然后才知道有集合类。

想想已经是3、4年前的事了,时间如白驹过隙啊。

什么时候数组会显得力不从心,没法满足需求,需要集合类呢?

不知道具体数据长度

需要自动排序

存储键值对

当然,上面的情况不是绝对的,只是数组比较难满足。这时集合类(也可称为容器类)就显示了它强大的功能。

集合类的分类(图片转自http://biancheng.dnbcw.info/1000wen/359774.html)

5bbf501655b3cb968505f80107a245bd.png

上图中不包含Queue内容,部分Map的实现类未给出。

常见使用的有List、Set、Map及他们的实现类。

List、Set、Map接口及各实现类的特性

接口

特性

实现类

实现类特性

成员要求

List

线性、有序的存储容器,可通过索引访问元素

ArrayList

数组实现。非同步。

Vector

类似ArrayList,同步。

LinkedList

双向链表。非同步。

Map

保存键值对成员

HashMap

基于哈希表的 Map 接口的实现,满足通用需求

任意Object对象,如果修改了equals方法,需同时修改hashCode方法

TreeMap

默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序

键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。

LinkedHashMap

类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序

与HashMap相同

IdentityHashMap

使用==取代equals()对“键值”进行比较的散列映射

成员通过==判断是否相等

WeakHashMap

弱键映射,允许释放映射所指向的对象

ConcurrentHashMap

线性安全的Map

Set

成员不能重复

HashSet

为快速查找设计的Set

元素必须定义hashCode()

TreeSet

保持次序的Set,底层为树结构

元素必须实现Comparable接口

LinkedHashSet

内部使用链表维护元素的顺序(插入的次序)

元素必须定义hashCode()

在满足要求的情况下,Map应尽量使用HashMap,Set应尽量使用HashSet。

集合类的基本使用

List

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngList基本操作

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 ArrayList arrayList = new ArrayList();

2 arrayList.add("Tom");

3 arrayList.add("Jerry");

4 arrayList.add("Micky");

5 // 使用Iterator遍历元素

6 Iterator it = arrayList.iterator();

7 while (it.hasNext()) {

8 String str = it.next();

9 System.out.println(str);

10 }

11 // 在指定位置插入元素

12 arrayList.add(2, "Kate");

13 // 通过索引直接访问元素

14 for (int i = 0; i < arrayList.size(); i++) {

15 System.out.println(arrayList.get(i));

16 }

17 List subList = new ArrayList();

18 subList.add("Mike");

19 // addAll(Collection extends String> c)添加所给集合中的所有元素

20 arrayList.addAll(subList);

21 // 判断是否包含某个元素

22 if (arrayList.contains("Mike")) {

23 System.out.println("Mike is include in the list");

24 }

25

26 LinkedList linkedList = new LinkedList();

27 linkedList.addAll(arrayList);

28 // 获取指定元素

29 System.out.println(linkedList.get(4));

30 // 获取第一个元素

31 System.out.println(linkedList.getFirst());

32 // 获取最后一个元素

33 System.out.println(linkedList.getLast());

34 // 获取并删除第一个元素

35 System.out.println(linkedList.pollFirst());

36 // 获取,但不移除第一个元素

37 System.out.println(linkedList.peekFirst());

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

ArrayList和LinkedList的效率比较

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngArrayList添加元素的效率

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 ArrayList arrList = new ArrayList();

2 long startTimeMillis, endTimeMillis;

3 startTimeMillis = System.currentTimeMillis();

4 for (int i = 0; i < 10000; i++) {

5 arrList.add(0, "addString");

6 }

7 endTimeMillis = System.currentTimeMillis();

8 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

9 + "ms");

10

11 arrList.clear();

12

13 startTimeMillis = System.currentTimeMillis();

14 for (int i = 0; i < 20000; i++) {

15 arrList.add(0, "addString");

16 }

17 endTimeMillis = System.currentTimeMillis();

18 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

19 + "ms");

20

21 arrList.clear();

22

23 startTimeMillis = System.currentTimeMillis();

24 for (int i = 0; i < 40000; i++) {

25 arrList.add(0, "addString");

26 }

27 endTimeMillis = System.currentTimeMillis();

28 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

29 + "ms");

30

31 arrList.clear();

32

33 startTimeMillis = System.currentTimeMillis();

34 for (int i = 0; i < 80000; i++) {

35 arrList.add(0, "addString");

36 }

37 endTimeMillis = System.currentTimeMillis();

38 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

39 + "ms");

40

41 arrList.clear();

42

43 startTimeMillis = System.currentTimeMillis();

44 for (int i = 0; i < 160000; i++) {

45 arrList.add(0, "addString");

46 }

47 endTimeMillis = System.currentTimeMillis();

48 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

49 + "ms");

50

51 arrList.clear();

52

53 startTimeMillis = System.currentTimeMillis();

54 for (int i = 0; i < 320000; i++) {

55 arrList.add(0, "addString");

56 }

57 endTimeMillis = System.currentTimeMillis();

58 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

59 + "ms");

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

执行时间比较

执行次数(在0号位置插入)

ArrayList所用时间(ms)

LinkedList所用时间(ms)

10000

31

0

20000

141

0

40000

484

16

80000

1985

0

160000

7906

0

320000

31719

16

执行次数(在尾部插入)

ArrayList所用时间(ms)

LinkedList所用时间(ms)

10000

0

0

20000

15

0

40000

0

0

80000

0

0

160000

0

15

320000

0

16

循环输出次数(get(index)方法)

ArrayList所用时间(ms)

LinkedList所用时间(ms)

10000

93

204

20000

188

797

40000

328

2734

80000

688

13328

160000

1594

62313

320000

2765

太久了……

因为ArrayList底层由数组实现,在0号位置插入时将移动list的所有元素,在末尾插入元素时不需要移动。LinkedList是双向链表,在任意位置插入元素所需时间均相同。所以在List中有较多插入和删除操作的情况下应使用LinkedList来提高效率,而有较多索引查询的时候使用ArrayList(使用增强型的for循环或Iterator遍历LinkedList效率将提高很多)。

Map

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngMap基本操作

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 HashMap map = new HashMap();

2 // 向Map中添加元素

3 map.put("Tom", 26);

4 map.put("Jack", 18);

5 map.put("Micky", 17);

6 map.put("Kate", 15);

7 // 根据Key获取Value

8 System.out.println("Jack is " + map.get("Jack") + " years old");

9 // 移除

10 map.remove("Micky");

11 // 遍历Map

12 for (Entry entry : map.entrySet()) {

13 System.out.println("name:" + entry.getKey() + " age:"

14 + entry.getValue());

15 }

16 // Key相同的元素将被覆盖

17 map.put("Jack", 19);

18 // 根据Key获取Value

19 System.out.println("Jack is " + map.get("Jack") + " years old");

20 // 判断是否包含某个Key

21 if (map.containsKey("Tom")) {

22 System.out.println(map.get("Tom"));

23 }

24 // 判断是否包含某个Value

25 if (map.containsValue(26)) {

26 System.out.println("The map include the value 26");

27 }

28 // 判断map是否为空

29 if (!map.isEmpty()) {

30 // 获取map大小

31 System.out.println("The map's size=" + map.size());

32 }

33 // 获取Key的集合

34 for (String str : map.keySet()) {

35 System.out.println(str);

36 }

37

38 TreeMap treeMap = new TreeMap();

39 treeMap.putAll(map);

40 // 输出内容按照key值排序

41 for (Entry entry : treeMap.entrySet()) {

42 System.out.println("name:" + entry.getKey() + " age:"

43 + entry.getValue());

44 // name:Jack age:19

45 // name:Kate age:15

46 // name:Tom age:26

47 }

48

49 LinkedHashMap linkedHashMap = new LinkedHashMap();

50 // 向Map中添加元素

51 linkedHashMap.put("Tom", 26);

52 linkedHashMap.put("Jack", 18);

53 linkedHashMap.put("Micky", 17);

54 linkedHashMap.put("Kate", 15);

55 // 保持了插入的顺序

56 for (Entry entry : linkedHashMap.entrySet()) {

57 System.out.println("name:" + entry.getKey() + " age:"

58 + entry.getValue());

59 // name:Tom age:26

60 // name:Jack age:18

61 // name:Micky age:17

62 // name:Kate age:15

63 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

Set

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 List list = new ArrayList();2 list.add(3);3 list.add(4);4 HashSet hashSet = new HashSet();5 hashSet.add(1);6 hashSet.add(3);7 hashSet.add(2);8 hashSet.add(6);9 //重复元素将不能被添加

10 hashSet.add(3);11 //只要有元素被添加就返回true

12 if(hashSet.addAll(list)) {13 System.out.println("Add success");14 }15 //判断是否存在某个集合

16 if(hashSet.containsAll(list)) {17 System.out.println("The hashSet is contain 3 and 4");18 }19 Iterator it =hashSet.iterator();20 while(it.hasNext()) {21 System.out.print(it.next() + " ");22 //1 2 3 4 623 //看结果是被排序了,HashSet按照Hash函数排序,Integer值的HashCode就是其int值

24 }25 //换转成数组

26 Object[] integers =hashSet.toArray();27 for (int i = 0; i < integers.length; i++) {28 System.out.print((Integer) integers[i]);29 }30 //移除元素

31 hashSet.remove(3);32

33 TreeSet treeSet = new TreeSet();34 treeSet.add("C");35 treeSet.add("A");36 treeSet.add("D");37 treeSet.add("B");38 for (Iterator strIt =treeSet.iterator(); strIt.hasNext();) {39 System.out.print(strIt.next());40 //ABCD 按照字母顺序

41 }42 LinkedHashSet linkedHashSet = new LinkedHashSet();43 linkedHashSet.add("C");44 linkedHashSet.add("A");45 linkedHashSet.add("D");46 linkedHashSet.add("B");47 for (Iterator linkedIt =linkedHashSet.iterator(); linkedIt48 .hasNext();) {49 System.out.print(linkedIt.next());50 //CADB 按照插入顺序

51 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

本文没有对ArrayList及HashMap进行深入的分析,这两个类是集合类中最常用的类,将另开文章进行深入剖析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 当前文件路径获取方式_Python获取当前文件路径

一. Python 获取当前文件路径方法2. sys.path[0]获取文件当前工作目录路径(绝对路径)sys.argv[0]|获得模块所在的路径(由系统决定是否是全名)若显示调用python指令&#xff0c;如python demo.py&#xff0c;会得到绝对路径;若直接执行脚本&#xff0c;如./demo.py&#xff0c;会…

pdf不支持64位浏览器_4MLinux 31.0 发布,不支持32位

Zbigniew Konojacki宣布发布4MLinux 31.0&#xff0c;这是该项目极简发行版的新稳定版本&#xff0c;专注于四个功能&#xff1a;维护(作为系统救援Live CD)&#xff0c;多媒体(用于播放视频DVD和其他多媒体文件)&#xff0c;迷你服务器(使用inetd守护程序)和神秘的版本(提供几…

java期末考试2013及答案_java笔试经典(题及答案)2013.doc

java笔试经典(题及答案)2013.doc Java笔试经典(基础部分及答案和分析)1、一个“.java“源文件中是否可以包括多个类(不是内部类)&#xff1f;有什么限制&#xff1f;7答:可以包括多个类&#xff0c;但是最多只能有一个public修饰的类。2、Java有没有goto?7答&#xff1a;java中…

datatables 行分组信息展开与折叠的功能实现_[LaTeX 尝试] fancyvrb - 修复行引用的超链接跳转位置

本文已加入专栏文章目录&#xff0c;归入「进阶使用」文章系列。本文可以看作对这个发生于 2019 年 7 月中旬的 TeX-SX 上自问自答的展开说明。那个回答中避免了 python 的使用&#xff0c;而是利用 zref 宏包把位置信息以文本形式在 pdf 中呈现&#xff0c;好处是不用引入 pyt…

qtcreator摄像头显示时间_三星Galaxy S11 +渲染器展现出巨大的相机凹凸和四边形曲面显示...

我们正接近一年中三星宣布其Galaxy S系列最新设备的时间。Galaxy S10系列被认为是三星发布的最好的版本之一&#xff0c;因此在这方面他们有很多重要的事情。我们已经看到了Galaxy S11和Galaxy S11e的渲染&#xff0c;但是现在我们首先来看看Galaxy S11 。三星Galaxy S11 与其他…

php源码安装配置,php源码安装时configure配置参数 | 学步园

在Linux下安装PHP&#xff0c;源代码方式安装&#xff0c;总需要配置很多参数。这里列出常用配置参数&#xff0c;并详细用中文解释说明了。给大家一些参考./configure–prefix/usr/local/PHP php 安装目录–with-apxs2/usr/local/apache/bi…

python递归函数详解-讲解Python中的递归函数

在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数。 举个例子&#xff0c;我们来计算阶乘n! 1 x 2 x 3 x ... x n&#xff0c;用函数fact(n)表示&#xff0c;可以看出&#xff1a; ? 1 fact(n) n! 1 x2 x3 x ... x …

php 高效判断是否登录,php 判断用户是否登录

判断用户登陆主要分几个过程&#xff0c;第一步是用户登陆成功后把数据保存到session中&#xff0c;然后当用户访问需要登陆过的用户权限时就来判断session是否为空&#xff0c;如果不是就登录成功。下面来看个实例session_start();if(getconfig("chatroom_admin")$_…

php异步处理任务工具,php异步任务处理: gearman

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡准备软件包gearmand-1.1.12.tar.gzgearman-1.1.1.tgz php扩展安装支持组件yum -y install boost-devel* gperf* libevent-devel* libuuid-devel*./configu…

页面错误!请稍后再试_微信内嵌H5页面授权和分享

近期新上线项目&#xff0c;用到了微信授权获取用户信息和分享&#xff0c;掉坑无数次&#xff0c;遂写此篇&#xff0c;为后人指路项目情况技术选型项目语言&#xff1a;HTML、CSS、JavaScript项目框架&#xff1a;Vue.js项目搭建脚手架&#xff1a;vue-cli工程化工具&#xf…

电脑打字手指正确姿势_正确的弹琴手型,应该是怎样的?

手型是基础&#xff0c;手型规范才有助于练习出正确的指法&#xff0c;指法正确就可以提高练习质量。刚入门的时候&#xff0c;不能刻意的要求手型&#xff0c;但是我们要有一个基本的要求&#xff0c;就是手要保持放松。弹琴的时候&#xff0c;没有多余的身体的力量参与到触键…

php 开源 采集,迅睿CMS 火车头内容采集

采集工具&#xff1a;火车采集器 v7.6采集模块&#xff1a;新闻 News一、编写采集入库脚本接口新建&#xff1a;./api/caiji.php/*** 数据采集*/define(IS_API, basename(__FILE__, .php)); // 项目标识define(SELF, pathinfo(__FILE__, PATHINFO_BASENAME)); // 该文件的名称r…

英文数据集txt_YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)

点击上方“计算机视觉cv”即可“进入公众号”重磅干货第一时间送达前言随着人工智能的发展&#xff0c;现在越来越多的场景需要人工智能。在工厂的厂区中以安全为首&#xff0c;但工人普遍缺乏佩戴安全帽意识&#xff1b;工厂环境复杂&#xff0c;有各种各样的禁止进入的区域&a…

浪潮集团PHP,浪潮php实习第一天(初识php)

先推荐几个比较好的php初学者资料php manual.chm(可在csdn下载频道下载&#xff0c;可查到大部分函数)比较好的开发工具1 eclipse PDT(对eclipse比较熟悉的比较适应)2.zendStudio(公认的最好的php集成开发环境)php没有想象中的那么难学&#xff0c;不仅仅是它的语法&#xff0c…

检测到目标url存在内部ip地址泄露_Cendertron,动态爬虫与敏感信息泄露检测

Cendertron&#xff0c;动态爬虫与敏感信息泄露检测Cendertron Crawler RendertronCendertron https://url.wx-coder.cn/HinPM 是基于 Puppeteer 的 Web 2.0 动态爬虫与敏感信息泄露检测工具。其依托于 xe-crawler 的通用爬虫、调度与缓存模型&#xff0c;新增了 Monkey Test…

wamp2 php配置,wamp安装后自定义配置的方法

WampServer是目前应用非常广泛的PHP集成开发环境&#xff0c;本文就来讲述Wamp安装后自定义配置的方法。供大家参考借鉴。具体如下&#xff1a;wamp2.5安装完毕后&#xff0c;自己手动重新设置了apache的默认根目录。但是发现本机可以访问&#xff0c;别人不能访问。提示信息为…

屏幕坏点检测图片_iPhone新机如何检测质量 iPhone新机检测质量步骤【详解】

iPhone新机怎么检测好坏_iPhone新机检测质量方法 说实话&#xff0c;苹果对于iPhone的品控把握确实一代不如一代&#xff0c;特别是去年发布的iPhone7系列&#xff0c;很多用户都反映自己新买的手机存在划痕、屏幕发黄、掉漆等问题。那么当我们购买一部全新的iPhone7时&#xf…

php 安全mysql,关于php:我从mysql注入安全吗?

本问题已经有最佳答案&#xff0c;请猛点这里访问。这是否足以避免SQL注入&#xff1f;这里只需要mysql_real_escape_string()方法。在将数据插入数据库之前&#xff0c;不应该执行htmlentities()或urlencode()。这些方法通常是在呈现您提供给用户的视图期间编写的代码。避免SQ…

excel单元格斜线_怎么在excel中画斜线?怎么在excel表格中画斜线?

在excel表格中画斜线的技巧教程&#xff1a;1.在Excel中打开一个空白工作簿。 2.您可以在任何大小的单元格中执行此操作&#xff0c;但是如果先将其增大则更容易理解。为此&#xff0c;我们只需单击并按住第1行和第2行之间的线&#xff0c;然后将其拖动到所需的高度即可。然后对…

php报表数据打印机,通过打印机打印带打印功能的php表

我有以下php表,我如何只在php表中添加打印功能&#xff1f;点击一个按钮,下面的表格通过打印机打印,我试过’CTRL P’,我只得到页面的html部分示例页眉,页脚,导航栏,而不是结果php结果echo "FILEIDFirstnameLastnameIssue DateInterest RateTermsBalance OutstandingBalan…