Java中的集合

一、集合体系结构  (单例集合)

1 、结构图

 2、集合的特点

List:系列集合:添加元素的时候是有序、可重复,有索引

这里所说的有序:是存储的顺序,和取出的顺序是一样的

可重复:存储可以重复存储相同的元素

索引:通过索引可以获取集合中的元素

Set系列集合:添加元素的时候是无序、不可重复,无索引

无序: Set集合中存储的顺序和获取顺序可能不想同的

不可重复:Set集合中不能存储相同的元素

无索引:Set集合中是不可以通过索引来获取Set集合中的元素

3、Conllection

        (1) Conllection是单列集合的顶层接口,他的功能是全部单例集合都可以继承使用的。

 4、Conllection的遍历

1.迭代器

(1)迭代器在遍历集合的时候是不依赖索引的

(2)迭代器的四个细节:

        a.如果当前位置没有元素,还要强行获取,则会报异常NoSushElementException

        b.迭代器遍历完毕的时候,指针不会复位

        c.循环体中只能用一个next

        d.迭代遍历的时候,不能使用集合中的方法进行增加删除

2.增强for遍历

(1)增强for的底层就是迭代器,为了简化迭代器的代码书写的

(2)他是JDK5之后出现的,其内部原理就是一个iterator迭代器

(3)所有的单例集合和数组才能用增强for来遍历

(4)修改增强for中的变量(第三方的变量),不会改变集合中原本的数据

3. Lambda表达式

(1)得意于jdk8开始的新技术Lambda表达式,提供一种更简单的更直接的遍历集合的方式

  default void forEach(Consumer<? super T> action)   结合Lambda遍历集合 

5、List集合特有的方法

1.Collction的方法List都继承了

2.List集合有索引,所以多了很多索引操作的方法。

 1.list遍历以及什么使用

(1)迭代器遍历 : 在遍历的过程中,需要删除元素,就可以用迭代器

//        (1)迭代器遍历
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }

(2)增强for遍历:如果我们就只是想遍历元素,则就可以使用增强for

(2)增强for遍历
//        下面的s变量,其实一个第三方的的变量而已,在循环过程中,一次表示集合中的每一个元素
        for (String s : list) {
            System.out.println("这是增强for");
//             s = "QQQ";
            System.out.println(s);
        }
        System.out.println(list);

(3)Lambda表达式遍历:如果我们就只是想遍历元素,则就可以使用增强for

     System.out.println(list);

//        (3)Lambda表达式遍历
        System.out.println("Lambda表达式遍历-------------");
        list.forEach(s->System.out.println(s));  //简写

(4)列表迭代器遍历:在遍历过程中,需要添加元素,就可以用列表迭代器遍历

//        获取列表迭代器对象,里面的指针默认也是指向0
//        额外的添加了功能,在遍历的过程中,可以添加元素
        System.out.println("-------这是列表迭代器遍历----------");
        ListIterator<String> listIterator = list.listIterator();
        while (listIterator.hasNext()){
            String next = listIterator.next();
            if (next.equals("bbb")){
                listIterator.add("QQQ");
            }
            System.out.println(next);
        }
        System.out.println(list);

(5)普通for循环遍历(因为fList集合存在索引):如果遍历的时候想操作索引,可以用普通for遍历


//        普通for循环
        System.out.println("-------普通for遍历---------");
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }

6.数据结构

1.数据结构的特点

        数据结构是计算机底层的存储、组织数据的方式

        是指数据相互之间是以什么方式排列在一起的

        数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择

2.数据结构(栈)

        特点:先进后出,后进先出

3.数据结构(队列)

        特点:先进先出,后进后出

4.数据结构(数组)

        1.查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同(元素在内存中是连续存储的)

        2.删除效率低:要将元数据删除,同时后面的元素都要向前面移动

        3。添加效率低:添加的位置后面的元素都要向后移动,在添加元素

5.数据结构(链表)

       单列链表: 链表中的每一个节点是独立的对象,在内存中不是连续的,每一个节点包含数据值和下一个节点的地址

        链表的查询速度慢:无论查询哪个数据都要从头开始找

        链表的增加和删除效率高

        有单列链表和双列链表

双列链表:如果查询时,他会先判断是离头近还是离尾近,那边近就从那边开始查找

7.ArraryList集合底层原理

1.ArraryList的底层结构是数组,数组的默认长度为10

2.当数组添加满了后,会自动扩容为1.5倍

3.ArraryList底层扩容的原理

        (1)利用空参创建的集合,在底层会创建默认长度为0的数组

        (2)添加第一个元素时,在底层会创建一个新的长度为10的数组

        (3)存满时,会扩容1.5倍

        (4)如果一次添加多个元素,1.5倍还放不下,则会创建新的数组的长度为实际的长度

4.LinkedList集合

        (1)底层数据结构是双链表,查询慢,增删块,但是如果操作的是首尾元素,速度也是极快的

        (2)LinkedList本身多了很多直接操作首尾元素的特有的API

                

 

8.泛型

1.泛型:是jdk5中映入的特性,可以在编译阶段约束操作的数据类型,并进行检查

2.泛型的格式:<数据类型>

3.泛型的好处:

(1)统一数据类型

(2)把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现问题,因为在编译阶段类型就确定下来了

8.泛型类

1.使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

2.格式:修饰符  class 类名<类型> {}

举例

public class ArraryList<E>{
}

3.此处的E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型,可以写:E F K V 等

4.泛型的细节:

泛型中不能写基本数据类型,指定泛型具体类型后,专递数据时,可以传入该类型和其他的子类类型,如果不写泛型,类型默认是Object

9.哪里定义泛型

泛型类:在类名后面定义泛型,创建该类对象的时候,确类型

泛型方法:在修饰符后面定义,调用该方法时候,确定该类型

泛型接口:在接口后面定义泛型,实现该类确定类型,实现类延续泛型

10.泛型的继承和通配符

泛型不具备继承性,但是数据具有继承性

泛型通配符:?

? extend E

? super E

11.使用场景

1.定义类,方法,接口的时候,不知道类型确定,就可以定义泛型

2.如果类型不确定,但知道能知道是哪个继承体系中,可以使用泛型的通配符

12 .Set集合

1.set集合添加无序,不可重复,无索引

13.Set集合的实现类

1.HashSet:无序,不可重复,无索引

2.LinkedHashSet: 有序,不可重复,无索引

3.TreeSet;可排序,不可重复,无索引

14.HashSet底层原理

HashSet集合底层采取哈希表存储数据

哈希表对应增删改查的数据性能都比较好的结构

哈希表的组成:

jdk8之前:数组+链表

jdk8开始:数组+链表+红黑树

二、双例集

1.双例集合特性

(1)双列集合一次需要存一对数据,分别是键和值

(2)键不能重复,值可以重复

(3)键和值是一 一对应的,每一个键只能找到自己对应的值

(4)键+值这个整体我们称为“键值对”或者 “键值对对象”,在java中叫做“Entry对象”

2.Map的常见的API

map是双列集合的顶层接口,他的功能是全部双列集合都可以继承使用的。

 3.HashMap集合的特点

(1)HashMap是Map里的一个实现类,

(2)没有额外需要学习的特有的方法,直接使用Map里面的方法就可以 了

(3)特点都是有键决定:无序,不重复,无索引

(4)hashMap()底层是哈希表结构

(5)依赖于hashCode方法和equals方法保证键的唯一

(6)如果键存储的对象是自定义的,需要重写hashCode方法和equals方法,如存储值是自定义对象,不需要重写hashCode和equals()方法

4.linkedHashMap

        (1)有序,不可重复,无索引

        (2)底层原理:底层数据结构依然是哈希表,只是每个键值对元素额外的多了一个双链表的机制记录存储的顺序

5.TreeMap

        (1)TreeMap跟TreeSet底层原理一样,都是红黑树结构的

     (2)由键决定特性:不重复,无索引,可排序

        (3)默认按照键的从小到大排序,也可以自己规定键的排序规则

排序有两种规则

(1)实现Comparable接口,指定比较规则

(2)创建集合时传递Comparator比较器对象,指定比较规则

(3)可排序:他是按照键来排序的,默认从小到大,Iterget ,从小到大,String类型,按照ASCII码表中对应的数字进行升序

6.Colletions

   (1)java.util.Colltions:是集合的工具类、

(2)作用:Colletions不是集合,而是集合的工具类

  (3)Colletions常用的API

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值