Java常见集合类

List,Set,Map

1.List


List接口是Collection接口的子接口,是最常用的接口。它有以下几个特点:

  • 有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)。

  • 有索引,包含了一些带索引的方法。

  • 允许存储重复的元素。

List接口常用的实现类有3个:ArrayList、LinkedList、Vector

List部分方法

List接口实现了Collection接口的方法例如.size() .isEmpty() .remove()等方法,因为它之中的元素是有序的,所以增加了些有关索引的方法:

  1. add(int index, Object element):在列表的指定位置插入指定元素。

  1. get(int index):返回列表中指定位置的元素,index从0开始。

  1. indexOf(Object o):返回list集合中第一次出现o对象的索引位置,如果list集合中没有o对象,那么就返回-1

  1. listIterator():返回此列表元素的列表迭代器(按适当顺序)

List接口可以被继承也可以被多次实现

ArrayList类是List接口的一个实现类所以有一些方法是List类型变量不能使用的方法

.ensureCapacity(int minCapacity) //设置集合的最小容量,在集合数目确定的时候可以使用。
//设置集合的最小容量,在集合数目确定的时候可以使用。
arrayList.ensureCapacity(int minCapacity) 
//如果确定类list中的元素,建议这么写,性能比较高,没有扩容操作。
List<String> list = Arrays.asList("123","qwe","asd","zxc");
元素删除

list集合会自动调整集合内的元素位置,如有下标移除则会自动将之后的元素前移。所以需要移除list中许多元素时建议使用倒叙删除

for (int i = list.size()-1; i>=0; i--) {
    //移除集合中所有的“a”
    if ("a".equals(list.get(i))){
        list.remove(i);
    }
}

还有迭代器删除和lambada删除两种常用方法

ArrayList和LinkedList区别

ArrayList和LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同。

ArrayList是基于动态数组数据结构的实现,访问元素速度优于LinkedList。而LinkedList是基于链表数据结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于ArrayList。

对于快速访问对象的需求,使用ArrayList实现执行效率上会比较好。如果需要频繁地插入或删除元素,则使用LinkedList会更加高效

ArrayList和Vector区别

Vector也是基于动态数组结构实现的,Vector和ArrayList最大的不同就是Vector是线程安全的。ArrayList是线程不安全的。Vector中的方法都是同步方法 (synchronized),因此它的执行效率要低于ArrayList。

当然List也是线程不安全的

2.Set


Set和List的区别

Set和List都继承了Collection接口

List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在。

与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。

List可以通过下标访问,Set不能

Set的实现类

主要有两个常用的实现类:HashSet类和TreeSet类。此外还有LinkedHashSet。

HashSet和TreeSet都是Set接口的实现类。HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储。

它们保证数据唯一性的依据不同。HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的。

Set的用法

由于它的特性,常被用来去重,将元素集合全部添加到HashSet中,可以实现去重。

Set如何判断对象相等

Set的底层实现是HashMap,hashcode就是一个int的数。

两个对象的hashcode如果相等,这两个不一定相等,因为可能存在hash碰撞。但是两个对象的hashcode如果不相等,那么这两个对象绝对不相等。hashmap判断两个key是否相等

  • 先判断这两个对象的hashcode是否相等,如果相等,再去调用equals。如果不相等,就直接认为这两个对象不相等。

  • 两个对象的equals相等,那么这两个对象一定相等。

为什么重写equals必须要重写hashCode,因为equals方法中调用了hashCode方法,如果不同时重写,将会出现错误

3.Map


Map是一种关联容器,它实现从键(key)到值(value)的映射。Map可以存储任意类型的数据,包括使用者自定义的数据类型

Map主要有四个实现类

HashMap:基于哈希表实现的 Map 接口,它允许使用 null 值和 null 键。LinkedHashMap:继承自 HashMap,它通过维护一个双向链表来保持插入顺序。TreeMap:基于红黑树实现的 Map 接口,它按照键的自然顺序或者指定的比较器进行排序。Hashtable:与 HashMap 类似,但它不允许使用 null 值和 null 键,并且是线程安全的。

hashMap数据结构

数组+链表(数组加红黑,性能能树),充分利用了数组和链表的优点,使hashMap无论是get还是put都很快,性能较高。

hashMap在多线程中可能会造成key value对个数不准确,但是k/v是一个整体,不会导致错位。

常用方法

put(key,value):用于存储数据,如果key相同则值会覆盖,允许key和value为null。get(key):用于获取指定key的值。isEmpty():判断map是否为空。containsKey(key):判断map中是否存在这个key
size():返回map中键值对的数量。remove(key):删除指定key的键值对。clear():清空map中所有键值对。 keySet():返回map中所有key组成的Set集合。values():返回map中所有value组成的Collection集合
LinkedHashMap

LinkedHashMap是HashMap的子类,它保存了插入的顺序,HashMap是随机遍历,LinkedHashMap可以做到顺序遍历。使用方法.entrySet()

LinkedHashMap<Integer,String> map = new LinkedHashMap<>();
map.put(1,"111");
map.put(2,"222");
map.put(3,"333");
map.put(4,"444");
map.put(5,"555");
map.put(3,"3--");
System.out.println(map.entrySet());
//[1=111, 2=222, 3=3--, 4=444, 5=555]

可以看出key值是固定且唯一的,后续的put不会改变已有key的位置。

TreeMap

TreeMap是通过红黑树实现的,TreeMap继承于AbstractMap,TreeMap实现了NavigableMap接口,意味着它支持一系列的导航方法。

与HashMap相比,TreeMap是一个可以比较元素大小的Map, put元素时是自动排序的,你可以在创建对象的时候自定义比较器来更改排序规则。

TreeMap遍历可以使用迭代器或者foreach循环

TreeMap<String,String> treeMap = new TreeMap<>();
treeMap.put("1","111");
treeMap.put("44","222");
treeMap.put("3","444");
treeMap.put("4","333");
treeMap.put("5","555");
System.out.println(treeMap.entrySet());
for (Map.Entry<String, String> entry :
        treeMap.entrySet()) {
    System.out.println(entry.getKey()+"----"+entry.getValue());
}
/*
1----111
3----444
4----333
44----222
5----555
*/
Hashtable

Hashtable和HashMap有一些区别。Hashtable属于一代集合,继承了Dictionary类,也实现了Map接口,而HashMap属于二代集合,实现了Map接口,但没有与Dictionary类产生关系。

此外,Hashtable支持iterator遍历(Map接口中的),也支持Enumeration遍历(Dictionary),而HahsMap只支持iterator遍历

这两个的主要区别在于线性安全性和同步以及速度,HashMap几乎和Hashtable相同,HashMap是非线程安全的,Hashtable是线程安全的并且不可以有null。

Hashtable是无序的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值