Java集合笔记

1.概述

1.1引入集合

目前程序中,如果出现了多个数据需要存储,解决方案就是数组,但是数组的缺点却很明显:

– 长度固定,数组一旦创建长度不可改变

– 数组里元素的类型太单调,都是不统一的

– 数组的遍历方式太单一,用下标遍历

– 如果有大量的数据需要存储,可以使用集合

– 集合工具类,都在java.util.*包里

1.2继承结构

– Collection是顶级接口

​ – List接口:

​ --ArrayList实现类

​ --LinkedList实现类

​ – Set接口:

​ – HashSet实现类

​ – TreeSet实现类

– Map接口

2.Collection

2.1介绍

– Collection层次结构中的根接口,Collction表示一组对象,这些对象也称为collection的元素。一些collection允许有重复的元素,而另一些则不允许。一些collection是有序的,而另一些则是无序的。

2.2方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZ38Asfx-1598109912072)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816140144989.png)]

2.3TestCollection

//测试 集合
public class TestCollection {
    public static void main(String[] args) {
        //1,创建对象
        Collection<Integer> c = new ArrayList<>();
        //2,常用方法
        c.add(1);
        c.add(2);
        c.add(3);
        c.add(5);
        c.add(4);
        //		c.clear();//清空集合
        System.out.println(c.contains(1) );//判断是否包含指定元素
        System.out.println(c.equals(1) );//判断集合是否和指定元素相等
        System.out.println(c.hashCode() );//获取集合在内存中的哈希码值
        System.out.println(c.isEmpty() );//判断集合是否为空
        System.out.println(c.remove(2) );//移除指定元素,返回布尔值
        System.out.println(c.size() );//获取集合的长度
        Object[] os = c.toArray() ;//把元素存入数组
        //[1, 3, 5, 4]
        System.out.println( Arrays.toString(os) );
        //----------集合间的操作
        Collection<Integer> c2 = new ArrayList<>();
        c2.add(1);
        c2.add(2);
        c2.add(3);
        System.out.println( c.addAll(c2) );//把c2添加到c里面 1354123
        System.out.println( c.containsAll(c2) );//判断c中是否包含c2
        //System.out.println( c.removeAll(c2) );//删除交集元素
        System.out.println( c.retainAll(c2) );//取差集 13123 
        System.out.println(c);
        //TODO 迭代/循环/遍历  集合
        //		Iterator<E> iterator()  --返回可以迭代集合的迭代器
        Iterator<Integer> it = c.iterator() ;
        while( it.hasNext() ) {//判断集合中是否有下一个元素,有就返回true
            Integer in = it.next() ;//获取下一个元素
            System.out.println(in);
        }
    }
}

运行结果:
true
false
29615296
false
true
4
[1, 3, 5, 4]
true
true
true
[1, 3, 1, 2, 3]
1
3
1
2
3

3.List

3.1List接口

3.1.1介绍

有序的collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确的控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与set不同,列表通常允许重复的元素。列表本身允许null元素,通常它们允许多个null元素

3.1.2特点

– 元素有序

– 元素有下标

– 允许重复元素

– 可以存null元素

3.1.3常用方法

1.从超级接口Collection中继承来的

2.特有方法

void add(int index, E element) 
	在列表的指定位置插入指定元素(可选操作)。 
boolean addAll(int index, Collection<? extends E> c) 
    将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 
E get(int index) 
	返回列表中指定位置的元素。 
int indexOf(Object o) 
	返回此列表中第一次出现的指定元素的索引; 
int lastIndexOf(Object o) 
	返回此列表中最后出现的指定元素的索引 
ListIterator<E> listIterator() 
	返回此列表元素的列表迭代器(按适当顺序)。 
E remove(int index) 
	移除列表中指定位置的元素(可选操作)。 
E set(int index, E element) 
	用指定元素替换列表中指定位置的元素(可选操作)。 返回以前在指定位置的元素 
List<E> subList(int fromIndex, int toIndex) 
	返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分
3.1.4TestList
//测试 List接口
public class TestList {
    public static void main(String[] args) {
        //1,创建对象
        List<String> list = new ArrayList<>() ;

        //2,常用方法
        //TODO --继承自Collection接口的方法
        list.add("xiongda");
        list.add("xionger");
        list.add("guangtq");
        list.add(null);

        list.add("xiongda");
        list.add("xionger");
        //List特点:元素有序+元素可以重复+可以存null+元素都有下标
        System.out.println(list);
        //----List接口的特有方法们---都是根据下标操作数据的方式
        list.add(2,"美队") ;//在指定下标处,插入指定的元素
        System.out.println(list);
        System.out.println(list.get(2));//根据下标获取元素
        //获取指定元素第一次出现的索引值
        System.out.println( list.indexOf("xiongda") );
        //获取指定元素最后一次出现的索引值
        System.out.println( list.lastIndexOf("xiongda") );
        System.out.println( list.remove(2) );//按照索引删除元素并返回被删除的元素是谁
        System.out.println( list.set(1, "皮皮霞"));//把指定索引对应的值替换掉
        //截取前:[xiongda, 皮皮霞, guangtq, null, xiongda, xionger]
        List<String> list2 = list.subList(2, 4);//[2,4)含头不含尾的截取子List
        System.out.println(list2);//截取前:[guangtq, null]

        //TODO 迭代List接口的方式:
        //Iterator<E> iterator()
        Iterator<String> it = list.iterator() ;
        while(it.hasNext()) {//判断有下一个元素吗
            String s = it.next() ;//获取下一个元素
            System.out.println(s);
        }
        //Iterator<E> iterator()  --继承自Collection--返回父接口--向后遍历
        //ListIterator<E> listIterator() --子接口List--返回子接口--向后遍历/逆向遍历
        ListIterator<String> it2 = list.listIterator() ;
        while(it2.hasNext()) {//判断有下一个元素吗
            String s = it2.next() ;//获取下一个元素
            System.out.println(s);
        }
        //for循环
        for(int i = 0 ; i < list.size() ; i++) {
            System.out.println( list.get(i) );
        }
        //增强for/foreach -- for(数据的类型   变量名 : 要遍历的数据 ){  }
        for(String s : list) {
            System.out.println(s);
        }
    }
}

//运行结果:(除去最后四种遍历)
[xiongda, xionger, guangtq, null, xiongda, xionger]
[xiongda, xionger, 美队, guangtq, null, xiongda, xionger]
美队
0
5
美队
xionger
[guangtq, null]

3.2ArrayList实现类

3.2.1介绍

– List接口的大小可变数组的实现。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小

3.2.2特点

– 元素有下标

– 元素可重复

– 元素有序

– 底层是一个数组,方便查询

3.2.3常用方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6EgWnRr-1598109912082)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816160421754.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvqYgdtn-1598109912085)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816160502166.png)]

3.2.4创建对象
new ArrayList();//构造一个初始容量为10的空列表,返回类型ArrayList,即ArrayList<> list = new ArrayList<>(); <>为泛型

3.2.5TestArrayList
//测试 ArrayList
public class TestArrayList {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);
        list.add("aaa");
        list.add("nnn");
        list.add("ttt");
        list.add("jjj");
        list.add("kkk");
        list.add("qqq");
        list.add("ccc");
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");
        list.add("hhh");
        list.add("yyy");
        System.out.println(list.size());
        System.out.println(list);
        System.out.println(list.get(0));
        System.out.println(list.get(list.size()-1));
        System.out.println(list.remove(5));
        System.out.println(list);
        System.out.println(list.remove("aaa"));
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //迭代器遍历
        for (Iterator it = list.iterator(); it.hasNext();) {
            String s = (String) it.next();
            System.out.println(s);
        }
        //foreach 简化的迭代器遍历
        for (String s : list) {
            System.out.println(s);
        }
    }
}

//运行结果:(除去遍历)
[]
12
[aaa, nnn, ttt, jjj, kkk, qqq, ccc, aaa, aaa, aaa, hhh, yyy]
aaa
yyy
qqq
[aaa, nnn, ttt, jjj, kkk, ccc, aaa, aaa, aaa, hhh, yyy]
true
[nnn, ttt, jjj, kkk, ccc, aaa, aaa, aaa, hhh, yyy]

3.3LinkedList实现类

3.3.1介绍

– 是List接口的链接列表实现

3.3.2特点

– 元素有下标

– 元素可重复

– 元素有序

– 底层是链表结构

3.3.3常用方法

1.继承自Collection的方法

2.继承自List的方法

3.自己特有的方法

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0ExAFeI-1598109912093)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816160839414.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2ITu9at-1598109912168)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816160904770.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qktV4fnp-1598109912170)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816160938164.png)]

3.3.4创建对象
LinkedList<> list = new LinkedList<>();//创建一个空列表
3.3.5TestLinkedList
//测试 LinkedList
public class TestLinkedList {
    public static void main(String[] args) {
        //1,创建对象--底层是链表结构
        LinkedList<Integer> list = new LinkedList<>();
        //2,常用方法
        //TODO 继承自List接口的方法
        //TODO 继承自Collection接口的方法
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);
        //--实现类自己的特有方法--针对首尾元素进行操作
        list.addFirst(99);//添加首元素
        list.addLast(100);//添加尾元素
        System.out.println(list);//[99, 1, 2, 3, 100]
        System.out.println( list.getFirst());//获取首元素
        System.out.println( list.getLast());//获取尾元素

        System.out.println( list.removeFirst());//移除首元素
        System.out.println( list.removeLast());//移除尾元素
        System.out.println(list);//[1, 2, 3]

        System.out.println(list.offer(50));//在末尾添加元素
        System.out.println(list);
        System.out.println(list.offerLast(51));//在末尾添加元素
        System.out.println(list);
        System.out.println(list.offerFirst(52));//在末尾添加元素
        System.out.println(list);
    }
}

//运行结果:
[1, 2, 3]
[99, 1, 2, 3, 100]
99
100
99
100
[1, 2, 3]
true
[1, 2, 3, 50]
true
[1, 2, 3, 50, 51]
true
[52, 1, 2, 3, 50, 51]

4.Set

4.1Set接口

4.1.1介绍

– 一个不包含重复元素的Collection,最多包含一个null元素

4.1.2特点

– 元素无序

– 元素没有下标

– 元素不能重复

4.1.3方法

全都是继承自Collection的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HD4Tr8UK-1598109912173)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816165329440.png)]

4.1.4TestSet
//测试 Set接口
public class TestSet {
    public static void main(String[] args) {
        //1,创建对象 -- set通常用来给数据去重!!!
        Set<String> set = new HashSet<>();
        //TODO 2,常用方法
        //全都是 继承自Collection接口的方法
        set.add("2a");
        set.add("1b");
        set.add("d");
        set.add("c");
        set.add("jack");
        set.add(null);

        set.add("2a");
        set.add("1b");
        set.add("d");
        //set是无序的+可以添加一个null+元素不能重复!!!
        System.out.println(set);
        //迭代set集合里的元素
        //方式1:Iterator<E> iterator()
        Iterator<String> it = set.iterator() ;
        while(it.hasNext()) {//判断,有元素就返回true
            String s = it.next() ;//获取元素
            System.out.println(s);
        }
        //方式2:foreach
        for(String s : set) {
            System.out.println(s);
        }
    }
}

//运行结果:
[null, 1b, c, d, jack, 2a]
null
1b
c
d
jack
2a
null
1b
c
d
jack
2a

4.2HashSet

4.2.1介绍

– 此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。他不保证set的迭代顺序。

– 通过hashCode()计算出元素的存储位置,并将这些元素正确地分布在桶中。对此set进行迭代所需的时间与HashSet的实例的大小(元素数量)和底层HashMap实例(桶的数量)的“容量”的和成正比。因此,如果迭代性能很重要,则不要将初始容量设置太高(或将加载因子设置的太低)

4.2.2特点

– 元素没有下标

– 元素不能重复

– 元素无序

– 底层是哈希表/散列表

4.2.3创建对象
HashSet<> set = new HashSet<>();
//创建一个空的set,其底层HashMap实例的默认初始容量是16,加载因子是0.75
4.2.4方法

继承自Set接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGnvtZRU-1598109912178)(C:\Users\徐茂鑫\AppData\Roaming\Typora\typora-user-images\image-20200816171406490.png)]

4.2.5TestHashSet
//测试 HashSet
public class TestHashSet {
    public static void main(String[] args) {
        //TODO 1,创建对象--桶--性能:初始值+加载因子
        //我们创建的是HashSet对象,但是底层实际上是创建了一个HashMap对象
        HashSet<Double> set = new HashSet<>();

        //TODO 2,常用方法
        //我们是向HashSet中添加数据,但是底层实际上是向HashMap中添加的
        set.add(1.1);
        set.isEmpty();//判断是否为空 false
        set.add(2.0);
        set.add(1.5);
        set.add(2.5);
        System.out.println(set);
        System.out.println(set.size());//大小
        Object set2 = set.clone();
        System.out.println(set2);
        set.clear();
        System.out.println(set);
    }
}

//运行结果:
[2.0, 2.5, 1.5, 1.1]
4
[2.0, 1.5, 1.1, 2.5]
[]

5.Map

5.1Map接口

5.1.1介绍

– 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

– Map接口提供三种collection视图,允许以键集、值集或键值映射关系集的形式查看某个映射的内容。映射顺序定义为迭代器在映射的collection视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如TreeMap类;另一些映射实现则不保证顺序,如HashMap类

5.1.2特点

– 每个键对应一个值

– 其中键不能重复

– 存的数据是键值对格式

– HashMap是无序的,TreeMap是有序的

5.1.3创建对象

接口无法创建对象,只能创建实现类对象

6.Collections工具类

6.1介绍

– 提供了大量的针对collection集合的静态方法

6.2常用方法

static <T> boolean addAll(Collection<? super T> c, T... elements) 
	将所有指定元素添加到指定 collection 中。 
static T  max(Collection<? extends T> coll) 
	根据元素的自然顺序,返回给定 collection 的最大元素。 
static T  min(Collection<? extends T> coll) 
	根据元素的自然顺序 返回给定 collection 的最小元素。 
static void reverse(List<?> list) 
	反转指定列表中元素的顺序。 
static void  sort(List<T> list) 
	根据元素的自然顺序 对指定列表按升序进行排序。 
static void swap(List<?> list, int i, int j) 
	在指定列表的指定位置处交换元素。

6.3TestCollections

//测试 集合工具类Collections
public class TestCollections {
    public static void main(String[] args) {
        //TODO 创建List集合,并添加元素
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(7);
        list.add(9);
        list.add(3);
        System.out.println(list);//[1, 7, 9, 3]

        //static <T> boolean addAll(Collection<? super T> c, T... elements)
        Collections.addAll(list, 2,4,6,8);//向指定集合中,一次性添加多个数据
        System.out.println(list);//[1, 7, 9, 3, 2, 4, 6, 8]

        //static T  max(Collection<? extends T> coll)
        //获取list集合里的最大值
        System.out.println( Collections.max(list) );

        //static T  min(Collection<? extends T> coll)
        //获取list集合里的最小值
        System.out.println( Collections.min(list) );

        //static void reverse(List<?> list)
        Collections.reverse(list);//指定的list集合中的数据进行反转
        System.out.println(list);//[8, 6, 4, 2, 3, 9, 7, 1]

        //static void  sort(List<T> list)
        Collections.sort(list);//指定的list集合中的数据进行排序
        System.out.println(list);//[1, 2, 3, 4, 6, 7, 8, 9]

        //static void swap(List<?> list, int i, int j)
        Collections.swap(list, 1, 6);//把list中,指定下标的两个元素进行位置交换
        System.out.println(list);//[1, 8, 3, 4, 6, 7, 2, 9]
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值