集合框架中Collection接口的方法和使用

一、集合框架的概述

1.集合、数组都是对多个数据进行储存操作的结构,简称Java容器。
说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)

  • 2.1数组在存储多个数据方面的特点:
  •  > 一旦初始化后,长度就确定了。
    
  •  > 数组一旦定义好,其元素的类型也就确定了。我们只能操作指定类型的数据了。
    
  •      比如:string[] arr;int[] arr1;Object[] arr2;
    
  • 2.2数组在存储多个数据方面的缺点:
  •  > 一旦初始化后,其长度就不可修改。
    
  •  > 数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
    
  •  > 获取数组中实际元素的个数,数组没有现成的属性或方法可用。
    
  •  > 数组存储数组的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
    

二、集合框架

|-----Collection接口:单列集合,用来储存一个一个的对象
 *          |----List接口:储存有序的、可重复的数据.  --->“动态”数组
 *              |----ArrayList、LinkedList、Vector
 *
 *          |----Set接口:储存无序的、不可重复的数据。  --->高中讲的“集合”
 *              |----HashSet、LinkedHashSet、TreeSet
 *
 *      |-----Map接口:双列集合,用来储存一对(key - value)一对的数据  --->高中函数:y = f(x)
 *              |----HashMap、Hashtable、TreeMap、Properties、LinkedHashMap

三、Collection接口中的方法的使用

 *      |-----Collection接口:单列集合,用来储存一个一个的对象
 *          |----List接口:储存有序的、可重复的数据.  --->“动态”数组替换原有的数组
 *              |----ArrayList、作为List接口主要的实现类,线程不安全,效率高,底层使用Object[] elementData存储
 *              |----LinkedList、对于频繁的插入和删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
 *              |----Vector:作为List接口对的古老实现类,线程安全,效率低,底层使用Object elementData[]存储

遍历集合的方法

方法一:Iterator迭代器接口

Iterator 仅用于遍历集合
1.内部的方法:hasNext() 和 next()。
2. 集合对象每次调用iterator()方法都得到一个全新的迭代器对象, 默认游标都在集合的第一元素之间。
3.内部定义了remove(),可以在遍历的时候,删除集合中的元素,此方法不同于集合直接调用remove()。

Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("jerry", 20));
        coll.add(new String("tom"));
        coll.add(false);
        
        Iterator iterator = coll.iterator();

		//hasNext():判断是否还有下一个元素
		while (iterator.hasNext()) {
			System.out.println(iterator.next());//next():①指针下移 ②将下移以后集合位置上的元素返回
		}
使用 foreach 循环遍历集合元素

在这里插入图片描述

        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("jerry", 20));
        coll.add(new String("tom"));
        coll.add(false);

        //for(集合中元素的类型 局部变量 : 集合对象)
        for(Object obj : coll){
            System.out.println(obj);
        }

List接口方法

 *      |-----Collection接口:单列集合,用来储存一个一个的对象
 *          |----List接口:储存有序的、可重复的数据.  --->“动态”数组替换原有的数组
 *              |----ArrayList、作为List接口主要的实现类,线程不安全,效率高,底层使用Object[] elementData存储
 *              |----LinkedList、对于频繁的插入和删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
 *              |----Vector:作为List接口对的古老实现类,线程安全,效率低,底层使用Object elementData[]存储

*ArrayList的源码分析:jdk 7 和jdk 8

  • jdk 7 情况下

  •     ArrayList list = new ArrayList();//底层创建了长度是10的Object[]
      	List.add(123);//elementData[0] = new Integer(123);
      	        ...
    	List.add(11);//如果此次的添加导致底层elementData数组容量不够,则扩容
    	默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中
    
  • jdk 8 情况下

  •     ArrayList list = new ArrayList();//底层Object[] elementData初始化为{}
    	list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将123添加到elementData[]中
    
  • 面试题,比较ArrayList、LinkedList、Vecor三者的异同

  •  同:三个类都是实现了List接口,储存数据的特点相同,储存有序的可重复的数据。
    	不同:同上。
    

/*
void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中
的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex
位置的子集合

总结:常用方法
增、add(Object obj)
删、remove(int index)/remove(Object obj)
改、set(int index, Object obj)
查、get(int index)
插、add(int index,Object obj)
长度、size()
遍历、①Iterator迭代方法
②增强for循环
③普通的循环
*/

面试题

请问ArrayList/LinkedList/Vector的异同? 谈谈你的理解? ArrayList底层
是什么?扩容机制? Vector和ArrayList的最大区别?

 ArrayList和LinkedList的异同
二者都线程不安全,相对线程安全的Vector,执行效率高。
此外, ArrayList是实现了基于动态数组的数据结构, LinkedList基于链表的数据结构。对于
随机访问get和set, ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增
和删除操作add(特指插入)和remove, LinkedList比较占优势,因为ArrayList要移动数据。
 ArrayList和Vector的区别
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于
强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用
ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。 Vector每次扩容请求其大
小的2倍空间,而ArrayList是1.5倍。 Vector还有一个子类Stack。

Set接口

 * |-----Collection接口:单列集合,用来储存一个一个的对象
 *          |----Set接口:储存无序的、不可重复的数据。  --->高中讲的“集合”
 *              |----HashSet、作为set接口的主要实现类:线程不安全,可以储存null值
 *                  |----LinkedHashSet、作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历
 *              |----TreeSet、可以按照添加对象指定属性进行排序
 *
 *  1.Set接口中没有额外定义新的方法,使用的都是Collection中声明过的方法。
/*
set:储存无序的、不可重复的数据。
以HashSet为例
1.无序性:不等于随机性,储存的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。

2.不可重复性:保证添加的元素按照equals()判断时,不能返回true,即:相同的元素只能添加一个


 添加元素的过程:以HashSet为例
    我们向HashSet添加元素a,首先调用元素a所在类的HashCode()方法,计算元素a的哈希值,
    此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为索引位置),判断
    数组此位置上是否已经有元素:
        如果此位置上没有其他元素,则元素a添加成功
        如果此位置是有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值
            如果hash值不同,则元素a添加成功。
            如果hash值相同,进而需要调用元素a所在类的equals()方法:
                equals()返回true,元素a添加失败
                equals()返回false,则元素a添加成功
  对于添加成功的情况2和3,元素a与已经存在指定索引位置上数据以链表的方式存储。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值