Java 集合的入门学习——卷一

祭出神图:
在这里插入图片描述

Collecttion:单列集合

单列集合根接口Collection
所有单列集合的最顶层的接口,里边定义了所有单列集合共性的方法
任意的单列集合都可以使用Collection接口中的方法
常用方法

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(): 把集合中的元素,存储到数组中。

List接口 extends Collection接口

List接口特点:

  1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。

  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List常用方法

public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。

public E get(int index)`:返回集合中指定位置的元素。

public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。

public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

注意:

 操作索引的时候,一定要防止索引越界异常
        IndexOutOfBoundsException:索引越界异常,集合会报
        ArrayIndexOutOfBoundsException:数组索引越界异常
        StringIndexOutOfBoundsException:字符串索引越界异常

ArrayList extends List

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

LinkedList extends List

LinkedList集合的特点:
1.底层是一个链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态
LinkedList是一个双向链表
LinkedList集合也可以作为堆栈,队列的结构使用

LinkedList常用方法
public void addFirst(E e)`:将指定元素插入此列表的开头。

public void addLast(E e)`:将指定元素添加到此列表的结尾。

public void push(E e)`:将元素推入此列表所表示的堆栈。


public E getFirst()`:返回此列表的第一个元素。

public E getLast()`:返回此列表的最后一个元素。


public E removeFirst()`:移除并返回此列表的第一个元素。

public E removeLast()`:移除并返回此列表的最后一个元素。

public E pop()`:从此列表所表示的堆栈处弹出一个元素。


public boolean isEmpty()`:如果列表不包含元素,则返回true

Set extends Collection

java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

tips:Set集合取出元素的方式可以采用:迭代器、增强for。
Set接口的特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
java.util.HashSet集合 implements Set接口
哈希表和链表实现了Set接口,具有可预测的迭代次序

HashSet集合

java.util.HashSetSet接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet底层的实现其实是一个java.util.HashMap支持.

HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCodeequals方法。

HashSet中存放自定义类型元素时,需要重写对象中的hashCodeequals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一.

HashSet特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)

常用方法
public boolean add(E e) 
将指定的元素添加到此集合(如果尚未存在)。  

public void clear() 
从此集合中删除所有元素。 

public boolean contains(Object o) 
如果此集合包含指定的元素,则返回 truepublic boolean isEmpty() 
如果此集合不包含元素,则返回 truepublic Iterator<E> iterator() 
返回此集合中元素的迭代器。  

public boolean remove(Object o) 
如果存在,则从该集合中删除指定的元素。  

public int size() 
返回此集合中的元素数(其基数)。 
LinkedHashSet集合 extends HashSet集合

LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
该类提供了所有可选的Set操作,并允许null元素。 像HashSet,它提供了基本操作(add,contains和remove)稳定的性能

Map集合

Map集合的特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map集合中的元素,key是不允许重复的,value是可以重复的
4.Map集合中的元素,key和value是一一对应

Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

Collection中的集合称为单列集合,Map中的集合称为双列集合。

 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

tips:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

常用方法:
public V put(K key, V value)`:  把指定的键与指定的值添加到Map集合中。

public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。

boolean containsKey(Object key)  ` 判断集合中是否包含指定的键。

public Set<K> keySet()`: 获取Map集合中所有的键,存储到Set集合中。

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

tips:

使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
Set<K> keySet() 返回此映射中包含的键的 Set 视图。
实现步骤:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
2.遍历set集合,获取Map集合中的每一个key
3.通过Map集合中的方法get(key),通过key找到value

HashMap<k,v>集合 implements Map<k,v>接口

HashMap集合的特点:
1.HashMap集合底层是哈希表:查询的速度特别的快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致

HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
HashMap存储自定义类型键值
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCodeequals方法(如果忘记,请回顾HashSet存放自定义对象)

LinkedHashMap<K,V> entends HashMap<K,V>

如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
底层原理:哈希表+链表(记录元素的顺序)

LinkedHashMap的特点:
1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的

LinkedHashMap<K,V>HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

Entry键值对对象

Map集合遍历的第二种方式:使用Entry对象遍历

Map集合中的方法:
    Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。

实现步骤:
    1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
    2.遍历Set集合,获取每一个Entry对象
    3.使用Entry对象中的方法getKey()和getValue()获取键与值

Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

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

Hashtable<K,V>集合 implements Map<K,V>接口

Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快

HashMap集合(之前学的所有的集合):可以存储null值,null键
Hashtable集合,不能存储null值,null键
HashtableVector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流相结合的集合

迭代器Iterator

public Iterator iterator()`: 获取集合对应的迭代器,用来遍历集合中的元素的。
public E next()`:返回迭代的下一个元素。
pboolean hasNext() 如果仍有元素可以迭代,则返回 true。
 判断集合中还有没有下一个元素,有就返回true,没有就返回false

Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊
Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。

迭代器的使用步骤(重点):
1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
3.使用Iterator接口中的方法next取出集合中的下一个元素

for-each循环

增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写
    是JDK1.5之后出现的新特性
    Collection<E>extends Iterable<E>:所有的单列集合都可以使用增强for
    public interface Iterable<T>实现这个接口允许对象成为 "foreach" 语句的目标。

    增强for循环:用来遍历集合和数组

    格式:
        for(集合/数组的数据类型 变量名: 集合名/数组名){
            sout(变量名);
        }

Collections

java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static void sort(List list):将集合中元素按照默认规则排序。

注意:
     sort(List<T> list)使用前提
     被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则

Comparable接口的排序规则:
    自己(this)-参数:升序
常用方法:
public static <T> boolean addAll(Collection<T> c, T... elements)  `:往集合中添加一些元素。

public static void shuffle(List<?> list) 打乱顺序`:打乱集合顺序。

public static <T> void sort(List<T> list)`:将集合中元素按照默认规则排序。

public static <T> void sort(List<T> list,Comparator<? super T> )`:将集合中元素按照指定规则排序。

Comparator比较器

java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
        public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

     Comparator和Comparable的区别
        Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
        Comparator:相当于找一个第三方的裁判,比较两个

    Comparator的排序规则:
        o1-o2:升序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值