集合框架

Collection接口

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

迭代器

有两个常用的方法
boolean hasNext() 如果仍有元素可以迭代,则返回 true。
判断集合中还有没有下一个元素,有就返回true,没有就返回false
E next() 返回迭代的下一个元素。
取出集合中的下一个元素
Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊
Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
Iterator<> iterator() 返回在此 collection 的元素上进行迭代的迭代器。

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

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

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

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

创建集合对象,使用泛型
好处:
1. 避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2. 把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
泛型的通配符:
?:代表任意的数据类型
使用方式:
不能创建对象使用
只能作为方法的参数使用
泛型的上限限定: ? extends E 代表使用的泛型只能是E类型的子类/本身
泛型的下限限定: ? super E 代表使用的泛型只能是E类型的父类/本身
定义含有泛型的方法:泛型定义在方法的修饰符和返回值类型之间

格式:
    修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){
        方法体;
    }

含有泛型的方法,在调用方法的时候确定泛型的数据类型
传递什么类型的参数,泛型就是什么类型

含有泛型的接口,第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型

public interface Iterator<E> {
    E next();
}
Scanner类实现了Iterator接口,并指定接口的泛型为String,所以重写的next方法泛型默认就是String
public final class Scanner implements Iterator<String>{
    public String next() {}

含有泛型的接口第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
就相当于定义了一个含有泛型的类,创建对象的时候确定泛型的类型

public interface List<E>{
    boolean add(E e);
    E get(int index);
}
public class ArrayList<E> implements List<E>{
    public boolean add(E e) {}
    public E get(int index) {}
}

List接口

java.util.List接口 extends Collection接口
List接口的特点:
1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
2.有索引,包含了一些带索引的方法
3.允许存储重复的元素

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:字符串索引越界异常

java.util.LinkedList集合 implements List接口
LinkedList集合的特点:
1.底层是一个链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:使用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接口

java.util.Set接口 extends Collection接口

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

java.util.LinkedHashSet集合 extends HashSet集合

LinkedHashSet集合特点:
    底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
    是多线程的,不是线程安全

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)

在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
hashCode方法的源码:
    public native int hashCode();
    native:代表该方法调用的是本地操作系统的方法

HashSet集合存储数据的结构(哈希表)
在这里插入图片描述
Set集合存储元素不重复的原理
在这里插入图片描述

可变参数

可变参数:是JDK1.5之后出现的新特性

使用前提:
    当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
使用格式:定义方法时使用
    修饰符 返回值类型 方法名(数据类型...变量名){}
可变参数的原理:
    可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
    传递的参数个数,可以是0个(不传递),1,2...多个

Collections是集合工具类

- java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
    - public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
    - public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
    - public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。

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

Comparable接口的排序规则:
    自己(this)-参数:升序

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

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

Comparator的排序规则:
    o1-o2:升序

数据结构

栈&队列
在这里插入图片描述
数组
在这里插入图片描述
链表
在这里插入图片描述
红黑树
在这里插入图片描述

Map集合

java.util.Map<k,v>集合

Map集合的特点:
    1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
    2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
    3.Map集合中的元素,key是不允许重复的,value是可以重复的
    4.Map集合中的元素,key和value是一一对应
java.util.HashMap<k,v>集合 implements Map<k,v>接口
HashMap集合的特点:
    1.HashMap集合底层是哈希表:查询的速度特别的快
        JDK1.8之前:数组+单向链表
        JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
    2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
    3.是多线程的,不是线程安全

java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合

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

Map集合的第一种遍历方式:通过键找值的方式

Map集合中的方法:
     Set<K> keySet() 返回此映射中包含的键的 Set 视图。
实现步骤:
    1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
    2.遍历set集合,获取Map集合中的每一个key
    3.通过Map集合中的方法get(key),通过key找到value
    
    public static void main(String[] args) {
    //创建Map集合对象
    Map<String,Integer> map = new HashMap<>();
    map.put("赵丽颖",168);
    map.put("杨颖",165);
    map.put("林志玲",178);

    //1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
    Set<String> set = map.keySet();

    //2.遍历set集合,获取Map集合中的每一个key
    //使用迭代器遍历Set集合
    Iterator<String> it = set.iterator();
    while (it.hasNext()){
        String key = it.next();
        //3.通过Map集合中的方法get(key),通过key找到value
        Integer value = map.get(key);
        System.out.println(key+"="+value);
    }
    System.out.println("-------------------");
    //使用增强for遍历Set集合
    for(String key : set){
        //3.通过Map集合中的方法get(key),通过key找到value
        Integer value = map.get(key);
        System.out.println(key+"="+value);
    }
    System.out.println("-------------------");
    //使用增强for遍历Set集合
    for(String key : map.keySet()){
        //3.通过Map集合中的方法get(key),通过key找到value
        Integer value = map.get(key);
        System.out.println(key+"="+value);
    }
}

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

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

实现步骤:
    1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
    2.遍历Set集合,获取每一个Entry对象
    3.使用Entry对象中的方法getKey()和getValue()获取键与值
    
    public static void main(String[] args) {
    //创建Map集合对象
    Map<String,Integer> map = new HashMap<>();
    map.put("赵丽颖",168);
    map.put("杨颖",165);
    map.put("林志玲",178);

    //1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
    Set<Map.Entry<String, Integer>> set = map.entrySet();

    //2.遍历Set集合,获取每一个Entry对象
    //使用迭代器遍历Set集合
    Iterator<Map.Entry<String, Integer>> it = set.iterator();
    while(it.hasNext()){
        Map.Entry<String, Integer> entry = it.next();
        //3.使用Entry对象中的方法getKey()和getValue()获取键与值
        String key = entry.getKey();
        Integer value = entry.getValue();
        System.out.println(key+"="+value);
    }
    System.out.println("-----------------------");
    for(Map.Entry<String,Integer> entry:set){
        //3.使用Entry对象中的方法getKey()和getValue()获取键与值
        String key = entry.getKey();
        Integer value = entry.getValue();
        System.out.println(key+"="+value);
    }
}

java.util.LinkedHashMap<K,V> entends HashMap<K,V>

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

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

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

HashMap集合(之前学的所有的集合):可以存储null值,null键
Hashtable集合,不能存储null值,null键

Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流相结合的集合

JDK9的新特性:

    List接口,Set接口,Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素
    static <E> List<E> of​(E... elements)
    使用前提:
        当集合中存储的元素的个数已经确定了,不在改变时使用
 注意:
    1.of方法只适用于List接口,Set接口,Map接口,不适用于接接口的实现类
    2.of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常
    3.Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常
    
    public static void main(String[] args) {
    List<String> list = List.of("a", "b", "a", "c", "d");
    System.out.println(list);//[a, b, a, c, d]
    //list.add("w");//UnsupportedOperationException:不支持操作异常

    //Set<String> set = Set.of("a", "b", "a", "c", "d");//IllegalArgumentException:非法参数异常,有重复的元素
    Set<String> set = Set.of("a", "b", "c", "d");
    System.out.println(set);
    //set.add("w");//UnsupportedOperationException:不支持操作异常

    //Map<String, Integer> map = Map.of("张三", 18, "李四", 19, "王五", 20,"张三",19);IllegalArgumentException:非法参数异常,有重复的元素
    Map<String, Integer> map = Map.of("张三", 18, "李四", 19, "王五", 20);
    System.out.println(map);//{王五=20, 李四=19, 张三=18}
    //map.put("赵四",30);//UnsupportedOperationException:不支持操作异常
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值