【集合框架】List、Set和Map

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【集合框架】List、Set和Map,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、基本要点

1、集合与数组类似,但是集合中元素的个数是可以动态变化的
注意:集合只能存放自定义数据类型,不能存放基本数据类型

2、集合分为三大类

  • List:存放数据可重复,且有顺序
  • Set:存放数据不可重复且无序(TreeSet在特定情况下是有序的)
  • Map:双列型,存放的数据key不可以重复,value可以重复

一、List接口

它有2个实现类 ArrayList和LinkedList

list.clear()—-删除所有元素的方法

1、ArrayList

ArrayList是基于数组实现的,底层是一个动态的Object数组,其容量能自动增长
因为它是数组结构,具有下标,所以增删很慢,查询很快

1)单个查询:list.get(下标);

2)循环遍历:

  • for循环:for(int i = 0; i<list.size(); i++)
  • foreach循环:for(Object temp: list)
  • lambda表达式:list.foreach(r -> {})
    注意:lambda表达式不能直接遍历数组,需要转成集合才能使用lambda表达式遍历

3)泛型:用于给集合指定具体存放的数据类型,只能存放自定义数据类型,不能存放基本数据类型
例如List aList = new ArrayList();

4)添加数据:list.add()

5)删除操作
list.remove() 可以通过下标删,也可以通过内容删(这里如果内容也是Integer类型,那么可能跟下标混淆,所以这个时候泛型的作用就显示出来了,通过这个方法删除的时候,集合就要使用泛型了)
list.clear()清除所有元素

6)更新操作:list.set(index, object) 更新指定下标的元素

package com.decade.list;

import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo01 {

    public static void main(String[] args) {
        //创建一个ArrayList集合,默认长度是10
        ArrayList arrayList = new ArrayList();

        //增
        arrayList.add("one");
        arrayList.add(true);
        arrayList.add(3.14F);

        //foreach循环
        for (Object temp: arrayList) {
            System.out.println(temp);
        }

        System.out.println("===============");

        //删
        arrayList.remove(1);

        //foreach循环
        for (Object temp: arrayList) {
            System.out.println(temp);
        }

        System.out.println("===============");

        //改
        arrayList.set(0, "test");

        //foreach循环
        for (Object temp: arrayList) {
            System.out.println(temp);
        }

        System.out.println("===============");

        //泛型
        List<String> bList = new ArrayList<String>();
        bList.add("a");

        bList.forEach(System.out::println);
    }
}

2、LinkedList

1)LinkedList底层是链表,增删特别快,但是查询比较慢
LinkedList和ArrayList的方法是相同的

2)集合转成数组
Object[] array = list.toArray();

package com.decade.list;

import java.util.LinkedList;
import java.util.List;

public class LinkedListDemo02 {

    public static void main(String[] args) {
        //声明一个LinkedList
        List<String> aList = new LinkedList<String>();

        aList.add("aaa");
        aList.add("bbb");

        //将集合转成数组
        Object[] array = aList.toArray();
    }
}

二、Set接口

它有2个实现类 HashSet和TreeSet
set.clear()—-删除所有元素的方法

1、HashSet

1)HashSet集合存放的数据是无序(不保证有序,不是保证无序)且不可重复的,如果存放重复数据,那么集合会自动帮你去重

默认初始容量是16,加载因子是0.75,意思是16*0.75=12
当集合中元素个数超过12个时,集合扩容一倍到32

HashSet底层是哈希表,没有下标,故删除时不能通过下标去删除
也正因如此,set集合中没有修改方法,只能先删除再添加
也没有get(index)这种获取单个元素的方法

package com.decade.list;

import java.util.HashSet;
import java.util.Set;

public class HashSetDemo03 {

    public static void main(String[] args) {
        Set<String> aSet = new HashSet<>();
        //增
        aSet.add("dasdas");
        aSet.add("zasda");
        aSet.add("aasda");
        aSet.add("casdasd");

        aSet.forEach(System.out::println);
        System.out.println("==========");

        //删
        aSet.remove("aasda");

        aSet.forEach(System.out::println);
        System.out.println("==========");

        //改,先删再增
        aSet.remove("casdasd");
        aSet.add("bcasdasd");

        aSet.forEach(System.out::println);
        System.out.println("==========");

        boolean flag = aSet.contains("bcasdasd");

        System.out.println("flag = " + flag);
    }
}

2、TreeSet

TreeSet底层是二叉树
存放的数据不可重复,但是有序(对于实现了Comparable、Comparator接口的类型来说)

方法与HashSet中的相同

package com.decade.list;

import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo04 {

    public static void main(String[] args) {
        Set<String> bSet = new TreeSet<>();

        bSet.add("zasda");
        bSet.add("casd");
        bSet.add("aadsas");

        bSet.forEach(System.out::println);
    }
}

三、Map接口

双列型,存放的数据数据是无序的,key不可以重复,value可以重复

1、HashMap

1)底层是哈希表,key不可以重复,value可以重复,无序

2)常用方法

  • 插入操作和修改操作
    map.put(key,value);(put方法的返回值是此key之前的旧值,如果没有,那么返回null)
  • 查询 map.get(key);
  • 遍历操作 map.foreach((k,v) -> {}) 注意,使用lambda表达式进行遍历时,也要使用k,v的双列结构
    HashMap可以直接打印,因为它的源码中覆盖了toString()
  • 删除所有方法,hashMap.clear()
  • 删除方法,hashMap.remove(key),根据key去删除
package com.decade.list;

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo05 {

    public static void main(String[] args) {

        Map<String, String> hashMap = new HashMap<>();

        //插入
        hashMap.put("asa", "ok");
        hashMap.put("add", "test");
        hashMap.put("bsd", "java");
        hashMap.put("dc", "check");

        //HashMap可以直接打印,因为它的源码中覆盖了toString()
        System.out.println(hashMap);

        //遍历操作  map.foreach((k,v) -> {}) 注意,使用lambda表达式进行遍历时,也要使用k,v的双列结构
        hashMap.forEach((k,v) -> {
            System.out.println(k + "=" + v);
        } );

        //修改
        hashMap.put("dc", "newValue");
        System.out.println(hashMap);

        //删除
        hashMap.remove("dc");
        System.out.println(hashMap);

        //查询
        String value = hashMap.get("bsd");
        System.out.println(value);
    }
}

2、TreeMap

底层是二叉树,key不能重复,value可以重复,可以根据key进行排序(key的类型需要实现Comparable或者Comparator接口)

TreeMap与HashMap中的方法一样

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136761.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!