java的集合

 因为此文章用于博主的复习,所以就不介绍集合是什么,什么时候用到以及为什么要用。

直接进入干又硬的知识点

 

1 集合框架

1.1 List

List(列表)是有序的集合,它允许重复的元素。

1.LinkedList:基于链表实现,链表内存是散列的,增删快,查找慢;

2.ArrayList:基于数组实现,非线程安全,效率高,增删慢,查找快; 

3.Vector:基于数组实现,线程安全,效率低,增删慢,查找慢;

ArrayList、LinkedList、Vector 的区别
ArrayListLinkedListVector
底层实现数组双向链表数组
同步性及效率不同步,非线程安全,效率高,支持随机访问不同步,非线程安全,效率高同步,线程安全,效率低
特点查询快,增删慢查询慢,增删快查询快,增删慢
默认容量10/10
扩容机制int newCapacity = oldCapacity + (oldCapacity >> 1);//1.5 倍/2 倍

1.2 Map

1.HashMap:基于哈希表的实现,是使用频率最高的用于键值对处理的数据类型。它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,特点是访问速度快,遍历顺序不确定,线程不安全,最多允许一个key为null,允许多个value为null。

2.HashTable:线程安全,低效,不支持 null 值和 null 键;

3.LinkedHashMap: LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

4.TreeMap:能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

HashMap、HashTable、TreeMap的区别
HashMapHashTableTreeMap
底层实现哈希表(数组+链表)哈希表(数组+链表)红黑树
同步性线程不同步同步线程不同步
null值允许 key 和 Vale 是 null,但是只允许一个 key 为 null,且这个元素存放在哈希表 0 角标位置不允许key、value 是 nullvalue允许为null。
当未实现 Comparator 接口时,key 不可以为null
当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。如果针对null情况实现了,可以存入,但是却不能正常使用get()访问,只能通过遍历去访问。
hash使用hash(Object key)扰动函数对 key 的 hashCode 进行扰动后作为 hash 值直接使用 key 的 hashCode() 返回值作为 hash 值
容量容量为 2^4 且容量一定是 2^n默认容量是11,不一定是 2^n
扩容两倍,且哈希桶的下标使用 &运算代替了取模2倍+1,取哈希桶下标是直接用模运算

1.3 Set 

1.HashSet:底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

2.LinkedHashSet: 底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。

3.TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序,唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。

HashSet、TreeSet、LinkedHashSet的区别
HashSetTreeSetLinkedHashSet
底层实现HashMap红黑树LinkedHashMap
重复性不允许重复不允许重复不允许重复
有无序无序有序,支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。有序,以元素插入的顺序来维护集合的链接表
时间复杂度add(),remove(),contains()方法的时间复杂度是O(1)add(),remove(),contains()方法的时间复杂度是O(logn)LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet,时间复杂度是 O(1)。
同步性不同步,线程不安全不同步,线程不安全不同步,线程不安全
null值允许null值不支持null值,会抛出 java.lang.NullPointerException 异常。因为TreeSet应用 compareTo() 方法于各个元素来比较他们,当比较null值时会抛出 NullPointerException异常。允许null值
比较equals()compareTo()equals()

2 集合的基本操作 

2.1 基本操作

public class CollectionExample {
    public static void main(String[] args) {
        // 创建一个 ArrayList
        ArrayList<String> fruits = new ArrayList<>();

        // 添加元素
        fruits.add("苹果");
        fruits.add("香蕉");
        fruits.add("橙子");

        // 删除元素
        fruits.remove("香蕉");

        // 遍历元素
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

 

2.2 Iterator接口 

Iterator接口,用于遍历集合元素的接口。 

public static void main(String[] args) {
    List<String> list1 = new ArrayList<>();
    list1.add("abc0");
    list1.add("abc1");
    list1.add("abc2");

    // while循环方式遍历
    Iterator it1 = list1.iterator();
    while (it1.hasNext()) {
        System.out.println(it1.next());
    }

    // for循环方式遍历
    for (Iterator it2 = list1.iterator(); it2.hasNext(); ) {
        System.out.println(it2.next());

2.3 集合工具类Collections

 Collections:集合工具类,方便对集合的操作。这个类不需要创建对象,内部提供的都是静态方法。

Collections.sort(list);//list集合进行元素的自然顺序排序。
Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。
class ComparatorByLen implements Comparator<String>{
  public int compare(String s1,String s2){
     int temp = s1.length()-s2.length();
     return temp==0?s1.compareTo(s2):temp;
  }
}
Collections.max(list);//返回list中字典顺序最大的元素。
int index = Collections.binarySearch(list,"zz");//二分查找,返回角标。
Collections.reverseOrder();//逆向反转排序。
Collections.shuffle(list);//随机对list中的元素进行位置的置换。

//将非同步集合转成同步集合的方法:Collections中的  XXX synchronizedXXX(XXX);  
//原理:定义一个类,将集合所有的方法加同一把锁后返回。
List synchronizedList(list);
Map synchronizedMap(map);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值