• 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)相关推荐

  1. java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

    一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...

  2. 【从零开始的Java开发】1-5-4 ArrayList、HashSet、HashMap 概述与案例

    文章目录 集合框架的体系结构 List概述 ArrayList 案例:在List中操作String 案例:公告管理--在ArrayList中对自定义对象的操作 Set概述 案例:在Set中操作Stri ...

  3. java中HashMap、ArrayList、HashSet的存储原理及遍历方式汇总

    HashMap类 底层存储方式:1. HashMap在JDK1.7之前底层是用数组+链表的方式存储的:在JDK1.8之后底层是用数组+链表+红黑树存储的;2.HashMap里面实现了一个静态内部类En ...

  4. JAVA面试集合类之ArrayList详解

    ArrayList 构造方法 1.ArrayList():无参构造方法创建的ArrayList起始容量为0 private static final Object[] DEFAULTCAPACITY_ ...

  5. Java常用集合类:ArrayList

    1.知识点 1.ArrayList底层数组默认初始化大小为10,但是使用ArrayList的无参构造函数的时候,并没有马上进行扩容,我们查看源码就会发现,无参构造函数只是将ArrayList中的DEF ...

  6. Java中如何克隆集合——ArrayList和HashSet深拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...

  7. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  8. Java最佳实践– Vector vs ArrayList vs HashSet

    在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将在三个最常用的Collection实现类之间进行性能比较. 为了使事情变得更现实,我们将在多线程环境下进行测试,以讨论和演示如 ...

  9. java 创建集合类数组_Java集合 -- ArrayList集合及应用

    JAVA集合 对象数组 集合类之ArrayList 学生管理系统 斗地主案例 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3, ...

最新文章

  1. 磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底
  2. U3D SCENEMANAGER.LOADSCENE是半异步的
  3. 【PAT甲级 U形打印】1031 Hello World for U (20 分) Java版 6/6通过
  4. R开发(part2)--R语言中的数学计算
  5. 集群(cluster)amp;高可用性(HA)概念
  6. 5 年之后,产品经理,没了?
  7. c语言求偶数的积,《动物的多*语言》阅读理解及*
  8. Spring 定时执行任务重复执行多次
  9. ORACLE数据库多表关联查询效率问题解决方案
  10. 中国省市区 json
  11. ubuntu12.04双屏拼接
  12. linux命令之cp:略过目录
  13. Android 支付宝 resultStatus=4000, result=, memo=系统繁忙,请稍后再试
  14. 《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第六章 纹理 Texturing
  15. 使用node连接MongoDB的工具安装及配置
  16. vdbench运行报错:java.net.NoRouteToHostException: No route to host (Host unreachable)
  17. C#迭代器的详细用法
  18. UM5202EEDFSOT-143工作电压5V用于高速线路保护的2线ESD保护二极管阵列管UM5202EEDF USB端口和以太网端口保护TVS二极管阵列,低泄漏电流和箝位电压25V结电容1PF
  19. 微信小程序实战篇-电商(一)
  20. Actionbar 溢出菜单背景色设置

热门文章

  1. 设计模式(二)构建型模式
  2. Navicat加载缓慢
  3. Aliyun Linux2安装Docker
  4. Root cause be too many concurrent connections error could not open clinet transport with jdbc uri
  5. 使用Spark Shell开发运行Spark程序
  6. c语言大作业万年历,C语言实现简单万年历
  7. java cygwin 乱码_Cygwin中文乱码的解决方案
  8. 数据库本地的sa有个叉号_多个客户端(50)同时使用sa账号操作服务器数据库(sqlserver)会有问题吗?...
  9. 机器学习代码实战——随机森林(Random Forest)
  10. RV1109 Linux SDK入门指南