Java基础十五、十六和十七天合:集合+Collection接口+List接口+ArrayList+LinkedList+Set接口+HashSet+Map接口+HashMap+Collections

集合

1.概述

数组:长度一旦定义不能改+数据的类型必须统一+优势是查询快

集合:长度可变+元素的类型不限+有查的快的,有增删快的

2.泛型

用来约束集合中元素类型,标志是<> ----+编译器报错

< >----不能是基本类型,必须是引用类型

3.泛型使用位置

类上/接口上–class Demo< >{ }

方法上----------public < > void show(E e){ }

4.继承机构

Collection:顶级接口,不能new,学方法

​ List:子接口,不能new,学方法

​ ArrayList:实现类,学习new

​ LinkedList:实现类,学习new

​ Set:子接口,不能new,学方法

​ HashSet:实现类,学习new

​ TreeSet:实现类,学习new

Collection接口

1.概述

Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素

2.共性方法

boolean**add**(E e) 确保此 collection 包含指定的元素(可选操作)。
boolean**addAll**(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
void**clear**() 移除此 collection 中的所有元素(可选操作)。
boolean**contains**(Object o) 如果此 collection 包含指定的元素,则返回 true
boolean**containsAll**(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true
boolean**equals**(Object o) 比较此 collection 与指定对象是否相等。
int**hashCode**() 返回此 collection 的哈希码值。
boolean**isEmpty**() 如果此 collection 不包含元素,则返回 true
Iterator<E>**iterator**() 返回在此 collection 的元素上进行迭代的迭代器。
boolean**remove**(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean**removeAll**(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
boolean**retainAll**(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
int**size**() 返回此 collection 中的元素数。
Object[]**toArray**() 返回包含此 collection 中所有元素的数组。
<T> T[]**toArray**(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

List接口

1.特点

​ 有序

​ 有索引

​ 可以重复

​ 存多个null

2.常用方法

继承自Collection接口的

自己扩展特有的(根据索引的操作)

void**add**(int index, E element) 在列表的指定位置插入指定元素(可选操作)。
boolean**addAll**(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
E**get**(int index) 返回列表中指定位置的元素。
int**indexOf**(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
int**lastIndexOf**(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
ListIterator<E>**listIterator**() 返回此列表元素的列表迭代器(按适当顺序)。
ListIterator<E>**listIterator**(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
E**remove**(int index) 移除列表中指定位置的元素(可选操作)。
E**set**(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。
List<E>**subList**(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

List集合的迭代方式

方式一:

Iterator<>  iterator()    ---继承自Collection
while (it.hasNext()){
            Integer in = it.next();
            System.out.println(in+"------");
        }

方式二:

ListIterator<>  listIterator()	---继承自子接口List
while (lit.hasNext()){
            Integer in = lit.next();
            System.out.println(in+"------");
        }
        System.out.println("------------------");
        //逆向遍历---前提是:必须先顺序遍历
        while (lit.hasPrevious()){
            Integer in = lit.previous();
            System.out.println(in+"------");
        }

方式三:普通for,根据下标迭代

for (int i = 0; i < list1.size(); i++) {//list.size()是集合的长度
            System.out.println(list1.get(i));//根据下标i获取元素
        }

方式四:增强for

for (Integer in:list1) { 
    System.out.println(in);
}

iterator和listIterator的区别

iterator()来自父接口Collection

listIterator()是List子接口特有的

返回值不同,是父子接口关系,子接口listIterator能用所有父接口Iterator的功能,而且扩展了逆向遍历的方法

ArrayList

1.结构

是List接口的实现类,底层维护的是一个 可变长的 数组Object[ ]

方便查询

2.创建对象

ArrayList()

3.常用方法

同List接口

LinkedList

1.特点

是List接口的实现类,拥有List接口的所有特点

底层维护了一个链表结构,对于链表上的节点,有2个特殊位置,开头和结尾的元素的位置。

2.创建对象

LinkedList()

​ 构造一个空列表

3.常用方法

void**addFirst**(E e) 将指定元素插入此列表的开头。
void**addLast**(E e) 将指定元素添加到此列表的结尾。
E**element**() 获取但不移除此列表的头(第一个元素)。
E**getFirst**() 返回此列表的第一个元素。
E**getLast**() 返回此列表的最后一个元素。
E**removeFirst**() 移除并返回此列表的第一个元素。
E**removeLast**() 移除并返回此列表的最后一个元素。
boolean**offer**(E e) 将指定元素添加到此列表的末尾(最后一个元素)。
boolean**offerFirst**(E e) 在此列表的开头插入指定的元素。
boolean**offerLast**(E e) 在此列表末尾插入指定的元素。
E**peekFirst**() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null
E**peekLast**() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null
E**pollFirst**() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null
E**pollLast**() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null

ArrayList 和 LinkedList

ArrayList:

​ 底层是数组

​ 连续空间

​ 适合查询

LinkedList:

​ 底层是链表

​ 不连续

​ 适合增删

Set接口

1.概述

Set接口是Collection接口的子接口

能用父接口的所有方法

2.特点

无序

不重复

能存一个null

没下标

3.常用方法

继承自Collection接口的

HashSet

1.概述

是Set接口的实现类,拥有Set接口的所有特点和方法

HashSet底层维护的是一个 哈希表/散列表

常用来去重

2.创建对象

**HashSet**()

3.常用方法

略 同set

练习题

统计list集合中,元素出现的次数

    private static void count() {
        Random rd = new Random();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(rd.nextInt(5) + 1);
        }

        int one = 0;
        int two = 0;
        int three = 0;
        int four = 0;
        int five = 0;
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            Integer in = it.next();
            if (in == 1) {
                one++;
            } else if (in == 2) {
                two++;
            } else if (in == 3) {
                three++;
            } else if (in == 4) {
                four++;
            } else if (in == 5) {
                five++;
            }
        }
        System.out.println("1出现的次数是:" + one);
        System.out.println("2出现的次数是:" + two);
        System.out.println("3出现的次数是:" + three);
        System.out.println("4出现的次数是:" + four);
        System.out.println("5出现的次数是:" + five);

    }

向list添加随机数,但是不能重复

    private static void method() {
        List<Integer> list = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            int in = new Random().nextInt(10);
            if (!list.contains(in)) {
                list.add(in);
            }
        }
        System.out.println(list);

    }

    private static void setTest() {
        Random rd = new Random();
        HashSet<Integer> hs = new HashSet<>();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            hs.add(rd.nextInt(100) + 1);
        }
        list.addAll(hs);
        System.out.println(list.size());
        for (Integer it : list
        ) {
            System.out.println(it);
        }

    }

Map接口

1.概述

Map接口里的数据有格式上的要求,必须是以组键值对的形式。

Map<K,V>:K - 此映射所维护的键的类型(键) V - 映射值的类型(值)

K不能重复,V可以重复

2.特点

键不能重复

每个键只能映射一个值

数据无序

3.常用方法

V**put**(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。
void**clear**() 从此映射中移除所有映射关系(可选操作)。
boolean**containsKey**(Object key) 如果此映射包含指定键的映射关系,则返回 true
boolean**containsValue**(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true
boolean**equals**(Object o) 比较指定的对象与此映射是否相等。
V**get**(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
int**hashCode**() 返回此映射的哈希码值。
boolean**isEmpty**() 如果此映射未包含键-值映射关系,则返回 true
V**remove**(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int**size**() 返回此映射中的键-值映射关系数。
void**putAll**(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
Set<K>**keySet**() 返回此映射中包含的键的 Set 视图。
Collection<V>**values**() 返回此映射中包含的值的 Collection 视图。

4.迭代Map集合的方式

方式一:

Set<K> keySet()  ---把map里的key存入set

方式二:

Set<Map.Entry<K,V>> entrySet()---把map里的key和value存入到Entry对象中,通过Entry获得key和value

方式三:

Collection<V> values()----把map里的所有value获取出来,存入Collection

HashMap

1.创建对象

**HashMap**() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap

2.常用方法

同Map接口

3.原理

HashMap中存放数据时,拿着你的数据,开始计算存储位置(哈希算法)

开始存,

1.这个位置是空的,没存过数据,把数据存入数组

2.这个位置存过了,有数据了,就会形成链表结构(把新的数据挂在老数据下面)

3.最好把数据都放在数组节点上,如果链表太长,会影响查询效率

Collections集合的工具类

常用方法

static <T> boolean**addAll**(Collection<? super T> c, T... elements) 将所有指定元素添加到指定 collection 中。
tic <T extends Object & Comparable<? super T>> T**max**(Collection<? extends T> coll) 根据元素的自然顺序,返回给定 collection 的最大元素。
static <T> T**min**(Collection<? extends T> coll, Comparator<? super T> comp) 根据指定比较器产生的顺序,返回给定 collection 的最小元素。
static void**reverse**(List<?> list) 反转指定列表中元素的顺序。
static <T extends Comparable<? super T>> void**sort**(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。
static void**swap**(List<?> list, int i, int j) 在指定列表的指定位置处交换元素。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值