Collection集合的实现类

本文详细介绍了Java中List接口的实现类ArrayList、LinkedList和Vector,以及Set接口的实现类HashSet、LinkedHashSet和TreeSet。讨论了它们的特点、底层实现以及多态的使用,并给出了可变参数类型的示例。

主要是List和Set接口的实现类

List:有顺序,可重复,有索引值

  • ArrayList :有顺序,可以存储重复的元素,有索引值,是一个非同步的(多线程)。底层是使用数组来进行实现的,所以其增删的效率比较低。其内部的大部分方法是从List继承而来。
  • LinkedList: 有顺序,可以存储重复的元素,有索引值,是一个非同步的(多线程)。底层是使用链表来实现的,其增删的效率比较高,因为使用链表实现,LinkedList除了有Collection的所有方法之外,它还有一些自己特有的方法;
  • Vector:有顺序,可以存储重复的元素,有索引,但是是一个同步的(单线程),现在被ArrayList取代了
    LinkedList特有的一些方法:
    push(Object obj) //向集合中的表头添加一个元素
    addFirst(Object obj) //向集合的表头添加一个元素,等同于push
    addLast(Object obj) //向集合中的表尾添加一个元素
    pop() //弹出集合中的最后一个元素
    removeFirst() //移除集合中第一个元素
    removeLast() //移除集合中的最后一个元素,相当于pop
    getFirst()//获取集合中的第一个元素
    getLast()//获取集合中的最后一个元素

多态的使用:·
使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

//这里创建对象不使用多态是为了可以使用到自己的特有的方法
 LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(1);
        System.out.println(list);
        
        //增加表头的元素
        list.addFirst(666);
        list.push(999);
        //在list末尾增加一个元素
        list.addLast(888);
        System.out.println(list);

        //判断是不是为空
        boolean  b = list.isEmpty();
        if (!b){
            //获取list的第一个元素
            System.out.println(list.getFirst());
            //获取list的最后一个元素
            System.out.println(list.getLast());
        }

        //移除list中的最后一个元素
        list.removeLast();
        //移除list中的第一个元素
        list.removeFirst();
        //获取list的长度
        int size = list.size();
        System.out.println(list+"-->"+size);

        System.out.println("---------------------");
        //遍历所有元素
        Iterator it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("---------------------");
        //遍历的到所有元素
       for(Integer i :list){
           System.out.println(i);
       }
        System.out.println("---------------------");
       //因为LinkedList是带有索引的集合,所以可以使用for来遍历得到
       for(int i = 0;i<list.size();i++){
           System.out.println(list.get(i));
       }

Set:无顺序,不可重复,无索引值

Set根据对象的哈希值来确定元素在集合中存放的位置,底层是以HashMap来实现的,其存取、查询效率高。

  • HashSet:存储无顺序,不可以存放重复的元素,没有索引值,添加元素的时候是通过计算hashCode来确定存储的位置。存放之前会判断这位置是否有相同的元素,有的话就不进行存放,没有,就放进来。底层是通过哈希表(链表+数组)来实现;
  • LinkedHashSet:属于HashSet的子类,有顺序,不允许重复,底层是通过哈希表+链表实现
  • TreeSet:无顺序,不可以重复,底层使用二叉树来实现。可以用来对集合的元素进行排序。
HashSet<String > set = new HashSet();
        set.add("AA");
        set.add("重地");
        set.add("通话");
        set.add("AA");
        System.out.println(set);//[AA, 重地, 通话] 不允许添加重复的元素

        //获取各个元素的hashcode
        System.out.println("AA".hashCode());//2080
        System.out.println("重地".hashCode());//1179395
        System.out.println("通话".hashCode());//1179395

        //获取set集合的大小
        int size  = set.size();
        System.out.println(size);

        boolean b = set.isEmpty();
        //遍历得到set集合的所有元素:Iterator、foreach 因为没有索引,索引不能使用for
        if(!b){
            //通过Iterator进行遍历
            Iterator it = set.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
            System.out.println("--------------------------");
            // 通过foreach来遍历
            for(String s : set){
                System.out.println(s);
            }
        }

上述代码实现不重复存放的原理流程:
1· new HashSet(); 内存为其开辟一个长度为16的空间
2· set.add(“AA”);调用hashCode()方法获取AA的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是没有元素,所以存入;
3· set.add(“重地”);调用hashCode()方法获取“重地”的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是没有元素,所以存入;
4· set.add(“通话”);调用hashCode()方法获取“通话”的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是有元素,然后调用“通话”.equals(“重地”)判断其元素是否相等,发现不相等,存入。
5· set.add(“AA”);调用hashCode()方法获取AA的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是有元素,然后调用“AA”.equals(“AA”)判断其元素是否相等,发现相等,不存入。

LinkedHashSet(有顺序,不能存放重复的元素)

  LinkedHashSet<String > link = new LinkedHashSet();
        link.add("AA");
        link.add("BB");
        link.add("CC");
        link.add("AA");
        System.out.println(link);//结果:[AA, BB, CC]

(补充今天学的一个小知识)
补充一个可变参数类型:/**

  • 测试可变长度的参数,其参数底层为一个数组类型
  • 格式:
    修饰符 返回值 方法名(参数类型…参数名){ 方法体; }

public class TestKebainCansh u {
//计算n个数字的和
public static int add(int…a){//这里的a是一个数组
int sum = 0;
for(int i = 0; i<a.length;i++){
sum = sum+a[i];
}
return sum;
}
public static void main(String[] args) {
System.out.println(add(1,2,3));
}
}

2019年8月9号下午的学习笔记就到这里~有缘再会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值