2020-09-03

​​​​​

集合详细总结(一) 

1.1.数组和集合的区别

 数组不是面向对象的,存在着明显的缺陷,而集合又弥补了数组的一些缺点,比数组在使用时更加灵活。

1.数组的效率高于集合

2.数组能存放基本数据类型和对象,而集合类中只能放对象。

3.数组容量固定且无法动态改变,集合类容量动态改变。

4.数组无法判断其中实际存有多少元素,length只告诉了array的容量。

5.集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。

6.集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。


1.2.集合类体系结构

1.Collection包含List接口和Set接口

Collection接口存储对象不唯一且无序

List接口中可以通过index(索引)知道元素的位置,list集合中的每一个元素都有一个索引,它允许元素的重复,而且它还是有序的,这里的有序指的是存取有序,就是你按什么样的顺序存进去的,取出来还是什么样。

Set接口中是不允许元素重复的,而且无索引,不能使用普通for循环遍历,不保证集合元素的存取顺序,最多有一个空值,它继承collection接口,所以可以使用collection的方法,底层是map实现机制

Map接口并不是collection接口的子接口,但是仍然被看作是collection框架的一部分,Map使用键值对,key无序且唯一,value可以重复,不要求有序,每个键最多对应一个映射的值,而且不能有空值键


1.3.Collection集合概述和使用

  •   Collection集合概述

        1.是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

        2.JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现

  •  创建Collection集合的对象

       1. 多态的方式
       2.具体的实现类ArrayList

 

  • Collection集合常用功能(这些操作可以用于所有的单列集合)
  1. 添加 add(Object obj)  addAll(Collection coll)
  2. 获取有效元素的个数  int size();
  3. 清空集合  void clear();
  4. 是否包含某个元素 Boolean contains(object obj):是通过equals来判断是否是同一个对象,本质上是拿集合中的元素与他值比较,又因为string类对equals进行了重写,比较的是字符串的内容    Boolean containAll(collection c)调用元素的equals方法比较,拿两个集合的元素挨个比较
  5. 是否空集合 Boolean isEmpty()
  6. 删除  (1)Boolean remove(Object obj) 通过元素的equals方法判断是否是要删除的那个元素,只会删除找到的第一个元素,只是把元素从集合删除,内存中还存在(2)boolean reMoveAll(Collection coll)(3)Boolean removeif(Object o)根据条件进行移除
  7. 取两个集合的交集 boolean retainAll(Collection c)把交集的结果存在当前集合中,不影响c
  8. 转成对象数组 Object[] toArray()

1.4.Collection集合的遍历

  • 迭代器介绍

    1.迭代器,集合的专用遍历方式

        2.Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到

  • Iterator中的常用方法

    1.boolean hasNext(): 判断当前位置是否有元素可以被取出

        2.E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置

  • 增强for循环

       1.它是JDK5之后出现的,其内部原理是一个Iterator迭代器

       2.实现Iterable接口的类才可以使用迭代器和增强for

       3.简化数组和Collection集合的遍历

 public static void main(String[] args) {
      //创建集合对象
      Collection<String> list = new ArrayList<>();
      list.add("a");
      list.add("b");
      //1.增强for循环遍历输出
       //数据类型一定是集合或者数组中元素的类型
        //str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素
        //list就是要遍历的集合或者数组
      for(String str:list){
         System.out.println(str);
      }
     
      //2.Iterator<E> iterator():返回此集合中元素的迭代器,
      通过集合的iterator()方法得到
      Iterator<String> it = list.iterator();
       //用while循环改进元素的判断和获取
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
      

}

通过迭代器和增强for遍历输出是两种比较常见的方法,而迭代器中还有删除元素的方法

void remove(): 删除迭代器对象当前指向的元素

 public static void main(String[] args) { 
    ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");

        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String s = it.next();
            if("b".equals(s)){
                //指向谁,那么此时就删除谁.
                it.remove();
            }
        }
        System.out.println(list);
    }
}

2.List集合

2.1List集合的概叙和特点

  • List集合的概述

    • 有序集合,这里的有序指的是存取顺序

    • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素

    • 与Set集合不同,列表通常允许重复的元素

  • List集合的特点

    • 存取有序

    • 可以重复

    • 有索引


2.2.List集合的特有方法

void add(int index,E element)

在此集合中的指定位置插入指定的元素

E remove(int index)

删除指定索引处的元素,返回被删除的元素

E set(int index,E element)

修改指定索引处的元素,返回被修改的元素

E get(int index)

返回指定索引处的元素


2.3.List集合的实现类

2.3.1List集合子类的特点

  • ArrayList集合

底层数据结构是数组,允许添加重复的元素,添加的元素有序

线程不安全线程不同步,在多线程同时访问时,可以提高访问的效率,但是会降低访问的安全性

它实现了list接口,动态数组,增删快,查询慢,它在查找某个index的数据时效率更高,遍历元素和随机访问元素的效率比较高,而添加和删除元素需要前后移动元素的位置,所以效率低

当插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率,

  • LinkedList集合

    底层数据结构是链表,存储的元素可以重复,而且是按添加顺序进行存储的,查询慢、增删快插入和删除元素的效率比较高,

       线程不安全,linkedList没有同步方法,如果多个线程同时访问一个list,必须自己实现访问同步,一种解决方法实在创建list时         构造一个同步的list,如:List List=Collections.synchronizedList(new LinkedList(....));集合长度无限制,它实现了list和         Deque(双端队列)接口,一般称为双向链表,在插入和删除数据时效率更高,它实现了list接口,允许有null元素,linkedList         比arraylist需要更多的内存

ArrayList和LinkedList的区别和联系:

1.两者都实现了List接口,都具有List中元素有序、不唯一的特点。

2.ArrayList实现了长度可变的数组,在内存中分配连续空间,遍历元素和随机访问元素的效率比较高;

3.LinkedList采用链表存储方式,插入、删除元素时效率比较高


2.3.2LinkedList集合的特有功能

Void addFirst() 在列表头插入指定元素

Void addLast() 在列表尾插入指定元素

E getLast() 获取列表的最后一个元素

E getFirst() 获取列表的第一个元素

E removeLast() 删除列表的最后一个元素

E removeFirst() 删除列表的第一个元素


补充:

Collection和Collections的区别

Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。

Java中还有一个Collections类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值