【集合类List、Map、Set的简单用法】

目录

Java.util包的集合框架

List接口

 Set接口

Map接口

HashMap 、 TreeMap 、 LinedHashMap区别



Java.util包的集合框架

集合类用来存储元素,集合类中若用到基本数据类型,必须使用包装类。

List接口

List接口是一个线性表接口, 常用的两个子类为:

ArrayList(动态数组) :要保存的元素个数不确定,动态变化时使用

LinkedList(链表)

List的常用方法:

boolean add(E e)尾插 e
void add(int index, E e)将 e 插入到 index 位置
E remove(int index)删除 index 位置元素
E set(int index, E e)将下标 index 位置元素设置为 e
boolean contains(Object o)判断 o 是否在线性表中
E get(int index)获取下标 index 位置元素

代码示例:

public static void main(String[] args) {
        //将一个数组变成List集合
        int[] data = {1,3,5,7,9,11,11,13};
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < data.length; i++) {
            //增加
            list.add(data[i]);
        }
        //删除
        list.remove(1);
        //将下标 0位置元素改为 666
        list.set(0,666);
        System.out.println(list);
        //查找
        System.out.println(list.contains(2));
        System.out.println(list.get(2));


    }
//输出结果:
   [666, 5, 7, 9, 11, 11, 13]
   false
   7

若要遍历List集合,只需要使用 for-each 循环即可。若要打印集合内容,直接调用println方法传入对象即可,因为集合类都覆写了toString方法。

代码示例:

        System.out.println(list);
        //list的遍历
        for (int num : list){
            System.out.print(num + " ");
        }
//输出结果:
[666, 5, 7, 9, 11, 11, 13]
666 5 7 9 11 11 13 

 Set接口

Set接口一次存储一个不重复元素,它是List的子接口,除了元素的插入有了不重复的限制,其他用法和List差不多。Set集合是没有修改元素的方法的,只能把这个元素删除再添加一个新元素。

常见方法:

boolean add(E e)添加元素,但重复元素不会被添加成功
boolean contains(Object o)判断 o 是否在集合中

代码示例:

 public static void main(String[] args) {
        int[] data = {1,1,2,3,3,4,4,5,5,6,6,7};
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < data.length; i++) {
            set.add(data[i]);
        }
        System.out.println(set);
        System.out.println(set.contains(7));
    }
//输出结果:[1, 2, 3, 4, 5, 6, 7]
           true

可以看到,集合中没有重复元素,但是我们在使用HashSet类时,元素的顺序与实际存储顺序无关,因为hash的值不一定是有序的,我们来看一个示例:

 public static void main(String[] args) {
        String[] str = {"起床","吃饭","睡觉"};
        Set<String> set = new HashSet<>();
 
        for (String s: str){
            set.add(s);
         
        }
        System.out.println(set);
    }
//输出结果:[吃饭, 起床, 睡觉]

如果想让插入顺序和存储顺序相同,我们就使用  LinkedHashSet类:

 public static void main(String[] args) {
        String[] str = {"起床","吃饭","睡觉"};
     
        Set<String> set1 = new LinkedHashSet<>();
        for (String s: str){
         
            set1.add(s);
        }
      
        System.out.println(set1);
    
    }
//输出结果:[起床, 吃饭, 睡觉]

Map接口

 Map接口是一个映射关系,一次存储两个元素,存储的是 <key,value> 结构的键值对,并且key一定是唯一的,不能重复。在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空。

HashMap的插入顺序也是不一定和存储顺序不同的,要想一直就使用LinkedMap.。

常用方法:

V put(K key, V value)设置 key 对应的 value
V get(Object key)返回 key 对应的 value,若key不存在,返回null
V getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
V remove(Object key)删除 key 对应的映射关系,返回删除的
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

🔔使用put方法,将key和对应的value存储到Map中,若key已经存在,则更新value值为新插入的值。代码示例:

 public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        //key值为学号,value为姓名
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(8,"王五");
        System.out.println(map);
        //当key重复时,更新值
        map.put(1,"李铁蛋");
        System.out.println(map);
        System.out.println(map.get(2));
        System.out.println(map.getOrDefault(19,"0"));
        System.out.println(map.remove(8));
        System.out.println(map);
    }
// 输出:{1=张三, 2=李四, 8=王五}
        {1=李铁蛋, 2=李四, 8=王五}
        李四
         0
        王五
        {1=李铁蛋, 2=李四}

Map集合的遍历和List 、Set不同: 

  1. 获取集合中所有的 key 集合 :keySet( )
    for (Character key : map.keySet()) {
    
       ...
      }
  2. 获取集合中所有的 value 集合: values( )
  3. 获取集合中所有的键值对 : Map.Entry接口,将Map-->Set

代码示例:

        Map<Integer,String> map = new HashMap<>();
        //key值为学号,value为姓名
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(8,"王五");
        System.out.println(map.keySet());
        System.out.println(map.values());
        Set<Map.Entry<Integer,String>> entry = map.entrySet();
        for(Map.Entry<Integer,String> temp : entry){
            System.out.print(temp.getKey() + "=" + temp.getValue()+ " ");
        }
//输出结果:
[1, 2, 8]
[张三, 李四, 王五]
1=张三 2=李四 8=王五

 这里之所以遍历key和value使用不同方法,就是因为key值是唯一的,keySet方法返回的是Set集合;value是可以重复的,values方法返回的是Collection接口(是List的父接口),可以看作就是返回了List。

而Map.Entry:此接口存储的就是一个个键值对对象,它认为<key,value>是一个对象,将key和value捆绑到一起

HashMap 、 TreeMap 、 LinedHashMap区别

HashMap是基于哈希表 + 红黑树的结构(JDK8之后),HashMap的元素保存顺序与插入顺序无关。

TreeMap是基于红黑树的结构,元素保存顺序与插入顺序无关。key不能为null,value可以为空。使用TreeMap保存元素时,元素必须是 Comparable 子类或者传入比较器。

LinedHashMa 就是在 HashMap 的基础上维护了一个链表来记录元素的插入先后,可以按照元素的插入顺序来保存元素。

写在最后

  • Set和Map天然就是一个查找或者搜索语句。
  • 做题时如果要对第一次出现的元素做特殊处理,就可以利用Set集合的add方法的返回值来巧妙处理。
  • 我们做题最常遇到的就是Map接口,它的核心操作就是查找

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值