java学习---集合

集合框架体系

集合可以保存任意多个对象,并且提供了操纵对象的方法,使用起来方便。

单列集合:
在这里插入图片描述
双列集合:
在这里插入图片描述

Collection

1.collection实现子类可以存放多个元素,每个元素可以是Object

2.有些Collection实现类可以存法重复的元素,有些不可以。

3.有些Collection实现类是有序的(List),有些事无序的(Set)。

4.Collection接口没有直接实现的子类,而是通过他的子接口List和Set来实现的。

Collection接口遍历元素方式

1.迭代器 Iterator

所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即返回一个迭代器。
在这里插入图片描述

package Collection_;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class collection01 {
    public static void main(String[] args) {
        Collection col = new ArrayList();
        col.add(new Book("西游记",123));
        col.add(new Book("红楼梦",120));
        col.add(new Book("三国演义",150));
        //先得到 col 对应的 迭代器
        Iterator iterator = col.iterator();
        while (iterator.hasNext()){//判断是否还有数据
            Object obj = iterator.next();//返回下一个元素,类型是 Object
            System.out.println(obj);
        }
        //当退出 while 循环后 , 这时 iterator 迭代器,指向最后的元素
        //如果希望再次遍历,需要重置我们的迭代器
        iterator = col.iterator();
    }
}
class Book{
    private String name;
    private double price;

    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

使用的快捷键:
快速生成 while => itit

显示所有的快捷键的的快捷键 ctrl + j

2.for增强循环

增强for就是简化版的iterator,本质一样,只能用于遍历集合或者数组。
基本语法:
for(元素类型 元素名 : 数组或者集合){
访问元素;
}

List

基本介绍

1.List集合类中元素有序(即添加元素和取出元素的顺序一致),且可以重复。

2… List 集合中的每个元素都有其对应的顺序索引,即支持索引,索引是从 0 开始的

		List list = new ArrayList();
        list.add("tom");
        list.add("jack");
        list.add("tom");
        System.out.println(list);
        System.out.println(list.get(2));

常用方法

		List list  = new ArrayList();
        list.add("tom");
        list.add("jack");
        //1.void add(int index, Object ele):在 index 位置插入 ele 元素
        list.add(1,"tom");

        //2.boolean addAll(int index, Collection eles):
        // 从 index 位置开始将 eles 中的所有元素添加进来
        List list2 = new ArrayList();
        list2.add("a");
        list2.add("b");
        list.addAll(1,list2);
        //System.out.println(list);

        //3.int indexOf(Object obj):返回 obj 在集合中首次出现的位置
        System.out.println(list.indexOf("tom"));

        //4.int lastIndexOf(Object obj):返回 obj 在当前集合中末次出现的位置
        System.out.println(list.lastIndexOf("tom"));

        //5.Object remove(int index):移除指定 index 位置的元素,并返回此元素
        list.remove(0);
        System.out.println(list);

        //6.Object set(int index, Object ele):
        // 设置指定 index 位置的元素为 ele , 相当于是替换
        list.set(0,"txl");
        System.out.println(list);

        //7.List subList(int fromIndex, int toIndex):
        // 返回从 fromIndex 到 toIndex 位置的子集合
        //注意返回的子集合 fromIndex <= subList < toIndex
        List list3 = list.subList(0,2);
        System.out.println(list3);

List的三种遍历方式

在这里插入图片描述

ArrayList

注意事项

1.ArrayList可以加入null,并且可以加入多个,同时可以输出

2.ArrayList是由数组实现数据存储的。

3.ArrayList基本等于Vector,除了ArrayList是线程不安全,在多线程情况下,不建议使用它。

ArrayList底层源码

使用细节:

1.ArrayList中维护了一个Object类型的数组elementData, transient Object[ ] elementData , 其中transient表示瞬时,短暂的,表示该属性不会被序列化。

2.当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData的容量为0 , 第一次添加时,elementData扩容为10 , 如果需要再次扩容,则elementData扩大为原来的1.5倍。

3.如果使用的是指定大小的构造器,则初始elementData为指定大小,如果需要扩容,则直接将elementData扩容为原来的1.5倍。

Vector

Vector与ArrayList基本相同,它的底层也是一个对象数组,不过它是线程同步的,也就是线程安全的,还有个不同点就是它们的扩容机制不完全相同。

在这里插入图片描述

LinkedList

基本说明

1 . LinkedList底层实现了双向链表和双端队列特点,可以添加任意元素,元素可以重复,包括null

2.它是线程不安全的,没有实现同步。

底层操作:
1 . LinkedList底层维护了一个双向链表,它维护了两个属性 first 和 last 分别指向首节点和尾结点。

2.每个节点(Node对象)中又维护了 prev 和 next 和 item 三个属性,其中通过prev指向前一个,next指向后一个,最终实现双向链表。

3.LinkedList中元素的删除和添加不是通过数组完成的,效率比较高。

在这里插入图片描述

基本方法

		LinkedList linkedList   = new LinkedList();
        //增加元素
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        //删除元素
        linkedList.remove(0);
        //修改元素
        linkedList.set(0,10);
        //查看元素
        System.out.println(linkedList.get(0));
        //调用迭代器输出
        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }

ArrayList和LinkedList比较:
在这里插入图片描述

set

基本介绍

1.添加和取出元素的顺序不一致,但是取出的顺序不会因为次数而改变,不能通过索引取出某一个元素。

2.不允许有重复元素,最多只有一个null.

常用方法

和 List 接口一样, Set 接口也是 Collection 的子接口,因此,常用方法和 Collection 接口一样.

HashSet

HashSet实际上是HashMap.
HashMap底层是数组+链表+红黑树

HashSet添加元素如何实现

1.添加一个元素时,先得到hash值,会转换成索引值。

2.找到存储数据表table,看这个索引位置是否已经存放有元素。

3.如果没有,直接加入。

4.如果有,调用equals比较,如果相同,放弃添加,如果不同,则添加到最后。

5.在JAVA8中,如果一条链表的节点个数到达8个,并且table的大小>=64,那么就会进行树化( 红黑树 ).

第一次添加元素时:table数组扩容到16,临界值是16临界因子 = 12,如果table数组使用到了临界值,就会扩容162 = 32,新的临界值就是32*0.75 = 24,以此类推。

这个临界值到12是指table表中的对象到达了12个,可能只有两条链表,不一定要用到12个链表。

LinkedHashSet

1.LinkedHashSet是HashSet的子类,它的底层是LinkedHashMap,它的底层维护了一个数组+双向链表。

2…LinkedHashSet根据元素的hashcode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入的顺序保存的。它的输出时是按插入的顺序输出的。

3.LinkedHashSet不允许添加重复元素。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值