首页 > 编程语言 > 详细

Java集合List、Set以及Map详解

时间:2020-11-19 20:10:45      阅读:48      评论:0      收藏:0      [点我收藏+]

一、集合

1.1、概念:是对象的容器,实现了对于对象常用的操作,可实现数组的功能

1.2、集合与数组的区别

  • 数组长度固定,集合长度不固定
  • 数组可以存储基本类型和引用类型,而集合只能存储引用类型

1.3、概述

  • List、Set、Map都是接口,其中List和Set继承Collection接口,Map为独立接口
  • List的实现类有ArrayList(重要)、LinkedList(重要)、Vector
  • Set的实现类有HashSet、TreeSet(实现了Set的子接口SortedSet)
  • Map的实现类有HashMap、TreeMap(实现了Map的子接口SortedMap)
  • Collection接口下还有Queue接口,其实现类包含LinkedList、PoriorityQueue

技术分享图片         技术分享图片

 

注:LinkedList既实现了List接口,也实现了Queue接口。不过Queue接口窄化了LinkedList的方法,即只能使用Queue接口中定义的方法,不可以使用其他方法

 

 

二、Collection集合

 

1、List接口

  1.1、特点:有序、有下标、元素可以重复

  1.2、常用操作方法:add(E e)、remove(int index)、get(int index)、iterator()

  1.3、实现类特点:

  数据结构 查询速度 增删速度 运行效率 线程安全
ArrayList 数组 快   
Vector 数组 快   
LinkedList 双向链表

  1.4、ArrayList与LinkedList区别

    ArrayList是数组结构,需要开辟连续空间,查询比较快,增删比较慢;

    LinkedList是双向链表结构,所以无需开辟连续空间,查询比较慢,增删比较快

 

2、Set集合

  2.1、特点:无序、无下标、元素不可以重复,

  2.2、常用操作方法:add(E e)、remove(Object o)、iterator()

  2.3、实现类特点: 

  数据结构 是否排序 元素可否为null 元素可否重复 线程安全 插入速度
HashSet 哈希表
TreeSet 红黑树

  3.4、HashSet存储方式:

     HashSet的存储结构是哈希表,当存入元素时,首先基于HashCode计算元素存放位置,如果此位置为空,则直接保存,如果不为空则会调用equals进行确认,如果结构为true,则认为重复,否则,形成链表。

   3.5、TreeSet的排序方法:

    1、对于系统定义的引用类型(如Integer、Double、String等)

    

public class Demo0 {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Integer> treeset = new TreeSet<>();

        //添加元素
        treeset.add(4);
        treeset.add(5);
        treeset.add(51);
        treeset.add(15);
        treeset.add(26);

        for(Integer i:treeset)
            System.out.println(i);
        
    }
}

技术分享图片

 

 

  可以看见,遍历的结果是有序的。

  

  2、**对于储存的元素为自己定义的类

public class Demo04 {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Person> treeset = new TreeSet<>();

        //生成对象
        Person p1 = new Person("Bce",10);
        Person p2 = new Person("Ace",12);
        Person p3 = new Person("Fce",8);
        Person p4 = new Person("Cce",6);

        //添加元素
        treeset.add(p1);
        treeset.add(p2);
        treeset.add(p3);
        treeset.add(p4);

        System.out.println(treeset.toString());

    }
}

技术分享图片

 

 

   我们发现此时系统会抛出异常,大致意思是我们的Person类不可以进行比较,因为排序需要元素之间能比较大小才能进行,我们有两种解决方法

  (1)元素对象实现Comparable接口,重写其compareTo方法

public class Person implements Comparable<Person> {
    public String name;
    public int age;
    public Person(){};

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }


    //这里重写Comparable
    public int compareTo(Person p){
        //这里我们简单的进行名字的比较
        int n1 = this.name.compareTo(p.name);
        return n1;
    }

    @Override
    public String toString(){
        return this.name+":"+(Integer)this.age;
    }


}

技术分享图片

 

 

   可以看到运行结果按照我们定义的比较方法进行排序

  

  (2)为TreeSet指定比较器进行排序

public class Demo04 {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Person> treeset = new TreeSet<>(new Comparator<Person>(){

            @Override
            public int compare(Person o1, Person o2) {
                int n = o1.name.compareTo(o2.name);
                return n;
            }
        });

        //生成对象
        Person p1 = new Person("Bce",10);
        Person p2 = new Person("Ace",12);
        Person p3 = new Person("Fce",8);
        Person p4 = new Person("Cce",6);

        //添加元素
        treeset.add(p1);
        treeset.add(p2);
        treeset.add(p3);
        treeset.add(p4);

        System.out.println("运行结果:");
        for(Person p:treeset)
            System.out.println(p.toString());

    }
}

技术分享图片

 

三、Map集合

1、特点:

  • 用于存储任意键值对(key-value)
  • 键:无序、无小标、不允许重复(唯一)
  • 值:无序、无下标、允许重复

2、常用方法:put(K key, V value)、get(Object key)、keySet()、remove(K key)、entrySet()等

3、实现类的特点:

 

  数据结构 是否排序 运行效率 Key可否为null 线程安全
HashMap 哈希表+红黑树
TreeMap 红黑树 是(对key排序)
HashTable 哈希表 否  

4、关于Map的遍历

 

package com.collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Demo06 {
    public static void main(String[] args) {
        //创建集合
        HashMap<Person,String> person = new HashMap<>();

        //1.添加元素
        Person p1 = new Person("xxx",1);
        Person p2 = new Person("yyy",2);
        Person p3 = new Person("zzz",3);
        person.put(p1,"北京");
        person.put(p2,"上海");
        person.put(p3,"杭州");
        //System.out.println(person);


        //2.遍历
        //2.1keySet方法
        Set<Person> pkey = person.keySet();
        for(Person p:pkey)
            System.out.println(person.get(p));

        System.out.println("分割线--------------------");

        //2.2entrySet方法
        Set<Map.Entry<Person,String>> entry = person.entrySet();
        for(Map.Entry<Person,String> mmp:entry){
            System.out.println(mmp.getKey()+"+"+mmp.getValue());
        }


    }
}

技术分享图片

 

Java集合List、Set以及Map详解

原文:https://www.cnblogs.com/mikellee/p/14006963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!