java集合——数组列表(ArrayList)+散列集(HashSet)

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java集合——数组列表(ArrayList)+散列集(HashSet) 的相关知识;
0.2) 散列集HashSet 涉及到 hashCode()方法 和 hash 码, 详情参见: http://blog.csdn.net/pacosonswjtu/article/details/50312917
0.3) for full source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/SetTest.java


【1】数组列表(ArrayList)

1.1) List接口用于描述一个有序集合, 并且集合中每个元素的位置十分重要;
1.2)有两种访问元素 的协议:

  • 1.2.1)一种是用迭代器;
  • 1.2.2)另一种是使用 get 和 set方法随机的访问每个元素;
  • 1.2.3)后者不适用于链表, 但对数组却很有用。集合类库提供了一种大家熟悉的ArrayList 类, 这个类也实现了 List接口。

1.3) ArrayList 封装了一个动态再分配的对象数组;

Annotation)

  • A1)对于有经验的 coder 来说, 在需要动态数组的时候, 可能会使用 Vector类;
  • A2)为什么要用 ArrayList 取代 Vector呢? 因为, Vector 类的所有方法都是同步的(可以由两个线程安全的访问一个 Vector对象);但是, 如果由一个线程访问 Vector, 代码需要在同步操作上 耗费大量的时间;(干货——ArrayList非同步访问,而Vector同步访问)
  • A3)而ArryaList 不是同步 的, 所以, 建议在不需要同步时 使用 ArrayList, 而不要使用 Vector;
    这里写图片描述

【2】散列集(HashSet)

2.1)如果不在意元素的顺序,可以有几种能够快速查找元素的数据结构。 其缺点是无法控制元素出现的次序。 它们将按照有利于其操作目的的原则组织数据;
2.2)散列表定义: 有一种众所周知的数据结构, 可以快速查找所需要的对象;

  • 2.2.1)散列码:散列表为每个对象计算一个整数, 称为散列码;
  • 2.2.2)散列码是由对象的实例域产生 的一个整数。 更准确的说, 具有不同数据域的对象将产生不同的散列码, 下表列出了几个散列码的实例, 它们是由String 类 的hashCode 方法产生的;
    这里写图片描述
    2.3)如果自定义类, 就要负责实现这个类 的 hashCode 方法。
    Attention)

  • A1)自己实现的 hashCode方法要与 equals 方法兼容, 即 如果a.equals(b) 为 true, a 与b 必须具有相同的散列码;(干货, 两个对象的equals 方法结果===它们的 hashCode 方法的结果)

  • A2)现在, 最重要的问题是 散列码要能够快速计算出来, 并且这个计算只与要散列 的对象状态有关, 与散列表的其他对象无关;

2.4)在java中, 散列表用链表数组实现: (C语言应该讲过链表数组,我们不累述)

  • 2.4.1)每个列表就被称为桶: 要想找到表中对象 的位置, 就要先计算它的散列码, 然后与桶的总数取余, 所得到的结果就是保存这个元素的桶的索引;
    这里写图片描述
  • 2.4.2)如何设置桶数?
    • 2.4.2.1) 通常,将桶数设置为预计元素个数的 75%~150%;有些研究人员认为:尽管没有确凿的证据, 但最好还是将桶数设置为一个素数, 以防止键的集聚;
    • 2.4.2.2)标准类库使用的桶数是2的幂,默认值为16;(为表大小提供的任何值都将被自动转换为2的下一个幂);
  • 2.4.3)再散列:如果散列表太满, 就需要再散列;如果要对散列表再散列, 就需要创建一个桶数更多的表,并将所有元素插入到这个新表中, 丢弃原来的表;
    • 2.4.3.1)装填因子: 它决定何时对散列表进行再散列, 一般设置为 0.75;

2.5)散列表可以用于实现几个重要的数据结构:

  • 2.5.1)其中最简单的是 set类型。 set是没有重复元素的集合。set 的 add 方法首先在 集中查找要添加的元素, 如果不存在,就将这个对象添加进去; (干货——add方法的执行原理)

2.6)java 集合提供了 一个 HashSet类, 它实现了基于 散列表的集;可以用 add 方法添加元素,还有contains 方法被重新定义, 用来快速查看是否某个元素已经出现在集合中了;

  • 2.6.1)散列集迭代器将依次访问所有的桶。 由于散列将元素分散到表的各个位置上, 所以访问他们的顺序几乎是随机的。 只有不关心集合中元素顺序的时候才应该使用 HashSet (干货)
  • 2.6.2)看个荔枝: 这个程序将读取输入的所有单词, 并且将它们添加到散列集中。 然后遍历散列集中的不同单词, 最后打印出单词数量;

Warning)在更改集中元素的时候要格外小心。 因为如果元素的散列码发生了改变, 元素在数据结构中的位置也会发生相应变化的;
这里写图片描述
这里写图片描述
这里写图片描述

API java.util.HashSet<E> 1.2
HashSet() :构造一个空散列集;
HashSet(Collection< ? extends E> elements) :构造一个空散列集, 并将集合中的元素添加到这个散列集中;
HashSet(int initialCapacity)::构造一个空散列集;且具有执行容量(桶数)
HashSet(int initialCapacity, float loadFactor):构造一个具有指定容量和装填因子(0.0~1.0)的空散列集;API java.lang.Object 1.0
int hashCode() : 返回这个对象的散列码。散列码可以是任何整数(正负数)。equals 和 hashCode 的定义必须兼容, 即 如果 x.equals(y) 为true, x.hashCode()必须等于 y.hashCode();

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

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

相关文章

javafx之TableView的TaleCell

TaleCell 对TableColumn的cell里面弄重新构造 TableColumn的setCellFactory(TextFieldTableCell.forTableColumn());有一些默认的构造。 或者重写TableCell类 [java] view plaincopy tableColumn.setCellFactory(new Callback<TableColumn<Path, Number>, TableCell…

jdk8 cms g1gc_JDK 14:CMS GC是OBE

jdk8 cms g1gcJDK 14 Early Access Build&#xff03;23 &#xff08; 2019/11/13 &#xff09; 现已上市 。 此版本最值得注意的更改之一是删除了并发标记扫描垃圾收集器 。 JEP 291 [“弃用并发标记扫描&#xff08;CMS&#xff09;垃圾收集器”]早在2017年就使用JDK 9和JEP …

java集合——树集(TreeSet)+对象的比较

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——树集&#xff08;TreeSet&#xff09;对象的比较 的相关知识&#xff1b; 0.2&#xff09; for full source code, please visit https://github.co…

php curl伪装cookies,php curl 添加cookie伪造登陆抓取数据

有的网页必须登陆才能看到&#xff0c;这个时候想要抓取信息必须在header里面传递cookie值才能获取1、首先登陆网站&#xff0c;打开firebug就能看到对应的cookie把这些cookie拷贝出来就能使用了2、<?php header("Content-type:text/html;Charsetutf8");$ch curl…

JavaFX之TableView的TableRow

TableRow 通过TableView的setRowFactory,对行的双击进行操作 tableView.setRowFactory(new Callback<TableView<T>, TableRow<T>>() { Override public TableRow<T> call(TableView<T> param) { return new TableRowControl(); }…

rpc结构错误_结构性错误

rpc结构错误团队成员在使用以下代码时遇到了麻烦&#xff1a; void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, Stri…

zabbix前端php界面,Zabbix Web UI

PS&#xff1a;其实安装zabbix很简单&#xff0c;网上资料一搜一大把&#xff0c;基本都是采用yum方式安装&#xff0c;简单省事。正因如此我没写相关配置文档&#xff0c;安装方式一般用yum安装或源码安装亦或是容器安装&#xff0c;最近有网友提出来了&#xff0c;我认真对待…

Comparable与Comparator的区别

【0】README 0.1&#xff09;本文章节一&#xff08;除开 Conclusion内容&#xff09;转自&#xff1a; http://blog.csdn.net/mageshuai/article/details/3849143 0.2&#xff09; 余下内容均为原创&#xff0c;包括源代码&#xff1b; 【1】Comparable与Comparator的区别&a…

JavaFX之TableView的MenuButton

MenuButton 在JavaFx的 TableView 上可以使用MenuButton来管理TableView的Column. 启用MenuButton. TableView.setTableMenuButtonVisible(true); 但是普通的MenuButton, 每次点击都会刷新TableView 重写TableMenuButton的事件 [java] view plaincopy 找到tableView 的 …

java 读取 文本块_Java 13:文本块

java 读取 文本块Java 13已交付了期待已久的多行字符串或Text Blocks 。 您不再需要连接跨越多行的字符串或转义特殊字符&#xff0c;这确实提高了代码的可读性。 文本块是一种预览语言功能 &#xff0c;这意味着必须使用--enable-preview标志在Java编译器和运行时中明确启用它…

php 崩溃 输出,php – 创建可崩溃的print_r()var_dump()的函数?

你可能熟悉print_r的这个输出&#xff1a;Hierarchy Object([parent:private] > Hierarchy Object([parent:private] >[children:private] > Array()[level:private] > 0[price_modes:private] > Array()[id:protected] >[left_id:protected] >[right_id:…

JavaFX之TableView的SelectionMode

SelectionMode table默认是只能选着一行的&#xff0c;如果想选着多行&#xff0c;设置SelectionMode,此时可以对选中的多个进行监听。 [java] view plaincopy ListChangeListener<Person> indicesListener new ListChangeListener<Person>() { …

Comparable and Comparator API

【0】README 0.1&#xff09;文本全文翻译于 java 8 JDK 官方文档中关于 Comparable and Comparator 的描述&#xff1b; 0.2&#xff09;能力有限&#xff0c;仅供参考&#xff1b; 【1】 Interface Comparable 1.0&#xff09;类型参数&#xff1a; 与本对象进行比较的另一…

sql2008 sql服务_SQL即服务

sql2008 sql服务自2007年以来&#xff0c;我一直在考虑这一点&#xff0c;大约在Amazon 推出 S3时。 我什至尝试实现了几次&#xff0c;但是在设计阶段之后就失败了。 我听说过一家初创公司也尝试这样做&#xff0c;但也失败了 。 我仍然不确定是否可以这样做&#xff0c;但是它…

dede rss.php,DeDeCMS dede 织梦cms RSS全站静态输出的实现方法

DedeCMS自带Rss功能&#xff0c;在管理后台可以生成出一个Rss地图页面&#xff0c;默认是/data/rssmap.html&#xff1b;这个Html地图文件会告知用户每个栏目的rss订阅地址&#xff0c;这个功能很适合栏目及文章较多的网站&#xff0c;但不太适合文章页不多的小型站点&#xff…

java之注解

注解使用一、java的常用注解 Override 重写覆盖方法 SuppressWarnings 压住警告可用于类和方法 Deprecated 声明类或方法过时 注解Override用在方法上&#xff0c;当我们想重写一个方法时&#xff0c;在方法上加Overr…

java集合——队列和双端队列+优先级队列

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——队列和双端队列优先级队列 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-j…

java无效的源发行版_无效的Java

java无效的源发行版也许我可以被机器人代替进行代码审查。 有一些反馈我发现自己一遍又一遍。 这是我最不喜欢的一些&#xff1a; 通用代码结构 放弃其他 当if在两端return的else是多余的和不必要的创建缩进。 if (foo) { return bar; } else { return baz; } // should be…

oracle数值型转为char类型,PLSQL: Oracle函数to_char转化数字型指定小数点位数的技巧...

问题题出&#xff1a; 数字0.023 > 转化成字符串"0.023"问题难点&#xff1a;to_char&#xff0c;函数功能&#xff0c;就是将数值型或者日期型转化为字符型。比如最简单的应用&#xff1a;Select TO_CHAR(1.0123) FROM DUALSelect TO_CHAR(123) …

java之常用方法

一、数学函数 在System.Math类里面的函数 I、三角函数 sin(radians) 正弦函数 cos(radians) 余弦函数 tan(radians) 正切函数 toRadians(degree) 角度转为弧度 toDegree(radians) 弧度转为角度 asin(a) 反正弦函数 acos(a)…