java集合,Collection,list,set,map汇总

2021-07-27 11:07:55 浏览数 (1)

关于java集合的的汇总,轩成笔记

1 Java集合简介

Java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器(集合)来装载

简单来说集合就是“由若干个确定的元素所构成的整体”。就是Java给我们提供了工具方便我们去操作多个Java对象。

  • 1.集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。
  • 2.集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
  • 3.集合可以存放不同类型,不限数量的数据类型。

1.1 如何学习集合

首先需要了解集合的分类,以及集合用法(看api),实现类,各有什么功能和不同,这在面试中经常会考到,再一个就是从数据结构层面底层去考虑这些问题,虽然以后在工作中多数人都不会涉及,但是这是考验学习能力的一种方式。

1.2 集合的主要三种类型

  • List:一种有序列表的集合,例如,按索引排列的Student的List;
  • Set:一种保证没有重复元素的集合,例如,所有无重复名称的Student的Set;
  • Map:一种通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。

1.2 关于使用集合的心得

  • 如果是集合类型,有List和Set供我们选择。List的特点是插入有序的,元素是可重复的。Set的特点是插入无序的,元素不可重复的。至于选择哪个实现类来作为我们的存储容器,我们就得看具体的应用场景。是希望可重复的就得用List,选择List下常见的子类。是希望不可重复,选择Set下常见的子类。
  • 如果是Key-Value型,那我们会选择Map。如果要保持插入顺序的,我们可以选择LinkedHashMap,如果不需要则选择HashMap,如果要排序则选择TreeMap。

常见的数据结构

数据结构指的是数据的组存储方式,不同的数据结构有不同的特点。

  1. 数组结构(ArrayList底层结构)   查询快,增删慢
  2. 链表结构(LinkedList底层结构)   查询慢,增删快
  3. 栈和队列   栈:先进后出(子弹夹,杯子)   队列:先进先出(排队,管子)

栈和队列

2 集合的分类

2.1.常用集合的归纳:

List 接口:元素按进入先后有序保存,可重复

  1. LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
  2. ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
  3. Vector 接口实现类 数组, 同步, 线程安全(Stack 是Vector类的实现类)

Set 接口: 仅接收一次,不可重复,并做内部排序

  1. HashSet 使用hash表(数组)存储元素
  • LinkedHashSet 链表维护元素的插入次序
  1. TreeSet 底层实现为二叉树,元素排好序

2.2.最主要是看图:

常见面试笔试题:Arraylist,LinkedList,Vector的区别

集合与数组的区别

数组和集合的区别:

  • 1:长度的区别
    • 数组的长度固定
    • 集合的长度可变
  • 2:内容不容
    • 数组存储的是同一种类型的元素
    • 集合可以存储不同类型的元素(但是一般我们不这样干..)
  • 3:元素的数据类型
    • 数组可以存储基本数据类型,也可以存储引用类型
    • 集合只能存储引用类型(你存储的是简单的int,它会自动装箱成Integer)

3.Collection

Collection常见方法

  1. 添加功能 boolean add(E e) 添加一个元素 boolean addAll(Collection c) 添加一批元素
  2. 删除功能 boolean remove(Object o) 删除一个元素
  3. 判断功能 boolean contains(Object o) 判断集合是否包含指定的元素 boolean isEmpty() 判断集合是否为空(集合中没有元素)
  4. 获取功能 int size() 获取集合的长度
  5. 转换功能 Object[] toArray() 把集合转换为数组

Collection:使用技巧

3.1 list和set的区别:

3.2 list

  1. ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
  2. LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
  3. Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

list常见方法

1.add(int index, Object ele)

2.boolean addAll(int index, Collection eles)

3.Object get(int index)

http://4.int indexOf(Object obj)

http://5.int lastIndexOf(Object obj)

6.Object remove(int index)

7.Object set(int index, Object ele)

8.List subList(int fromIndex, int toIndex)

3.3 set集合

Set集合的特点是:元素不可重复

  1. HashSet集合
  • 底层数据结构是哈希表(是一个元素为链表的数组)
  • 不能保证元素的顺序。
  • HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。
  • 集合元素值可以是null。
  • 影响哈希冲突的条件,首先看哈希值是否相等,然后判断equals是否相等(内容是否相等)
  1. TreeSet集合
  • A:底层数据结构是红黑树(是一个自平衡的二叉树)
  • B:保证元素的排序方式(自然排序),实现Comparable接口
  1. LinkedHashSet集合
  • A::底层数据结构由哈希表和链表组成。
  • 原来存储是什么顺序,就是什么顺序

各Set实现类的性能分析

  • HashSet的性能比TreeSet的性能好(特别是添加,查询元素时),因为TreeSet需要额外的红黑树算法维护元素的次序,如果需要一个保持排序的Set时才用TreeSet,否则应该使用HashSet。
  • LinkedHashSet是HashSet的子类,由于需要链表维护元素的顺序,所以插入和删除操作比HashSet要慢,但遍历比HashSet快。
  • EnumSet是所有Set实现类中性能最好的,但它只能 保存同一个枚举类的枚举值作为集合元素。
  • 以上几个Set实现类都是线程不安全的,如果多线程访问,必须手动保证集合的同步性,这在后面的章节中会讲到。

3.4遍历Collection集合的方式

1.普通的for循环【必须要有索引,可以修改元素】

  • 注意set集合是无序的不能使用普通for循环遍历,只能使用增强for或者迭代器遍历
代码语言:javascript复制
import java.util.*;

public class test{
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("Hello");
        list.add("Java");
        list.add("World");
        list.add("轩成笔记");
        for (int i = 0; i < list.size(); i  ){
            String s = (String) list.get(i);
            System.out.println(s);
        }
    }
}

2.迭代器遍历【任何集合都可以遍历,只能获取元素】

  • 只要是Collection集合都适合
  • 它是Java集合的顶层接口(不包括map系列的集合,Map接口是map系列集合的顶层接口)

1. Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型。

2. boolean hasNext():判断容器内是否还有可供访问的元素。

3. void remove():删除迭代器刚越过的元素。

  • 所以除了map系列的集合,我么都能通过迭代器来对集合中的元素进行遍历。
  • 注意:我们可以在源码中追溯到集合的顶层接口,比如Collection接口,可以看到它继承的是类Iterable
代码语言:javascript复制
import java.util.*;

public class test{
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();
        c.add("Hello");
        c.add("Java");
        c.add("World");
        c.add("轩成笔记");
        //获取迭代器对象
        Iterator<String> it = c.iterator();
        //hasNext()判断是否有下一个元素,如果有就用next()获取
        while(it.hasNext()){
            //获取下一个元素
            String s = it.next();
            System.out.println(s);
        }
    }
}

3.高级for循环【就是迭代器的简化方式】

代码语言:javascript复制
import java.util.*;

public class test{
    public static void main(String[] args) {
        Collection<String> c = new HashSet<String>();
        c.add("Hello");
        c.add("Java");
        c.add("World");
        c.add("轩成笔记");
        //高级for遍历集合
        for (String s : c){
            System.out.println(s);
        }

        int[] arr = {1, 2, 3, 4, 5};
        //高级for遍历数组
        for (int a : arr){
            System.out.println(a);
        }
    }
}

0 人点赞