Java集合

这篇博客详细介绍了Java集合框架,包括Set、List、Map的主要接口和实现类,如HashSet、LinkedList、HashMap等。讨论了这些集合类的特点、遍历方式、元素判断与存储原理,以及它们在多线程、排序和哈希冲突解决等方面的行为。还提到了相关工具类如Collections的使用和HashMap的实现原理,对比了HashMap与HashTable、ArrayList与LinkedList的区别。
摘要由CSDN通过智能技术生成

一、集合的概述

1.Java集合大概可以分为Set,List,Map,Queue四种体系,其中Set是无序唯一的(不可重复),List是有序不唯一的(可以重复)

2.Java集合主要有Collection和Map接口,这两个集合框架又包含了一些子类接口的实现

二、toArray()方法和toString()方法

1.toArray():不管Collection是否使用了泛型,toArray()的返回值总是Object[],后来新增加了一个toArray(IntFunction)方法后,当Collection使用了泛型后返回的类型为特定类型的数组

2.toString()一次性的输出集合中所有的元素

三、几种遍历

1、使用lambda表达式

import java.util.ArrayList;
import java.util.List;

//集合容器
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("lpf");
        list.add("sjp");
        System.out.println(list.toString());
        list.forEach((item->{
            System.out.println(item);
        }));
    }
}

2、使用Iterator遍历元素--迭代器

定义了四个方法

1.Boolean hasNext():如果被迭代的元素中还没有被遍历完,返回true

2.Object next():返回集合的下一个元素

3.void remove():删除集合里上一次next方法返回的元素

4.void forEachRemaining(Consumer action):java8默认的方法,使用lambda表达式来遍历

注意的是:Iterator迭代器采用的是快速失败(fail-fast)机制,一旦集合被修改立即引发ConcurrentModificationException异常

import java.awt.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

//集合容器
public class Test {
    public static void main(String[] args) {
        HashSet<String> h = new HashSet<>();
        h.add("java");
        h.add("python");
        h.add("Linux");
        //使用iterator获取iterator对象
        Iterator iterator=h.iterator();
        while(iterator.hasNext()){
            //泛型给出的对象类型
            String item=(String) iterator.next();
            System.out.println(item);
            if(item.equals("python")){
                //使用iterator迭代过程中不可以修改集合的元素
                //h.remove(item);
            }

        }
    }
}

3、使用forEach遍历集合元素

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

//集合容器
public class Test {
    public static void main(String[] args) {
        for(String item:h){
            System.out.println(item);
            if(item.equals("python")){
                //引发异常
                //h.remove(item);
            }
        }
    }
}

4.for循环遍历

import java.util.ArrayList;
//集合容器
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("lpf");
        list.add("sjp");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

四、Set集合

1.HashSet类

HashSet按照Hash算法来存储集合中的元素因此具有很好的存取和查找功能

特点

1.不能保证元素的排列顺序(无序性)

2.HashSet不是同步的,如果多个线程访问HashSet,假设有两个或两个以上的线程同时修改集合中的元素,则必须通过代码来同步

3.集合中的元素可以为null

HashSet判断两个元素相等的标准

通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值也相等

HashSet速度快的原因:我们都知道数组通过索引来快速的查找元素,但是HashSet没有索引这一概念,所以借助hash算法的功能,根据元素的hashcode计算出元素的位置,之所以不适用数组是因为数组的长度不可变,无法增加长度,所以才使用HashSet,因此,从HashSet中访问元素时,先计算改元素的hashcode值(调用该对象的hashcode()方法的返回值),然乎直接用hashcode的值所对应的位置取出元素

说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

HashSet如何检查重复?HashSet是如何保证数据不可重复的?

向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。 HashSet 中的add ()方法会使用HashMap 的put()方法。

HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V所以不会重复( HashMap 比较key是否相等是先比较hashcode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值