JavaSE 集合类(Collection接口,List接口,Map接口)

孤街醉人 提交于 2019-12-01 21:11:46

在这里插入图片描述
集合类就好比一个容器,比如说数组就是一个可以存放数据的容器,但是数组的长度是不可变的,集合类的长度却是可变的。常用的集合有Map集合,Set集合,List集合。
List与set继承collection接口

Collection接口

Collection接口通常不能直接使用,但该接口提供了添加元素,删除元素,管理数据的方法。List接口和Set接口都继承了Collection接口,所以他们能实现Collection的方法。I
构成Collection的单位称为元素。
Collection常用方法如下

方法 功能
add(E e) 将指定的对象加到该集合中
remove(Object o) 将指定对象从该集合中移除
isEmpty() 返回boolean值,用于判断当前集合是否为空
iterator() 返回在此Collection的元素上的迭代器。用于遍历集合
size() 返回Int值,获取该集合中元素的个数
利用iterator 遍历集合

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection<String> list=new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        Iterator<String> it=list.iterator();
        while (it.hasNext()){     //判断是否有下一个元素
              String str=(String)it.next();    //获取元素    Iterator 的next()方法返回的是Object
            System.out.println(str);
        }
    }
}

List集合

List集合包括List接口以及List接口的所有实现类
List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。可以通过使用索引来访问集合中的元素。

(1)List接口

List接口包含Collection接口的所有方法,此外还有两个重要方法
get(int index):获取指定索引位置的元素
set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象

(2)List接口的实现类

List接口的常用实现类有ArrayList与LInkedList
ArrayList类:实现了可变数组,允许保存所有的元素,包括null,并可以根据索引位置对集合进行快速的随机访问,缺点是向指定的索引位置插入对象或删除对象比较慢
LinkedList类:采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,但对于随机访问集合中的对象效率比较低
两个类的差异有点像C语言的链表顺序结构和链式结构的差异
使用List集合时通常声明为List类型,然后通过不同的类实例化集合

List<E> list=new ArrayList<>();
List<E> list=new LInkedList<>();

Set集合

Set集合中的对象不按特定的方式排序,Set集合中不能有重复对象。
Set集合由Set接口和Set接口的实现类组成。
Set接口继承了Collection接口,因此包含Collection接口的所有方法
Set接口常用的实现类有HashSet类与TreeSet类
HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。他不保证Set的迭代顺序,特别是它不保证该顺序一直不变。此类允许使用null元素
TreeSet类不仅实现了Set接口,还实现了java.until.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增顺序,也可以按照比较器递增排序,就是可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序
TreeSet增加方法

方法 功能描述
first() 返回此Set中当前第一个(最低)元素
last() 返回此Set中当前最后一个(最高)元素
comparator() 返回此Set中的元素进行排序的比较器。如果此Set使用自然排序,则返回null
headSet(E e) 返回一个新的Set集合,新集合是e(不包含)之前的所有对象
subSet(E f,E e) 返回一个新的集合,是从f(包含)到e(不包含)之间的所有对象
tailSet(E e) 返回一个新的集合,是从e(包含)之后的所有对象
package com.pkg;


import sun.reflect.generics.tree.Tree;

import java.util.Iterator;
import java.util.TreeSet;

public class Test implements Comparable<Object>{
    String name;
    long id;
    public Test(String name,long id){
        this.name=name;
        this.id=id;
    }
    @Override
    public int compareTo(Object o) {  //比较此对象与指定对象的顺序,如果该对象大于,等于或小于指定对象,分别返回正整数,0,或负整数
        Test t=(Test)o;
        return id>t.id?1:(id==t.id?0:-1);
    }
    public String getName(){
        return name;
    }
    public void SetName(String name){
        this.name=name;
    }
    public long getId(){
        return id;
    }
    public void setId(long id){
        this.id=id;
    }
    public static void main(String[] args) {
        Test t1=new Test("小明",01011);
        Test t2=new Test("小华",01021);
        Test t3=new Test("李明",01051);
        Test t4=new Test("张三",01012);
        TreeSet<Test> tree=new TreeSet<>();
        tree.add(t1);
        tree.add(t2);
        tree.add(t3);
        tree.add(t4);
        Iterator<Test> it=tree.iterator();
        System.out.println("集合中所有元素:");
        while (it.hasNext()){
             Test t=(Test) it.next();
            System.out.println(t.getId()+" "+t.getName());
        }
        it=tree.headSet(t2).iterator();
        System.out.println("截取前面的元素");
        while (it.hasNext()){
            Test t=(Test) it.next();
            System.out.println(t.getId()+" "+t.getName());
          //  System.out.println(((Test)it.next()).getId()+" "+((Test)it.next()).getName());  别这么写
        }
        it=tree.subSet(t2,t3).iterator();
        System.out.println("截取中间的元素");
        while (it.hasNext()){
            Test t=(Test) it.next();
            System.out.println(t.getId()+" "+t.getName());
        }
    }
}
输出结果:(按照id大小排序)
521 小明
522 张三
529 小华
553 李明
截取前面的元素
521 小明
522 张三
截取中间的元素
529 小华

Map集合

Map集合没有继承Collection接口,其提供key到value的映射。Map中不能包含相同的key,每个key只能映射一个value.key还决定了存储对象在影射中的存储位置,但不是由key对象本身决定的,是通过散列进行处理,产生一个散列码的整数值。散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而决定存储对象在映射中的存储位置。
Map集合包括Map接口以及Map接口的所有实现类

(1)Map接口

方法 功能
put(K key,V value 向集合中添加指定key与value的映射关系
containsKey(Object key) 如果集合中包含指定key大的映射关系,则返回true
containsValue(Object value) 如果此映射将将一个或多个key映射到指定值,则返回true
get(Object key) 返回key对应的对应值,否则返回null
keySet() 返回该集合中所有key对象形成的Set集合
values() 返回该集合中所有值对象形成的Collection集合
import java.util.*;

public class Test {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("01","小明");
        map.put("02","小李");
        map.put("03","小华");
        Set<String> set=map.keySet();
        Iterator<String> it=set.iterator();
        System.out.println("key集合所有元素");
        while (it.hasNext()){
            String s=(String)it.next();
            System.out.println(s);
        }
        Collection<String> collection=map.values();
        it=collection.iterator();
        System.out.println("values集合所有元素");
        while (it.hasNext()){
            String s=(String)it.next();
            System.out.println(s);
        }
    }
}
输出结果:
key集合所有元素
01
02
03
values集合所有元素
小明
小李
小华

Map接口所实现的类

Map接口实现的类有HashMap和TreeMap.建议使用HashMap类实现Map接口
HashMap类实现的Map集合添加和删除的效率更高.HashMap是基于哈希表的Map接口实现,HashMap通过哈希码对其内部的映射关系进行快速查找,而TreeMap中的映射关系存在一定的顺序,
HashMap类允许使用null值和null键,但必须保证键的唯一性。
TreeMap类不允许键对象是null
有一个putAll()方法可以将HashMap类直接添加进TreeMap

Map<K key,V value> map=new HashMap<>();
TreeMap<K key,V value> treeMap=new TreeMap<>();
treemap.putAll(map); 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!