Java Colections 集合类 —— List、ArrayList、Set(HashSet)
capacity 对于 ArrayList,以 1.5 的速率增长,对于 HashMap 则以 2 倍的速率增长。
继承关系如下:
0. List<T> 是一个接口
该接口定义的高级成员函数有:
- contains() ⇒ 是否包含;
String[] people; List names = Arrays.asList(new String[]{"zhang", "san"}); for (String p: people) {if (names.contains(p)) {...} }
1. 删除元素的标准写法
避免在迭代中删除元素,抛 ConcurrentModificationException 异常;(迭代遍历过程中,会要求 modCount 不发生变化,如果变化,便会抛 ConcurrentModificationException 异常)
for (String str : myArrayList) {if (someCondition) {myArrayList.remove(str);} }
解决方法有两种:
https://stackoverflow.com/questions/18448671/how-to-avoid-concurrentmodificationexception-while-removing-elements-from-arr
- 使用迭代器(iterator)的 remove 方法
Iterator<String> iter = myArrayList.iterator();while (iter.hasNext()) {String str = iter.next();if (someCondition)iter.remove(); }
- 获取元素的索引,直接按位置删除:
public void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {observers.remove(i);} }
2. HashSet 的应用场景
Set 中最常被使用的是测试(判断)归属性(基于对象的值),可以很容易地询问某个对象是否在该 Set 中。正因如此,查找(lookup)就成为了 Set 中最重要的操作。因此通常都会选择一个 HashSet 的实现,其专门对快速查找进行了优化。
- 交集:set1.retainAll(set2)
- 并集:set1.addAll(set2)
- 差集:set1.removeAll(set2)
3. TreeSet
TreeSet 将元素存储在红黑树数据结构中;
- 使用 TreeSet 实现对结果的排序
SortedSet<Integer> intset = new TreeSet<Integer>();
HashSet 使用的是哈希散列函数;
LinkedHashSet 也是使用了散列的方式以加快查询的速度,又通过链表来维护元素的插入顺序;
4. HashMap 与 HashTable
HashTable 是非常老的自 JDK 1.0 便伴随的 Java 类了;
HashMap对象的key、value值均可为null。HahTable对象的key、value值均不可为null。
- 且两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
为什么 HashTable key 和 value 不可以为 null?
- 为了 HashTable 存取的方便,作为 key 的对象必须实现 hashCode 以及 equals 方法,null 不是一个对象,不存在 equals 以及 hashCode 方法;
public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode(); // null.hashCode() => 自然会抛空指针异常.... }
- 至于 HashMap,并非不采用 hash 的方式,而是对于 null 的 key,将其 hash 值视为 0,key 为 null 的键值对,存放在 0 号 bucket;
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
Java Colections 集合类 —— List、ArrayList、Set(HashSet)相关推荐
- java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)
一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...
- 【从零开始的Java开发】1-5-4 ArrayList、HashSet、HashMap 概述与案例
文章目录 集合框架的体系结构 List概述 ArrayList 案例:在List中操作String 案例:公告管理--在ArrayList中对自定义对象的操作 Set概述 案例:在Set中操作Stri ...
- java中HashMap、ArrayList、HashSet的存储原理及遍历方式汇总
HashMap类 底层存储方式:1. HashMap在JDK1.7之前底层是用数组+链表的方式存储的:在JDK1.8之后底层是用数组+链表+红黑树存储的;2.HashMap里面实现了一个静态内部类En ...
- JAVA面试集合类之ArrayList详解
ArrayList 构造方法 1.ArrayList():无参构造方法创建的ArrayList起始容量为0 private static final Object[] DEFAULTCAPACITY_ ...
- Java常用集合类:ArrayList
1.知识点 1.ArrayList底层数组默认初始化大小为10,但是使用ArrayList的无参构造函数的时候,并没有马上进行扩容,我们查看源码就会发现,无参构造函数只是将ArrayList中的DEF ...
- Java中如何克隆集合——ArrayList和HashSet深拷贝
2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...
- 浅谈Java语言中ArrayList和HashSet的区别
Java语言中ArrayList和HashSet的区别 2019-04-10 13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...
- Java最佳实践– Vector vs ArrayList vs HashSet
在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将在三个最常用的Collection实现类之间进行性能比较. 为了使事情变得更现实,我们将在多线程环境下进行测试,以讨论和演示如 ...
- java 创建集合类数组_Java集合 -- ArrayList集合及应用
JAVA集合 对象数组 集合类之ArrayList 学生管理系统 斗地主案例 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3, ...
最新文章
- 磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底
- U3D SCENEMANAGER.LOADSCENE是半异步的
- 【PAT甲级 U形打印】1031 Hello World for U (20 分) Java版 6/6通过
- R开发(part2)--R语言中的数学计算
- 集群(cluster)amp;高可用性(HA)概念
- 5 年之后,产品经理,没了?
- c语言求偶数的积,《动物的多*语言》阅读理解及*
- Spring 定时执行任务重复执行多次
- ORACLE数据库多表关联查询效率问题解决方案
- 中国省市区 json
- ubuntu12.04双屏拼接
- linux命令之cp:略过目录
- Android 支付宝 resultStatus=4000, result=, memo=系统繁忙,请稍后再试
- 《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第六章 纹理 Texturing
- 使用node连接MongoDB的工具安装及配置
- vdbench运行报错:java.net.NoRouteToHostException: No route to host (Host unreachable)
- C#迭代器的详细用法
- UM5202EEDFSOT-143工作电压5V用于高速线路保护的2线ESD保护二极管阵列管UM5202EEDF USB端口和以太网端口保护TVS二极管阵列,低泄漏电流和箝位电压25V结电容1PF
- 微信小程序实战篇-电商(一)
- Actionbar 溢出菜单背景色设置
热门文章
- 设计模式(二)构建型模式
- Navicat加载缓慢
- Aliyun Linux2安装Docker
- Root cause be too many concurrent connections error could not open clinet transport with jdbc uri
- 使用Spark Shell开发运行Spark程序
- c语言大作业万年历,C语言实现简单万年历
- java cygwin 乱码_Cygwin中文乱码的解决方案
- 数据库本地的sa有个叉号_多个客户端(50)同时使用sa账号操作服务器数据库(sqlserver)会有问题吗?...
- 机器学习代码实战——随机森林(Random Forest)
- RV1109 Linux SDK入门指南