Java - 集合

1. 集合

在这里插入图片描述

2. 集合体系结构

在这里插入图片描述

3. 单列集合

在这里插入图片描述

3.1 ArrayList集合

在这里插入图片描述

3.1.1 ArrayList特点

1.有序: 保证存入和取出元素的顺序是一致的
2.有索引: 可以通过索引的方式获取元素
3.可重复: 可以存储相同的内容

1.底层数据结构:数组
2.查询快: 元素有索引,元素内存空间连续
3.增删慢:
    数组长度不可改变
    需要频繁创建新数组,拷贝元素,销毁老数组
4.线程不同步,不安全,效率高

-------------JDK 1.0 Vector集合--------------ArrayList 唯一不同是:synchronized 修饰,线程同步,安全,效率低

3.1.2 构造方法

在这里插入图片描述

3.1.3 方法

  • 删除方法
E	remove(int index)
Removes the element at the specified position in this list.
* 删除指定索引的元素
* 底层用 ``System.arraycopy(elementData, index+1, elementData, index, numMoved);`` 将索引后面的元素整体向前移动一位,最后空出来的设为null,元素个数减一。
  • toArray()
Object[]	toArray()
Returns an array containing all of the elements in this list in proper sequence (from first to last element).
* 将集合返回数组
* 底层用System.arraycopy() ,都是数组拷贝。

3.1.4 ArrayList底层原理

  • 底层基于Object[] 数组实现,增删需要做元素的移位操作。

3.1.5 遍历ArrayList删除特定元素,出现删不干净的现象

package com.arraylist_test;
import java.util.ArrayList;
public class Test01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("d");
        list.add("e");
        System.out.println(list);//[a, b, b, d, e]

        //遍历删除所有元素 "b"
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals("b")) {
                list.remove(i);
            }
        }
        System.out.println(list);//[a, b, d, e] 发现漏删除
    }
}
  • 原因:
    • 删除操作,会将后面的元素整体向前移位。
    • 删除第一个"b" 索引是1,后面的元素整体向前移动一位。
    • 此时 第二个"b" 索引有原来的2 变为了 1 。
    • 但for循环 i 已经为2了,漏过了第二个"b"。
  • 解决方法:
  • 1 倒叙删除
        for (int i = list.size() - 1; i >= 0; i--) {
                if (list.get(i).equals("b")) {
                    list.remove(i);
                }
        }		
  • 2 删除操作后 i–
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals("b")) {
                list.remove(i);
                i--;
            }
        }

3.2 LinkedList集合

3.2.1 LinkedList特点

特点:
    1.底层数据结构:双向链表
    2.增删快: 元素分配不连续的,添加/删除元素,只需要找到位置,再修改对应节点保存地址的地方
    3.查询慢:
        要么从前向后查,要么从后向前查
    4.线程不同步,不安全,效率高

3.2.2 方法

public void addFirst(E e) :	将指定元素插入此列表的开头。
public void addLast(E e) :	将指定元素添加到此列表的结尾。
public E getFirst() :		返回此列表的第一个元素。
public E getLast() :		返回此列表的最后一个元素。
public E removeFirst() :	移除并返回此列表的第一个元素。
public E removeLast() :		移除并返回此列表的最后一个元素。
public void push(E e) :     底层调: addFirst
public E pop() :            底层调: removeFirst  

3.3 HashSet

在这里插入图片描述

package set;

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

public class SetDemo01 {

    public static void main(String[] args) {

        Set<String> sets = new HashSet<>(); //无序 不重复 无索引
        //Set<String> sets = new HashSet<>(); //有序 不重复 无索引
        sets.add("Java");
        sets.add("hhh");
        sets.add("a");
        sets.add("b");
        sets.add("c");

        System.out.println(sets);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package set;

import java.util.Objects;

public class Student {
    private String name;
    private int age;
    private String gender;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name) && Objects.equals(gender, student.gender);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, gender);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

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

package set;

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

public class SetDemo03 {

    public static void main(String[] args) {
        Set<Student> students = new HashSet<>();

        students.add(new Student("zhx",20,"male"));
        students.add(new Student("zhx",20,"male"));
        students.add(new Student("libai",2077,"male"));

        System.out.println(students);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package set;

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

public class SetDemo05 {

    public static void main(String[] args) {

        Set<Integer> sets = new TreeSet<>();
        sets.add(12);
        sets.add(23);
        sets.add(21);
        sets.add(88);
        System.out.println(sets);//[12, 21, 23, 88]

        Set<String> sets2 = new TreeSet<>();
        sets2.add("d");
        sets2.add("a");
        sets2.add("C");
        sets2.add("B");
        sets2.add("A");
        System.out.println(sets2);//[A, B, C, a, d]

    }
}

package set;

public class Apple implements Comparable<Apple>{

    private String name;
    private int weight;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public Apple(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public Apple() {
    }

    @Override
    public int compareTo(Apple o) {
        return this.weight - o.weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'' +
                ", weight=" + weight +
                '}';
    }
}

package set;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo05 {
    public static void main(String[] args) {
        Set<Apple> sets3 = new TreeSet<>();
        sets3.add(new Apple("a",10));
        sets3.add(new Apple("b",10));
        System.out.println(sets3); //[Apple{name='a', weight=10}]

        Set<Apple> sets4 = new TreeSet<>(new Comparator<Apple>() {
            @Override
            public int compare(Apple o1, Apple o2) {
                //return o1.getWeight()-o2.getWeight();//升序
                return o1.getWeight()-o2.getWeight(); //降序
            }
        });
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 Map

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package map;

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

public class MapDemo01 {

    public static void main(String[] args) {

        Map<String,Integer> maps = new HashMap<>();

        maps.put("李宁",10);
        maps.put("那可",-10);
        maps.put("羊毛",1200);
        maps.put(null,null);

        System.out.println(maps);
    }
}

在这里插入图片描述

package map;

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

public class MapDemo01 {

    public static void main(String[] args) {

        Map<String,Integer> maps = new LinkedHashMap<>();

        maps.put("李宁",10);
        maps.put("那可",-10);
        maps.put("羊毛",1200);
        maps.put(null,null);

        System.out.println(maps);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo02 {

    public static void main(String[] args) {

        Map<String,Integer> maps = new HashMap<>();

        maps.put("1",100);
        maps.put("2",200);
        maps.put("3",300);
        maps.put("4",200);
        maps.put("5",100);

        System.out.println(maps);//{1=100, 2=200, 3=300, 4=200, 5=100}

        //清空集合
//        maps.clear();
//        System.out.println(maps);

        //判断集合是否为空
        System.out.println(maps.isEmpty()); //false

        //根据键获取值
        Integer integer = maps.get("1");
        System.out.println(integer ); //100

        Integer integer1 = maps.get("");
        System.out.println(integer1); //null

        //根据键删除元素
        maps.remove("5");
        System.out.println(maps);//{1=100, 2=200, 3=300, 4=200}

        //是否包含某个键
        System.out.println(maps.containsKey("4"));//true
        //是否包含某个值
        System.out.println(maps.containsValue(200));//ture

        //获取键的集合
        Set<String> strings = maps.keySet();
        System.out.println(strings);//[1, 2, 3, 4]

        //获取值的集合
        Collection<Integer> values = maps.values();
        System.out.println(values);//[100, 200, 300, 200]

        System.out.println(maps.size());

        Map<String,Integer> maps2 = new HashMap<>();
        maps2.put("a",100);
        maps2.put("b",100);
        maps2.put("c",100);

        //将maps2 添加到maps
        maps.putAll(maps2);
        System.out.println(maps);//{1=100, a=100, 2=200, b=100, 3=300, c=100, 4=200}
        System.out.println(maps2 );//{a=98, b=100, c=100}


    }
}

Map集合的遍历

在这里插入图片描述
在这里插入图片描述

package map;

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

public class MapDemo03 {

   public static void main(String[] args) {
       Map<String, Integer> maps = new HashMap<>();

       maps.put("a", 100);
       maps.put("b", 200);
       maps.put("aaa", 300);
       maps.put("c", 400);
       maps.put("d", 200);

//方式一
       Set<String> keys = maps.keySet();
       for (String key : keys) {
           System.out.println(key + ":" + maps.get(key));
       }

//方式二
       Set<Map.Entry<String, Integer>> entries = maps.entrySet();
       for (Map.Entry<String, Integer> entry : entries) {
           String key = entry.getKey();
           Integer value = entry.getValue();
           System.out.println(key + " : " + value);
       }

   }
}

在这里插入图片描述

        maps.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {
                System.out.println(s+" : "+integer);
            }
        });

        maps.forEach((k,v)->System.out.println(k+" : "+v));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考资料

B站黑马视频

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值