Java集合框架

java集合框架

如果并不知道程序运行时会需要多少对象,或者需要更复杂的方式存储对象,可以使用java集合框架

Collection接口存储一组不唯一、无序的对象
List接口存储一组不唯一、有序(插入顺序)的对象
Set接口存储一组唯一、无序的对象
Map接口存储一组键值对象,提供一组key到value的映射

Collection接口

Collection:存放的是单一值
特点:
1、可以存放不同类型的数据,而数组只能存放固定类型的数据
2、当使用arraylist子类的时候哦,初始长度为10,当长度不够的时候,会自动进行扩容操作
            api方法:
                   增加数据的方法:
                   add();要求传入的数据是object对象,因此当写入基本数据类型的时候,包含了自动拆箱和自动装箱的过程
                   addAll();添加另一个集合中的元素到此集合中

                   删除数据的方法:
                   clear();只是清空集合中的元素,但是此集合对象并没有被回收
                   remove();删除集合中的元素
                   removeAll();删除集合中的属于另一个集合的所有元素

                   查询数据的方法:
                   contains();判断集合中是否包含指定的元素值
                   containsAll();判断此集合中是否包含另一个集合
                   isEmpty();判断集合是否等于空
                   retainAll();若集合A 中含有集合B中的所有元素,则返回true,否则返回false
                   size();返回当前集合的大小

                   集合转数组的操作:
                   toArray();将集合转换成数组

 

List接口

特点:有序,不唯一
            api方法:
                   add();添加元素
                   get();获取某下标对应的元素,
                   indexOf();获取某元素的下标
                   lastIndexOf();某元素最后一次出现的下标
                   set(,);将某下表处的元素值设置成给定值
                   subList(,);左闭右开区间截取元素
                   List.of();得到一个自定义元素的list
                   。。。。。List接口中的某些api方法与Collection中的某些api方法具有相同之处,可参考api文档

 
ArrayList实现了长度可变的数组,在内存中分配连续的空间。
优点:遍历元素和随机访问元素效率比较高
缺点:添加和删除大量移动元素效率比较低,按照内容查询效率低
 
LinkedList采用链表存储方式
优点:插入、删除元素时效率比较高
缺点:遍历和随机访问元素效率比较低下

 
LinkedList的一些方法:
                   add();/offer();/offerLast();在末尾添加元素
                   add(,);在指定位置添加元素
                   addAll(index,collection);在指定位置插入某个集合的元素
                   addAll(collection);在结尾插入整个集合的元素

                   addFirst();/offerFirst();/push();在头部添加一个元素
                   poll();/pollFirst();/pop();在头部删除一个元素
                   remove(index);根据索引删除指定元素
                   set(index,ele);用ele替换索引位置的元素
                   pollLast();在尾部删除一个元素
                   element();/peek();/peekFirst();获取第一个(头部)元素
                   peekLast();//获取尾部元素
                   get(index);获取指定位置的元素
                   subList(,);左闭右开截取元素
                   。。。。.还有一些常规的方法可参考API文档

1、Vector也是List接口的一个子类实现
2、Vector跟ArrayList一样,都是底层使用数组进行实现的,二者区别如下:
       (1)ArrayList是线程不安全的,效率高。Vector是线程安全的,效率低
       (2)ArrayList在进行扩容时,容量变成1.5倍,Vector扩容时,扩容成原来的2倍

 

迭代器

所有的集合都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环,也就是for-each
方法:
      iterator();
      foreach();
在iterator的方法中,要求返回一个Iterator的接口子类实例对象,此接口中包含了
      hasNext();
      next();

在使用iterator进行迭代的过程中,如果删除其中的某个元素会报错(并发操作异常),因此,如果遍历的同时需要修改元素,建议使用listIterator()
ListItreator迭代器提供了向前和向后两种遍历的方式
      始终是通过cursor和lastret的指针来获取元素值及向下的遍历索引
      当使用向前遍历的时候,必须要保证指针在迭代器的结尾,否则无法获取结果值

    ArrayList list =  new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
//        for(int i = 0;i < list.size();i ++)
//        {
//            System.out.println(list.get(i));
//        }

        //迭代器
        //Iterator iterator = list.iterator();
        ListIterator iterator = list.listIterator();
        while(iterator.hasNext()){
            Object o = iterator.next();
            if(o.equals(1))
            {
                iterator.remove();
            }
            System.out.println(o);
        }

        System.out.println("---------");
        while(iterator.hasPrevious()){
            System.out.println(iterator.previous());
        }
//        System.out.println("---------");
//        for(Object i:list){
//            System.out.println(i);
//        }

 

Set接口

特点:
      1、set接口存储一组唯一、无序的对象
      2、存入和取出的顺序不一定一致
      3、操作数据的方法与List类似,Set接口不存在get()方法
      4、使用treeset底层的实现是treemap,利用红黑树进行实现
      5、设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode方法,如果没有,比较的是地址
      6、树中的元素是要进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话,需要自定义比较器
            内部比较器:定义在元素的类中,通过comparable接口来进行实现
            外部比较器:定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集中
      注意:外部比较器可以定义成一个工具类,如果需要比较的规则如果一致时,可以复用,内部比较器只有在存储当前对象时才可以使用。如果两者同时存在。使用外部比较器
当使用比较器的时候,不会调用equals方法。

HashSet:采用Hashtable哈希表
优点:添加、查询、删除速度快
缺点:无序
      LinkedHashSet:
            采用哈希表存储结构,同时采用链表维护次序
            有序(添加次序)
      TreeSet:
            采用二叉树(红黑树)的存储结构
            优点:有序(排序后的升序)查询速度比List快
            缺点:查询速度没有HashSet快

 

HashSet如何保证元素的唯一性?
答:通过元素的两个方法,hashCode和equals来完成,如果元素的hashCode值相同才会判断equals是否为true,如果hashCode值不同,不会调用equals方法
 

Map

map存储的是k-v键值对映射的数据
      实现子类:
            HashMap:数组+链表(JDK1.7) 数组+链表+红黑树(JDK1.8及以后)
            LinkedHashMap:链表
            TreeMap:红黑树

      基本API操作:
            添加:
                  put(k,v)
            查找:
                  isEmpty       判断是否为空
                  size      返回map的大小
                  containsKey
                  containsValue
                  get(k)
            删除:
                  clear      清除集合中的所有元素
                  remove(k)
      Map.entry:表示的是K-V组合的一组映射关系,key和value成组出现

     

遍历操作

//遍历操作
        Set<String> keys = map.keySet();
        for(String key:keys){
            System.out.println(key + "=" + map.get(key));
        }

        //只能获取value值,不能根据value来获取key
        Collection<Integer> values = map.values();
        for(Integer i:values){
            System.out.println(i);
        }


        //迭代器
        Set<String> keys2 = map.keySet();
        Iterator<String> iterator = keys2.iterator();
        while(iterator.hasNext()){
            String key = iterator.next();
            System.out.println(key +"="+ map.get(key));
        }


        //Map.entry()
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator1 = entries.iterator();//泛型里面套泛型
        while(iterator1.hasNext()){
            Map.Entry<String, Integer> next = iterator1.next();
            System.out.println(next.getKey()+"---"+next.getValue());

        }

 

hashmap和hashtable的区别:
1、hashmap线程不安全,效率比较高,hashtable线程安全,效率低
2、hashmap中key和value都可以为空,hashtable都不允许为空

 

hashmap初始值为2的n次幂
1、方便进行&操作,提高效率,&要比取模运算效率高
hash &(initcapacity - 1)
2、在扩容之后涉及到元素的迁移的过程,迁移的时候只需要判断二进制的前一位是0或者是1即可,如果是0,表示新数组和旧数组的下标位置不变,如果是1,只需要将索引位置加上旧数组的长度值即为数组的下标

 

1.7源码知识点
1、默认初始容量 16
2、加载因子 0.75
3、put操作
      1、设置值
      2、计算hash
      3、数据迁移的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值