JAVA--List、Map、Set等容器的使用

容器的接口层次结构图
在这里插入图片描述

Collection接口

Collection表示一组对象,他是集中、收集的意思。Collection接口的两个子接口是List、Set接口。

Collection接口中定义的方法

在这里插入图片描述

List接口

1.特点

      List是有序、可重复的容器。

有序:List中的每个元素都有引索。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。
可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。

2.List接口中定义的方法(常用)

除了Collection接口中的方法,List多了一些跟顺序(索引)有关的方法
在这里插入图片描述

3.ArrayList、LinkedList和Vector

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

ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。

如何选用ArrayList、LinkedList和Vector?
  1. 需要线程安全时,用Vector。

  2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。

  3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。

Map接口

1.特点

Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。

2.常用方法

在这里插入图片描述

3.HashMap、TreeMap、HashTable、Properties

Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。

HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。

HashMap与HashTable的区别

  1. HashMap: 线程不安全,效率高。允许key或value为null。
  2. HashTable: 线程安全,效率低。不允许key或value为null。
TreeMap是红黑二叉树的典型实现。TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap。

Set接口

1.特点

     Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。

      Set容器特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。

2.HashSet、TreeSet

Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。

HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。
TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素。 TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。

遍历方法

LIst

List<String>list

1.普通for循环

for(int i=0;i<list.size();i++){//list为集合的对象名
    String temp = (String)list.get(i);
    System.out.println(temp);
}

2.增强for循环(使用泛型!)

for (String temp : list) {
   System.out.println(temp);
}

3.使用Iterator迭代器(1)

for(Iterator iter= list.iterator();iter.hasNext();){
    String temp = (String)iter.next();
    System.out.println(temp);
}

4.使用Iterator迭代器(2)

Iterator  iter =list.iterator();
while(iter.hasNext()){
    Object  obj =  iter.next();
    iter.remove();//如果要遍历时,删除集合中的元素,建议使用这种方式!
    System.out.println(obj);
}

Set

Set<String>set

1.增强for循环

for(String temp:set){
   System.out.println(temp);
}

2.使用Iterator迭代器

for(Iterator iter = set.iterator();iter.hasNext();){
    String temp = (String)iter.next();
    System.out.println(temp);
}

Map

Map<Integer,String>maps;

1.根据key获取value

Set<Integer>  keySet =  maps.keySet();
for(Integer id : keySet){
System.out.println(maps.get(id).name);
}

2.使用entrySet

Set<Entry<Integer, String>>  ss = maps.entrySet();
for (Iterator iterator = ss.iterator(); iterator.hasNext();) {
    Entry e = (Entry) iterator.next(); 
    System.out.println(e.getKey()+"--"+e.getValue());
}







本文章参考自尚学堂Java300集课程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值