容器类笔记(上)

本文主要介绍了Java中的容器类,包括ArrayList、Vector和LinkedList的特点和使用场景。ArrayList基于动态数组,适合随机访问但插入和删除效率较低;Vector是线程安全的,但在非多线程环境下推荐使用ArrayList;LinkedList则采用双向链表实现,插入和删除高效,但随机访问速度慢。此外,还提及了容器接口层次结构以及遍历集合的几种方式。
摘要由CSDN通过智能技术生成

 

1.容器|集合

概念:存储多个数据(任意引用类型数据)

集合的长度可变,可以根据需求动态的增删数据,长度随之改变

*数组的特点

1.引用数据类型

2.定长(长度一旦确定不可以改变)

3.存储数据的类型相同

4.有序,有索引

简单封装容器类型(ArrayList)

MyContainer只能存储字符串数据 String[]elementData;


2.容器中的接口层次结构

Collection:单个值的集合

    Set:无序不可重复

    List:有序可重复|有索引

Map:键值对的集合(Key——VALUE)

 Collection  集合层次结构中的根接口

遍历方式:

1.普通for循坏:利用List有下标的特点,依次获取每一个元素

2.增强for循环:依次获取集合中每一个元素存入临时变量中

       for(String temp:list ){

             Systom.out.printIn(temp);   

    }

3.iterator迭代器

所有实现Collection接口的容器类都有一个iterator方法用于返回一个实现了Iterator接口的对象

Iterator对象称为迭代器,用于方便的实现对容器内元素的遍历操作

步骤:

(1)获取迭代器实例用来遍历指定集合

    Iterator it=collection.iterator();

(2)判断是否存在下一个数据

    while(it.hasNext()){

     }

(3)获取下一个数据


3.List

list:有序集合(又称为序列)|有序可重复

该接口的用户可以精准控制列表中每个元素的插入位置

遍历方式:

1. for普通for循环
2. foreach 增强for循环
3.iterator迭代器


4.ArrayList|Vector|LinkedList

ArrayList:动态数组;实际上就是用数组实现的  

ArrayList是一个简单的数据结构,因超出容量会自动扩容,可认为它是常说的动态数组。

        实现所有可选列表操作,并非所有元素,包括null

        底层结构:数组 Object[ ] elementData

        特点:根据索引查询遍历效率高|增删效率低

        应用场景:初始容量(默认为10),在第一次添加add时进行构建

                          private static final int DEFAULT_CAPACITY = 10;

                           扩容机制:每次扩原容量的1.5倍

                            int newCapacity = oldCapacity + (oldCapacity >> 1);

        新增功能: void forEach(Consumer<? super E> action)     

       遍历 :
            普通for
            增强for
            iterator迭代器
            listIterator迭代器

                 listIterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问,尽管Iterator只能向前移动,但是ListIterator可以双向移动,它还可以产生相对于迭代器在列表指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素. 你可以通过ListIterator()方法产生一个指向List开始处的ListIteraor,并且还可以通过调用ListIterator(n)方法创建一个一开始就指向索引列表n的元素处的ListIterator

ArrayList特点:

1.随机访问速度快,插入和移除性能较差(数组的特点);

2.支持null元素;

3.有顺序;

4.元素可以重复;

5.线程不安全;

vector:某一时刻只有一个线程能够写Vector

           底层结构:数组

            特点:和ArrayList一样

            区别:1.Vector是同步的|线程安全   

                           ArrayList不同步|线程不安全

                        2.Vector每次扩容到原容量的2倍

                            ArrayList 每次扩容到原容量的1.5倍 相对ArrayList 更有利于节省内存

如果不需要线程安全实现,建议使用ArrayList代替Vector

LinkedList: 实现所有可选列表操作,并允许所有元素(包括null )。

LinkList以双向链表实现,链表无容量限制,但双向链表本身使用了更多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。允许元素为null,线程不安全。

定义链表结构,存储javabean类型的数据,测试使用,遍历使用
        存储javabean类型数据时候,要求javabean类型重写equals方法,否则使用一些判断比较的方法时候回默认调用equals方法


4.Set

Set:无序的不可以重复的|去重

无序:存放顺序和内部真实的存储顺序是不一致的

去重:集合中不可能存在e1.equals(e2)

 遍历方式:
            foreach
            iterator迭代器

TreeSet():作用是提供有序的Set集合

        1.底层结构:红黑树

        2.查询效率高,自动把数据做成升序排序

        3.底层是由TreeMap维护的

        4.遍历方法:1.foreach    2.iterator迭代器

TreeMap的实现是红黑树算法的实现

红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树

1.二叉树他们都需要满足一个基本性质--即树中的任何节点的值大于它的左子节点,且小于它的右子节点。按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低。

2.平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近

1、每个节点都只能是红色或者黑色

2、根节点是黑色

3、每个叶节点(NIL节点,空节点)是黑色的。

4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。

5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

 TreeSet需要存储相同类型的数据,因为会默认存在比较排序
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值