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,一经查实,立即删除!

相关文章

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 与其他…

页面错误!请稍后再试_微信内嵌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…

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

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

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

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

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

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

xbox one s驱动_理想照进现实 理想ONE开始接受预定

2016年4月22日&#xff0c;车和家创始人&CEO李想在源码资本第二届码会年会首谈车和家&#xff0c;改造城市出行。车和家 创始人&CEO 李 想2016年码会年会演讲2019年4月10日&#xff0c;增程式智能电动车「理想ONE」正式公布售价并开始接受预订&#xff0c;并将于2019年…

date设置时间_解决 IDEA 无法找到 java.util.Date 的问题

原文首发于 https://studyidea.cn/问题最近在项目中频繁使用到 java.util.Date&#xff0c;但是使用 IDEA 提示查找 Date 类&#xff0c;却无法找到 java.util.Date。可以看到&#xff0c;智能提示的结果没有 java.util.Date。没办法&#xff0c;只能暂时手动导入该包。最近闲下…

mysql插入语句例句,一句简单的MySql插入语句怎么写 ?

守候你守候我insert into 表名 values(default,"名字","2011-04-15 12:22:25"); //default可以换成null------------------------------insert into 表名 (name,datetime) values("名字","2011-04-15 12:22:25");使用SQL语法大写&…

路由器下一跳地址怎么判断_网络基本功三:细说路由器

介绍以太网交换机工作在第二层即数据链路层&#xff0c;用于在同一网络内部转发以太网帧。但是&#xff0c;当源和目的IP地址位于不同网络时&#xff0c;以太网帧必须发送给路由器。路由器负责在不同网络间传输报文&#xff0c;通过路由表来决定最佳转发路径。当主机将报文发送…

python函数的作用域_python学习第五篇 函数 变量作用域

原博文 2019-07-18 23:40 − 函数 函数是组合好的&#xff0c;可以重复使用的&#xff0c;用来实现单一或相关联功能的代码片段作用 能提高应用的模块性和代码的重复利用率函数的创建 第一函数的规则 1.函数代码块一def关键字开头&#xff0c;后接函数标识符名称和圆括号‘&…

python pip使用_Python——pip的安装与使用

pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。目前如果你在 python.org 下载最新版本的安装包&#xff0c;则是已经自带了该工具。Python 2.7.9 或 Python 3.4 以上版本都自带 pip 工具。pip 官网&#xff1a;https://pypi.o…

php文章列表样式,PHPCMS V9 文章列表循环样式自定义方法

在此&#xff0c;再次分享Whidy的文章"phpcms文章列表循环不同样式制作方法"&#xff0c;下面CMSYOU来与大家具体分享&#xff0c;原地址为http://whidy.net/phpcms-list-with-different-style.html&#xff0c;在这里感谢。大家在用PHPCMS系统做网站的时候,有时候在…

查看ie保存的表单_解决浏览器保存密码自动填充问题

解决浏览器保存密码自动填充问题问题描述话说有一天&#xff0c;我如往常一样打开我的开发网站进行登录操作。浏览器很平常的在我们进行登录操作之后询问我是否需要记住密码&#xff0c;懒惰如我点击了记住密码。一切都很正常的进行着&#xff0c;没有什么异常发生。然而&#…

python mysql 正则表达式,MySQL之正则表达式(REGEXP)

MySQL中正则表达式通常被用来检索或替换符合某个模式的文本内容&#xff0c;根据指定的匹配模式匹配文中符合要求的特殊字符串。例如&#xff0c;从一个文件中提取电话号码&#xff0c;查找一篇文章中重复的单词或替换用户输入的敏感语汇等&#xff0c;这些地方都可以使用正则表…