目录
一、集合与数组的区别
二、Java集合的体系结构
三、Java集合遍历的三种方式
1、基本的for循环遍历(不是所有的Collection都可以使用基本的for循环进行遍历,要求集合带索引)
2、迭代器进行遍历(所有集合类都可使用)
3、增强for循环(相当于创建第三方变量)
(1)格式:
(2)注意事项:在增强for循环中修改第三方变量e的操作不会影响集合
四、Collection分支详解
(一)Collection常用方法
(二)List常用实现类
1、ArrayList类:
2、LinkedList类:
(三)Set常用实现类
1、TreeSet实现类(底层数据结构为红黑树):
2、HashSet集合实现类(底层数据结构为哈希表)
五、Map分支详解
1、Map集合
2、Map集合的常见实现类:
(1)HashMap实现类:
(2)TreeMap实现类:
3、可变参数
1、数组长度不可变,但集合长度可变
2、数组可存放基本数据类型,也可存放引用数据类型,但集合只能存放引用数据类型,集合只能存放基本数据类型的包装类
步骤:
(1)通过调用具体集合对象的iterator()方法获取该集合对象的迭代器
(2)使用迭代器对象的hasNext()方法进行判断当前位置是否有元素可以被取出,然后使用迭代器对象的next()方法取出当前位置的元素,将迭代器对象移动到下一个索引位置,将这两个方法配合使用即可完成遍历操作。
for(E e: 集合对象)
{
对e对象的操作,e对象为从集合对象中取出的对象
}
1、boolean add(E e):添加元素e
2、boolean remove(E e) :删除元素e
3、boolean removeif(Object o):根据条件o删除元素,o常常是lambda表达式
4、void clear():清空集合
5、boolean contains(Object o):判断集合中是否存在指定元素
6、int size():获取集合元素个数
(1)底层数据结构为数组,查询快,增删慢,三种遍历方式都可使用,初始空间为10个数组空间,当空间不够使用时,系统会自动扩容1.5倍数组空间。
(2)定义格式:
ArrayList list = new ArrayList();
(1)底层数据结构为双向链表,查询慢,增删快,三种遍历方式都可使用。
(2)定义格式:
LinkedList list = new LinkedList();
(3)常用方法:
1)public void addFirst(E e):在链表的首部添加元素e
2)public void addLast(E e):在链表的尾部添加元素e
3)pubic E getLast():获取链表尾部元素
4)public E getFirst():获取链表首部元素
5)public E removeFirst():删除并返回链表首部元素
6)public E removeLast():删除并返回链表尾部元素
特点:
(1)可以去重复
(2)存取顺序不一致
(3)不带索引,所以不能使用普通for循环进行遍历
(1)特点:可以按照规则进行排序,若使用TreeSet实现类需要制定排序规则!
(2)制定排序规则的两种方法:
1)自然排序Comparable的使用:
第一步:使用空参构造方法创建TreeSet集合
第二步:自定义的类实现Comparable接口
第三步:重写compareTo(Object o)方法(o代表集合内部的元素,this代表当前元素)
2)比较器Comparator的使用:
第一步:让集合对象的构造方法接收Comparator接口的实现对象
第二步:重写compare(T o1, T o2)方法,其中o1指的是this对象
3)不管是compareTo方法还是compare方法返回值都是int类型,若返回的是负数则放在左边,若返回的是0则插入,若返回的是正数则放在右边。
(1)特点:底层哈希表实现,通过哈希值来确定具体元素的存放位置。
(2)哈希值的计算:jdk一般根据对象的地址或者对象的属性值来进行计算,在Java中可以通过Object类的hashCode()方法来获取对象的哈希值,默认是按照对象的地址来进行计算的,若要按照对象的属性来自定义计算哈希值,则需要重写hashCode()方法。
(3)哈希表结构:HashSet1.8版本以前的哈希表示由数组和链表组成,采用开链法来避免哈希冲突,当哈希值的个数达到数组容量的0.75倍时,数组会自动扩容到原来的两倍。HashSet1.8版本后,哈希表采用数组、链表和红黑树的组合方式来进行存储,JDK1.8以后 节点个数少于等于8个 数组 + 链表,节点个数多于8个 数组 + 红黑树。
(1)概念:
双列集合,一次可以存储两个元素,即一对数据,每一对数据叫做键值对,每一对键值对都是一一对应的,键不能重复,但值可以重复。
(2)创建格式:
Map<键类型,值类型> map = new HashMap/TreeMap<>();
(3)常用方法:
1)V put(K key, V value):添加一对键值对,若键已存在则覆盖原先的value并返回原先的值。
2)V remove(K, key):根据键值删除键值对元素
3) void clear():移除所有的键值对元素
4) boolean containsKey(Object key):判断键key是否已存在
5)boolean containsValue(Object value):判断值value是否已存在
6)boolean isEmpty():判断集合是否为空
7) int size():集合的长度,即集合中键值对的个数
8)V get(Object key):根据键获取对应的值
9)Set
10)Set
11)K getKey():获取键值对的键
12) V getValue():获取键值对的值
(4)遍历方式:
1)第一种:首先通过调用keySet()方法获取当前Map的键的set集合,然后对该set集合进行遍历key值,对于每一个key值调用get(key)方法将键对应的值取出。
2) 第二种:首先通过调用entrySet()方法获取所有键值对的set集合,然后对set集合进行遍历,通过调用Entry键值对的getKey()和getValue()方法取出相应的键和值。
底层数据结构也是哈希表结构(jdk1.8之前由数组和链表实现,jdk1.8以后由数组和红黑树来组成)。
依赖hashCode()方法和equals()来保证键的唯一。
如果简要存储的是自定义的对象,需要重写hashCode()和equals()方法。
底层数据结构为红黑树,每一个Entry对象为一个结点,排序比较时只关心键,不关心值。
依赖自然排序或者比较器排序,对键进行排序
如果键存储的是自定义对象,需要实现Comparable接口或者创建TreeMap对象时给出比较器排序规则。
(1)概念:方法中形参的个数是可变的。
(2)格式:修饰符 返回值类型 方法名(数据类型...变量名){ } 注意:这里的变量实际是一个数组
例如:public static int sum(int...a) { } a其实就是一个数组
(注意:可变参数必须写在形参的后面)