java集合

集合分类

Collection集合

单列集合, 直接存储对象的引用

Map集合

双列集合, 使用key-value的形式, 每个元素会有一个唯一的名称

List  集合中的元素是有序的,可以存放重复元素

Queue 队列, 除优先级外, 保持先进先出的原则(基本不用)

Set 集合中的元素是无序的, 不能存放重复的元素

List集合

定义

List集合是有序的,可以储存重复的数据

List集合通过记录元素在集合中的位置来准确的查找元素

List集合体系

ArrayList    底层使用数组(线程不安全)

LinkedList    底层使用链表

Vector    底层使用数组(线程安全的,不推荐使用)

ArrayList集合

1 、定义

低层使用的是数组, 所以其特性非常接近于数组

储存的元素是有序的,而且可以重复存储, 通过数组角标来查询更改元素,速度非常快

由于每次增删都要改动数组中的角标,所有导致增删效率低下

2、ArrayList的增删改查原理

ArrayList 集合初始化会有一个默认长度是10的数组, 内部还有一个记录当前元素个数的变量, 当储存的元素个数超过数组长度之后,容量就会扩充一半 

当我们去查询集合中的元素时, 需要提供给集合一个角标值, 然后通过这个角标值查找集合中的元素

当我们去删除一个元素的时候, 集合就会根据角标删除这个元素,并且改动其他元素的位置,这就是导致增删缓慢的原因

其实如果我们是连续往集合尾部插入数据的话, 速度其实是非常快的, 因为其他元素的位置不需要改动,但是如果我们插入数据的位置是数组的前面或者中间,速度就会有明显的降低

3、构造方法

ArrayList()    构造一个初始化容量为10的空列表

ArrayList(Collection  e)    构造一个包含执行集合元素的列表

ArrayList(int initialCapacity)    构造一个具有指定初始容量的空列表

4、常用方法

boolean add(E e)    将指定的元素添加到此列表的尾部

void add(int index,E element)    将指定的元素插入此列表中的指定位置

boolean contains(Object o)    如果此列表中包含指定的元素,则返回true

E get(int index)    通过角标查找元素

int indexOf(Object o)    返回此列表中首次出现的指定元素的索引, 或如果没有则返回 -1

int lastIndexOf(Object o)  返回此列表中最后一次出现的指定元素的索引(从后先前查)没有返回-1

boolean remove(Object o)    移除此列表中首次出现的指定元素(如果存在)

E set(int index , E element)    用指定元素替代此列表中指定位置上的元素,返回原来的元素

int size()    返回此列表中的元素数

LinkedList集合

1、定义

底层使用的是链表,就好像一条锁链

这个集合中的每个元素都被封装到一个叫Node的内部类中, 然后记录上一个元素和下一个元素的地址,通过手拉手形成一个链条

增删快, 查询慢

2、增删改查的原理

当需要去查询LinkedList集合中的元素时,需要从最开始的元素查找起,然后一层一层往后找,直到找到该元素,这样的动作十分消耗性能

当需要去删除元素的时候, 我们只需要将被删除元素两端的元素重新连接到一起,或者新增的时候将新元素和左右两边的元素连起来就可以了

3、构造方法

LinkedList()    构造一个空列表

LinkedList(Collection e)    构造一个包含指定collection中元素的列表

4、常用方法

E remove()    获取并移除此列表的头

E poll() 获取并移除此列表的头

E peek() 获取但不移除此列表的头

ArrayList, LinkedList 及Vector集合之间的区别

1、线程安全

Vector : 线程安全

ArrayList, LinkedList : 线程不安全

2、实现方式

LinkedList : 链表

ArrayList,Vector : 数组

3、扩容

ArrayList和Vector使用数组实现, 当数组长度不够,内部会创建一个更大的数组

LinkedList 不存在这方面的问题

4、速度

ArrayList 查改块, 增删慢

LinkedList 查改慢, 增删快

总结

StringBuffer和StringBuilder

高级的字符串, 可以变长度的字符序列

StringBuffer安全效率低, StringBuilder不安全,效率高

包装类

八个基本数据类型的包装类

自动装箱和自动拆箱

每个包装类中都有一个可以将字符串转成基本数据类型的方法 xxx.parseXXX();

Random

生成随机数

nextInt()

nextInt(int num)

生成一个a - b(包含a,不包含b的随机数) nextInt(b-a)+a;

生成一个a - b(包含a,包含b的随机数) nextInt(b-a+1)+a;

集合

ArrayList 底层数组  增删慢  查改块

LinkedList底层链表  增删块 查改慢

这里的增指的是 插入 , 实际上如果是尾部添加, ArrayList反而更块




Set集合

定义

Set集合存数的元素是无序的, 而且不允许储存重复的元素, 每当有新的元素存入的时候,Set集合会先去过滤, 如果发现和集合中现有元素出现重复, 就不在允许添加

应用场景

当我们不想让集合中出现重复的元素时,使用Set集合

当我们需要排除重复数据时,使用Set集合

HashSet

定义

HashSet集合中的元素是通过hash值来比较是否相同

集合通过元素的hashCode和equals方法来比较两个元素是否相同, 不同就存入, 相同不存入

元素存入的位置未知,和存入的顺序无关

存储原理

HashSet最后还是存入数组中, 只是根据元素的Hash值来确定存入的角标位置

元素的hash值 ^ (元素的hash值 >>> 16) & (数组的长度-1)

HashSet中不是直接存入我们给定的元素, 而是用集合中的一个内部类封装我们存入的元素,所以当我们存入null的时候,不会因为和数组中角标位上默认值null起冲突

如果两个不同的元素根据不同的Hash值计算出了同一个角标值,那么都能存进去

构造方法

HashSet()    构造出一个新的集合, 底层数组默认的初始容量是16(扩容一倍),加载因子是0.75

加载因子: 集合中的数组可用的

角标值得可选范围越小,计算出重复角标值得概率就越高

HashSet(Collection c) 构造一个包含指定collection中元素的新set 

常用方法

boolean add( E e)    如果此set集合中尚未包含指定元素,则添加指定元素

boolean remove(Object o)    移除某个元素 []

int size()    获取集合的长度

TreeSet集合

定义

TreeSet是一种顺序的集合, 记住, 这里的顺序是指集合中的元素有顺序, 她是通过比较元素的大小来存放的, 大的存右边,小的存左边

存入的元素必须实现Comparable接口,并且重写comparTo方法

最后存入的元素会形成一个树状结构

构造方法

TreeSet()    构造一个新的空set, 该set根据其元素的自然顺序进行排序

TreeSet(Comparator comparator)  构建一个空的TreeSet, 他根据指定比较器进行排序

常用方法

add(E e)    将指定元素添加到此set

first()    返回此set中当前第一元素

last()    返回此set中当前最后一个元素

floor()    返回此set中小于等于给定元素的最大元素,不存在则返回null

higher()    返回此set中严格大于给定元素的最小元素,不存在则返回null

总结:

ArrayList集合的嵌套

类似于二维数组

Set

去重

无序(集合无序)

HashSet

去重效率高, 尤其是在大数据量下

调用元素的hashCode和equals方法来比较是否相同

LinkedHashSet

即有序(集合有序), 又能去重

效率不高

TreeSet

去重, 元素有序(对存入的元素进行排序)

要求存入的元素必须具备比较的能力或者提供第三方的比较器

元素具备比较的能力 : 元素实现comperable接口, 重写comparTo方法

第三方比较器: 定义类,实现Compartor接口, 从写  compare方法

超级for

迭代器的简写形式

优点: 格式简单

缺点: 无法进行删除操作

Collections

一个用来操作List集合的工具类总结:

ArrayList集合的嵌套

类似于二维数组

Set

去重

无序(集合无序)

HashSet

去重效率高, 尤其是在大数据量下

调用元素的hashCode和equals方法来比较是否相同

LinkedHashSet

即有序(集合有序), 又能去重

效率不高

TreeSet

去重, 元素有序(对存入的元素进行排序)

要求存入的元素必须具备比较的能力或者提供第三方的比较器

元素具备比较的能力 : 元素实现comperable接口, 重写comparTo方法

第三方比较器: 定义类,实现Compartor接口, 从写  compare方法

超级for

迭代器的简写形式

优点: 格式简单

缺点: 无法进行删除操作

Collections

一个用来操作List集合的工具



Map集合

定义

Map集合是一个双列集合,以键值对的形式存在

将键和值捆绑到一起存放(Map.Entry)

一个映射不能包含重复的键

如果出现相同的键,会用新的值覆盖老的值

每个键最多只能映射到一个值

Map接口和Collection接口的不同

Map是双列的,Collection是单列的

Map集合的数据结构针对键有效, 跟值无关, Collection 集合的数据结构是针对元素有效

常用功能

添加方法

V put(K key , V value): 添加元素

如果键是第一次存储, 直接存储元素,返回null

如果键不是第一个存在, 就用值把以前的值替换掉,返回以前的值

删除方法

void clear() : 移除所有的键值对元素

V remove(Object key) : 根据键删除键值对元素, 并把值返回

判断方法

boolean containsKey(Object key) :  判断集合是否包含指定的键

boolean containsValue(Object value): 判断集合是否包含指定的值

boolean isEmpty: 判断集合是否为空

获取方法

Set> entrySet() : 获取所有的键值对

V get(Object key) : 根据键获取值

Set keySet() : 获取集合中所有键的集合

Collection values() :  获取集合中所有值的集合

int size() : 返回集合中键值对的个数

HashMap

定义

底层使用的是数组

HashMap就是通过我们存入的key获取到一个hash值, 经过计算之后, 获取到一个数组角标, 然后将key和value封装到一个Entry里面, 然后存入数组

当数组容量不够的时候, 会自动扩容一倍

构造方法

HashMap()

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

HashMap(int initialCapacity)

构造一个带指定初始容量和默认加载因子 (0.75) 的空HashMap

HashMap(int initialCapacity, float loadFactor)

构造一个带指定初始容量和加载因子的空HashMap

HashMap(Map m)

构造一个映射关系与制定Map相同的新HashMap

常用方法

put(K key, V value) : 在此映射中关联指定值与指定键

putAll(Map m) : 将另外一个map集合复制到此集合中

TreeMap

定义

TreeMap通过比较元素的大小,对元素进行排序, 最后形成了一个树状结构

TreeMap中的key需要实现Comparable接口并重写compareTo方法, 或者使用Comparator比较器

存入元素的时候,如果会将新添加的元素的key和集合中已经存在的元素的key比较,返回一个小于0的数,说明,新添加的元素小于已有元素, 如果返回的是一个等于0的数,说明新添加的元素等于已有元素, value覆盖, 如果返回一个大于0的数,说明新添加的元素大于已有元素

public static void main(String[] args) {

Map map2 = new TreeMap<>();

map2.put("小红", "美女"); map2.put("小红", "老板的小舅子");

System.out.println(map2);

}

泛型

定义

泛型, 即"参数化类型" , 泛型规定了类可以使用的应用数据的类型的范围

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)

只在编译期生效

泛型的好处

提高安全性(将运行期的错误转换到编译期)

省去强转的麻烦

在其作用域内可以统一参数类型

泛型的基本使用

<>中放的必须是引用数据类型

泛型可以定义来类上和方法上

泛型使用注意事项

前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型) 

泛型的由来

类型通过Object 转型问题引入

早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

泛型的使用

把泛型定义在类上

格式

public class 类名<泛型类型1,…>

注意事项

泛型类型必须是引用类型

演示

publicclassGeneric{

    privateTt;

    publicObjectgetObject() {

        returnt;

    }

    publicvoidsetObject(Tt) {

        this.t=t;

    }

}

把泛型定义在方法上

格式

public <泛型类型> 返回类型 方法名(泛型类型 变量名)

演示

publicEmethod(E[]e){

    return e[e.length/2];

}


通配符(了解)

泛型通配符

任意类型,如果没有明确,那么就是Object以及任意的Java类了

publicstaticvoidmain(String[]args) {

    ArrayListarrayList1=newArrayList<>();

    ArrayListarrayList2=newArrayList<>();

    Listlist=arrayList1;

    list=arrayList2;

}

? extends E

向下限定 E 及E的子类

? super E

向上限定 E及其父类

总结

Map集合

    双列集合 一次性存两个值(key-value)

     key-value : 键值对  映射

特性:

    key不能重复, value可以重复

Map集合的方法

    map集合的方法都是用来操作key的

    put(key)

    remove(key) clear

    get(key)

map集合的遍历

    map集合没有自身的遍历方法, 要先转成set

    keySet():获取所有的key

    values() : 获取所有的value

    entrySet() : 获取所有的键值对

HashMap

    底层是数组

    存储时,通过key算出一个角标值, 如果当前位置上有元素, 就比较一下

    如果对比成功, 覆盖值。如果没有成功, 挂载

    如果当前位置上没有元素, 直接存储

hashMap是如何判断是否重复的 key的地址值和hashCode和equals方法

TreeMap

    底层是红黑树(二叉树)

    key可以排序

    新元素要和老元素比较, 根据返回的结果判断存储的位置

    参考TreeSet

HashSet和TreeSet底层用的HashMap和TreeMap

    其实就是将Set集合的元素当成Map集合的key

泛型

    设一个不是具体类型的类型

    好处

        提高代码的兼容性

        提高安全性,将运行期的错误提前到编译期

        省去强转的麻烦

        在一定范围统一类型

   泛型可以定义的地方

        接口, 类, 方法

你可能感兴趣的:(java集合)