集合框架

集合框架

1.List接口

2.Set接口

3.Map接口

一、集合的体系

1.Collection接口

也是一种集合,特征:无序,可重复

无序:没有游标

可重复:这个集合当中可以有相同的数据

注意:没有直接的实现类

 Collection<String> list = Arrays.asList(new String[]{
                "a1","b2",
                "b22",
                "c3"
        });

迭代器获取和使用

作用:寻访集合内所有的元素

//获取Iterator接口
        Iterator<String> iter = list.iterator();
        while (iter.hasNext()){
            String item = iter.next();
            System.out.println(item);
        }
package com.mine.demo01;

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        Collection<String> list = Arrays.asList(new String[]{
                "a1","b2",
                "b22",
                "c3"
        });

        //获取Iterator接口
        Iterator<String> iter = list.iterator();
        while (iter.hasNext()){
            String item = iter.next();
            System.out.println(item);
        }
    }
}


结果:
a1
b2
b22
c3

二、List集合

特点:有序,有重复

1.实现类

(1)ArrayList

是一个基于数组的集合,其扩容策略为0,默认为0,添加第一个元素后直接扩展到10,此后每次扩容50%

常用的API:

package com.mine.demo01;

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

public class Main1 {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        List<Integer> list2 = new ArrayList<>();
        list2.add(4);
        list2.add(5);
        list2.add(6);
        System.out.println(Arrays.toString(list1.toArray()));//输出list1  //[1, 2, 3]
        System.out.println(Arrays.toString(list2.toArray()));//输出list2  //[4, 5, 6]

        list1.addAll(list2);//将list2集合加到list1集合末尾
        System.out.println(Arrays.toString(list1.toArray()));//[1, 2, 3, 4, 5, 6]

        list1.add(0,-10);//指定位置插入
        System.out.println(Arrays.toString(list1.toArray()));//[-10, 1, 2, 3, 4, 5, 6]
        System.out.println("集合长度:"+list1.size()); //集合长度:7
        //一种快速创建集合的方法
        List list3 = Arrays.asList(new Integer[]{
                100,
                200,
                300
        });

        System.out.println(Arrays.toString(list3.toArray())); //[100, 200, 300]
        list1.addAll(0,list3);//将list3集合插入到list1集合的指定位置
        System.out.println(Arrays.toString(list1.toArray()));//[100, 200, 300, -10, 1, 2, 3, 4, 5, 6]
        //清空集合
//        list1.clear();
//        System.out.println(Arrays.toString(list1.toArray()));//[]

        list1.remove(1);//删除指定位置的元素
        System.out.println(Arrays.toString(list1.toArray()));//[100, 300, -10, 1, 2, 3, 4, 5, 6]

        //判断是否存在某个元素
        System.out.println(list1.contains(300));//true

        //判断是否为空
        System.out.println(list1.isEmpty());//false
        //判断元素位置
        System.out.println(list1.indexOf(300));//1
    }
}

结果:
[1, 2, 3]
[4, 5, 6]
[1, 2, 3, 4, 5, 6]
[-10, 1, 2, 3, 4, 5, 6]
集合长度:7
[100, 200, 300]
[100, 200, 300, -10, 1, 2, 3, 4, 5, 6]
[100, 300, -10, 1, 2, 3, 4, 5, 6]
true
false
1

当集合元素为整数时,删除指定元素可能会出现异常。

迭代器的使用和集合接口(见上方Collection案例)

(2)LinkedList

双向链表:每次扩容增加一个对象,适合进行元素的增减,而不适合进行随机访问

常用API

package com.mine.demo01;

import java.util.Arrays;
import java.util.LinkedList;

public class Main2 {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.addFirst("a");
        linkedList.addLast("z");
        System.out.println(linkedList.getFirst());//a
        System.out.println(linkedList.getLast());//z
        linkedList.removeFirst();//删除首个
        System.out.println(Arrays.toString(linkedList.toArray()));//[z]
        linkedList.removeLast();
        System.out.println(Arrays.toString(linkedList.toArray()));//[]
//        linkedList.removeFirst();
//        linkedList.removeLast();//空集合继续删除会报错

        System.out.println(linkedList.peekLast());//验证不移除
        System.out.println(Arrays.toString(linkedList.toArray()));
        System.out.println(linkedList.pollLast());//验证并移除
        System.out.println(Arrays.toString(linkedList.toArray()));
    }
}


结果:
a
z
[z]
[]
null
[]
null
[]

三、Set集合

特性:

1.无序、不可重复的集合

2.其核心实现类为HashSet

3.HashSet的本质是HashMap的key

1.创建集合

 //创建集合
        Set<String> s = new HashSet<String>();

2.元素的添加(重点)

 //创建集合
        Set<String> s = new HashSet<String>();
        s.add("a");
        s.add("a");
        s.add("a");//只保留了最后一个(通过hash值的比较)
        s.add("b");
        s.add("c");
        System.out.println(Arrays.toString(s.toArray()));

结果:
[a, b, c]

针对对象,可以重写hash来完成一致性判断,而不是重写equals(了解)

package com.mine.demo02;

import java.util.Objects;

public class Person {
    private Integer id;

    public void setId(Integer id){
        this.id = id;
    }

    public Integer getId(){
        return id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return Objects.equals(id, person.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);//自己去设计发生hash碰撞的规则
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                '}';
    }
}

package com.mine.demo02;

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

public class Main1 {
    public static void main(String[] args) {
        //创建集合
        Set<Person> s = new HashSet<>();
        Person p1 = new Person();
        p1.setId(1);
        Person p2 = new Person();
        p2.setId(1);
        s.add(p1);
        s.add(p2);
        System.out.println(Arrays.toString(s.toArray()));
    }
}

结果:
[Person{id=1}]

3.元素的遍历

package com.mine.demo02;

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



public class Main2 {
    public static void main(String[] args) {
        //遍历Set
        Set<String> s = new HashSet<>();
        s.add("a");
        s.add("b");
        s.add("c");
        //通过迭代器
        Iterator<String> iter= s.iterator();
        while (iter.hasNext()){
            String str = iter.next();
            System.out.println(str);
        }

        //通过增强for循环
        for(String str : s){
            System.out.println(str);
        }
    }
}

结果:
a
b
c
a
b
c

四、Map集合

一种可以自行定义检索规则的数据结构,也叫字典

构成:key-Value

注意:

1.null值可以作为key

2.key具有唯一性

3.HashMap的key其本质是数组+链表构成的红黑树

package com.mine.demo02;

import java.util.*;

public class Main3 {
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        //存值
        map.put("k1",10);
        map.put("k2",20);
        map.put("k3",30);
        map.put("k3",40);//覆盖前一个值
        //取值
        System.out.println(map.get("k1"));
        System.out.println(map.get("k2"));
        System.out.println(map.get("k3"));

        //判断某个key是否存在
        System.out.println(map.containsKey("k1"));//true
        //判断某个Value是否存在
        System.out.println(map.containsValue(20)); //true

        //有一个特殊的key
        map.put(null,500);
        map.put(null,600);
        map.put(null,700);//覆盖前面的值
        System.out.println(map.get(null)); //700
        //分别获取key和Value的集合
        Set<String> keys = map.keySet();//不可重复
        Collection<?> values = map.values();//可以重复
        System.out.println(Arrays.toString(keys.toArray())); //[null, k1, k2, k3]
        System.out.println(Arrays.toString(values.toArray())); //[700, 10, 20, 40]
    }
}


结果:
10
20
40
true
true
700
[null, k1, k2, k3]
[700, 10, 20, 40]
posted @ 2023-03-21 17:00  DFshmily  阅读(31)  评论(0编辑  收藏  举报