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 null
            if (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);
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值