Java中的集合

本文详细介绍了Java中的单列集合(如ArrayList, Vector, LinkedList)及其特性,以及Set(包括HashSet, TreeSet, LinkedHashSet)的区别,重点讲解了线程安全、内存结构和操作效率。同时涵盖了HashMap, TreeMap, LinkedHashMap等Map的实现及其遍历方法。
摘要由CSDN通过智能技术生成

单列集合 collection

ArrayList

可变数组,默认容量10。插入元素后自动移动后面的元素

不是线程安全的

Vector

和ArrayList的主要区别是,Vector的线程是安全的,其他使用方法和ArrayList一致

LinkedList

底层使用双向链表实现,内存空间不需要连续。一个元素两端的两个地址引用分别指向上一个和下一个元素,元素中间是值。

给链表的开头和末尾添加袁旭只需要链表中一个元素的相关引用地址。

中间插入元素也只需要修改两个元素的引用地址

LinkedList对元素的增删改操作速度非常快,但是随机访问速度比较慢,因为LinkedList需要从第一个索引开始寻找

什么是随机访问?

获取列表中的指定索引位置的元素

 

LinkedList的一些特殊API

list.addFirst()//给第一个添加元素
list.addLast()//给最后一个添加元素
list.removeFirst()//移除第一个元素
list.removeLast()//移除最后一个元素
list.pollFirst()//弹出第一个元素,即将第一个元素从集合中去除,返回值是第一个元素
list.polllast()//弹出最后一个元素
list.pop()//弹出链表表头元素
list.pop()

Set集合

HashSet

底层使用HashMap实现,一个不重复的Set集合

HashSet set=new HashSet();
set.add(1);
set.add(2);
sout(set);
//相同的元素无法加入集合

 

HashSet遍历:

        1、for each遍历

        

for(Object obj:set){ sout(obj); }

        2、迭代器

//得到一个迭代器对象 //迭代器中的两个方法: 
//1、hasnext() 判断是否有下一个元素,有返回true,没有返回false 
//2、next() 获取下一个元素 Iterator iterator = set.iterator(); 
while(tierator.hasnext())
{ 
Object obj=iterator.next();
 sout(next); 
}

 

TreeSet

是一个不重复,而且有顺序的set

 TreeSet是如何保持有序的

TreeSet内部进行强制类型转换,转换成Comparable(接口)类型,通过这个比较器来比较两个元素大小,所以放在TreeSet中的元素必须有实现的方法,才可以实现Comparable接口,通过这个比较器进行排序

TreeSet在创建时可以指定一个比较器

这个时候就不需要继承comparable接口

public class TeacherComparator implements Comparator<Teacher>{//泛型要指定为Teacher
    public int compare(Teacher t1,Teacher t2){
        //code 
    }
}

//创建集合的时候传入一个比较器对象
TreeSet set = new TreeSet(new TeacherComparator);

 

LinkedHashSet

一个可以维护元素插入顺序的HashSet,不按照规则进行排序,但是插入元素时原来的顺序保持不变

双列集合

以键值对的方式在内存中存储数据

什么是键值对?

一个ID对应一个值

 规则:

key不能重复,但是value可以重复

HashMap

  1. 实现了map接口中的所有方法
  2. 线程不同步

//创建HsahMap对像
HashMap map=new HashMap();
map.put(1,"第一个元素");//put()方法给对象赋值
map.put(2,"第二个元素");

 工作原理:

掉用new HashMap()时并不会产生新数组,而是开辟了一段空间(HashMap数组容量扩容时是空间翻倍扩容),添加第一个元素是才会创建新的数组。

添加元素时会首先根据元素的key,计算出hashcode,并根据这个hashcode决定这个元素在数组中的元素。

 添加元素时如果链表超过了8个,分为两种情况

1、链表元素超过了8个,但是整个数组长度没有超过64,此时JVM会对数组进行翻倍扩充,然后重新计算元素地址

2、如果链表元素超过了8个,且长度超过64,此时会将整个链表树化(红黑树),当某个红黑树上的元素少于6个时,又会自动转换为链表

3、当数组达到了负载因子(0.75)规定的大小时,会进行翻倍扩容,最大容量为:2^30。

HashMap的注意点:

  1. key不能重复,如果是key相同,value会被新的覆盖
  2. key可以是任何类型,但是这个类型需要重写equals和hashCode,一般用String和int,不会使用自定义类型
  3. 如果key是基本类型,必须是包装类

HashMap的遍历

提供了API对Hash Map集合遍历

1、entrySet

Set<map.Entry> set=map.entrySet();
for(Map.Entry entry:set){
    sout(entry.getKey()+":"+map.get(key));
}

2、keySet

Set<Integer> keys = map.keySet();
for(Integer key:keys){
    sout(key+":"+map.get(key));
}

3、如果只遍历value,使用values()

Collection value=map.values();
for(Object obj:values){
    sout(obj);
}

TreeMap

有顺序的map,排序方式按照key的比较器进行排序。常用String或基本类型,这些类型都实现了Comparable接口

LinkedHashMap

一个可以维护插入顺序的Map,内部使用一个双向链表,实现元素的顺序保存

Hashtable

和HashMap几乎一直,但是线程是安全的,效率比较低。

ConcurrentHashMap

线程安全,但是不使用synchronized锁,使用分段锁、自选锁,效率相对于HashMap更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值