码迷,mamicode.com
首页 > 其他好文 > 详细

集合框架的一个小总结

时间:2021-04-06 14:42:03      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:arraylist   hashset   表结构   数据类型   获取   移除   学生   key   不可   

集合框架简介

概述

集合就像一种容器,可以把多个对象放进容器内

特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变

集合按照其存储结构可以分为两大类:

  • 单列集合 java.util.Collection
  • 双列集合 java.util.Map

四大体系

  • Set:无序、不可重复的集合
  • List:有序、重复的集合
  • Queue:自Java 5增加,代表一种队列集合
  • Map:具有映射关系的集合

集合与数组的区别

  • 数组的长度是固定的,集合的长度是可变的

  • 数组长度在数组初始化时就已经确定,只能保存定长的数据;
    而集合可以保存数量不确定的数据,同时可以保存具有映射关系的数据(key - value)

  • 数组元素既可以是基本类型的值,也可以是对象;
    而集合只能保存对象(保存对象的引用变量),基本数据类型变量需要转换为对应的包装类才能放入集合类中

集合间的继承关系

集合类主要由两个接口派生而出。

Collection和Map

CollectionMap是Java集合框架的根接口

常用已实现的结合类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap

Collection

简介

Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素

两个重要的子接口

  • java.util.List:元素有序、可重复
  • java.util.Set:元素无序、不可重复

接口中定义了许多方法供其子类进行实现


List 接口的主要实现类为:

  • java.util.ArrayList
  • java.util.LinkedList

Set 接口的主要实现类为:

  • java.util.HashSet
  • java.util.TreeSet

常用方法

  • public boolean add(E e):把对象添加到当前集合中
  • public void clear():清空集合
  • public boolean remove(E e):把对象删除
  • public boolean contains(E e):判断当前集合中是否包含给定的对象
  • public boolean isEmpty():判断集合是否为空
  • public int size():返回集合元素个数
  • public Object[] toArray():把集合中的元素存储到数组中
public class CollectionTest {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("蓝天");
        collection.add("白云");

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

        System.out.println(collection.contains("蓝天"));
        System.out.println("===========");

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

        Object[] objects = collection.toArray();
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
        }
        System.out.println("============");
        
        for (String s : collection) {
            System.out.println(s);
        }
    }
}

Iterator接口

Iterator接口经常被称作迭代器,它是Collection接口的父接口

Iterator接口主要用于迭代访问 Collection 中的元素,因此 Iterator 对象也被称为迭代器

Iterator接口中主要定义了2个方法:

  • public boolean hasNext():如果仍有元素可以迭代,则返回true
  • public E next():返回迭代的下一个元素
public class demo {
    public static void main(String[] args) {
        
        //创建集合
        Collection<Student> students = new ArrayList<Student>();
        
        Student student = new Student("张三", 23);
        students.add(student);

        //获得集合的迭代器
        Iterator<Student> iterator = students.iterator();
        
        while (iterator.hasNext()) {
            Student s = iterator.next();
            System.out.println(s.toString());
        }
        
        //这里还可以使用增强for来遍历
    }
}

使用迭代器进行元素的迭代,集合元素的值传递给了迭代变量

集合元素的值传给了迭代变量,仅仅传递了对象引用。保存的仅仅是指向对象内存空间的地址

实现原理:在遍历集合时,首先调用集合的 iterator() 方法获得迭代器对象,然后使用 hashNext() 方法判断集合中是否存在下一个元素,如果存在,则调用 next() 方法将元素取出,否则说明已到达了集合末尾,停止遍历元素

List

简介

List接口继承自Collection接口,是单列集合的一个重要分支

特点:

  • 有序:存储和取出元素顺序一直

  • 可重复:存储的元素可以重复

  • 所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素

常用方法

  • public void add(int index, E element):将元素添加到集合指定位置上
  • public E get(int index):返回集合指定位置元素
  • public E remove(int index):移除指定位置元素,返回被移除的元素
  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回更新前的元素
public class ListTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("蓝");
        list.add("蓝天");
        list.add("蓝天空");

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

        System.out.println(list.remove(1));
        System.out.println(list);
        System.out.println("=========");

        list.set(0, "宇");
        System.out.println(list);
        System.out.println("=========");

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("=========");

        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("=========");
    }
}

ArrayList集合

java.util.ArrayList集合数据存储的结构是数组结构

元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合

LinkedList集合

java.util.LinkedList集合数据存储的结构是链表结构

方便元素添加、删除的集合

LinkedList是一个双向链表

LinkedList提供了大量首尾操作的方法:

  • public void addFirst(E e):将元素插入列表头
  • public void addLast(E e):将元素添加到列表尾
  • public E getFirst():返回列表第一个元素
  • public E getLast():返回列表最后一个元素
  • public E removeFirst():移除并返回列表第一个元素
  • public E removeLast():移除并返回列表最后一个元素
  • public E pop():从列表所表示的堆栈处弹出一个元素
  • public void push(E e):将元素推入列表所表示的堆栈
  • public boolean isEmpty():判断空
public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("1");
        linkedList.add("2");
        linkedList.add("3");
        System.out.println("===========");

        System.out.println(linkedList.getFirst());
        System.out.println(linkedList.getLast());
        System.out.println("===========");

        System.out.println(linkedList.removeFirst());
        System.out.println(linkedList.removeLast());
        System.out.println("===========");

        while (!linkedList.isEmpty()) {
            System.out.println(linkedList.pop());
        }
        System.out.println("===========");
        
        System.out.println(linkedList);
    }
}

Set接口

简介

Set接口与Collection集合基本相同,行为不同(Set不允许包含重复元素)

Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复

HashSet集合

java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复、无序的

HashSet 根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能

public class HashSetTest {
    public static void main(String[] args) {
        HashSet<String> strings = new HashSet<>();
        strings.add("123");
        strings.add("1234");
        strings.add("12345");

        for (String name : strings) {
            System.out.println(name);
        }
    }
}

HashSet存储自定义对象

  • 自定义Student类(需要重写hashCode、equals方法)
public class Student {
    private String name;
    private int age;
    public Student() {

    }

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

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

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

    public int getAge() {
        return age;
    }

    @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);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
   
    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}

使用

public class HashSetTest {
    public static void main(String[] args) {
        HashSet<Student> students = new HashSet<>();
        students.add(new Student("蓝天", 100));
        students.add(new Student("星月", 1000));
        students.add(new Student("镇天", 10000));

        for (Student student : students) {
            System.out.println(student);
        }
    }
}

LinkedHashSet集合

我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?

在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构

可以保证有序

public class LinkedHashSetDemo {
	public static void main(String[] args) {
		Set<String> set = new LinkedHashSet<String>();
		set.add("bbb");
		set.add("aaa");
		set.add("abc");
		set.add("bbc");
        
        Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

Map

简介

映射:一一对应的关系,就叫做映射

Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口

常用子类:

  • HashMap<K,V>
    • 存储数据采用的哈希表结构
    • 无序
    • 由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
  • LinkedHashMap<K,V>
    • HashMap的子类
    • 存储数据采用的哈希表结构+链表结构
    • 有序
    • 通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法

Map接口中的集合都有两个泛型变量<K,V>

在使用时,要为两个泛型变量赋予数据类型

两个泛型变量<K,V>的数据类型可以相同,也可以不同

Map集合不能直接使用迭代器或者foreach进行遍历,但是转成Set之后就可以使用了

常用方法

  • public V put(K key, V value):添加指定键值在集合中
  • public V remove(Object key):删除指定键值并返回
  • public V get(Object key):根据指定的键,获取对应的值
  • boolean containsKey(Object key) :判断集合中是否包含指定的键
  • public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中
  • public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)
public class MapTest {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("蓝天", "教主");
        map.put("苏宇", "人皇");
        map.put("天圣", "镇守");
        System.out.println(map);
        System.out.println("==========");

        System.out.println(map.remove("蓝天"));
        System.out.println("==========");

        System.out.println(map.get("苏宇"));
        System.out.println("==========");

    }
}

使用put方法时:

  • 若指定的键在集合中没有,返回null,并把指定的键值添加到集合中
  • 若存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值

遍历

键找值方式:即通过元素中的键,获取键所对应的值

  • 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键
  • 遍历键的Set集合,得到每一个键
  • 根据键,获取键所对应的值
public class MapTest {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("蓝天", "教主");
        map.put("苏宇", "人皇");
        map.put("天圣", "镇守");

        //获取键集
        Set<String> keys = map.keySet();

        //遍历键集
        for (String key : keys) {
            String s = map.get(key);
            System.out.println(key + " = " + s);
        }

    }
}

Entry键值对对象

Map中存放的是两种对象:key(键)、value(值)

把这一对对象称为Map中的一个Entry(项)

Entry 将键值对封装成了对象,即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对对象中获取对应的键与对应的值

  • public K getKey():获取Entry对象中的键
  • public V getValue():获取Entry对象中的值
  • public Set<Map.Entry<K,V>> entrySet():获取Map集合中所有的键值对对象到集合Set

使用Entry遍历

  • 获取所有键值对对象,以Set返回
  • 遍历Set,得到每一个键值对对象
  • 通过键值对对象获取键与值
public class MapTest {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("蓝天", "教主");
        map.put("苏宇", "人皇");
        map.put("天圣", "镇守");

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

    }
}

HashMap存储自定义类型

练习:每位学生(姓名,年龄)都有自己的家庭住址,将学生对象和家庭住址存储到map集合中

学生作为键, 家庭住址作为值

public class HashMapTest {
    public static void main(String[] args) {
        Map<Student, String> map = new HashMap<Student, String>();
        map.put(new Student("蓝天", 100), "五重天");
        map.put(new Student("星月", 1000), "六重天");
        map.put(new Student("苏宇", 10000), "七重天");

        Set<Student> students = map.keySet();
        for (Student key : students) {
            String value = map.get(key);
            System.out.println(key.toString() + "...." + value);
        }
    }
}

集合框架的一个小总结

标签:arraylist   hashset   表结构   数据类型   获取   移除   学生   key   不可   

原文地址:https://www.cnblogs.com/lloco/p/14616345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!