集合

目录

集合

概述

Collection

Collection常用API

List三个实现类的异同

List接口常用API


 

集合

概述


为了方便对多个对象进行操作,需要对对象进行存储,而使用Array存储有一定的不足之处,于是就有了集合,集合就像是一个容器,可以动态的往里添加对象,先谈一谈数组的特点:1.初始化时长度已确定,2.数组声明类型就决定了元素初始化时的类型。再谈一谈数组存在的弊端:1.因为数组在初始化时就确定了长度,且长度不能改变,所以不利于数据的扩展,2.数组提供的方法和属性较少,数组不善于数据的添加,删除,插入,且效率不高。数组无法直接获取存储元素的个数。3.数组存储数据的特点单一,只能存放有序的可重复的数据。

 

集合的底层也是用的数组,对数组进行功能上的扩展,集合可分为两大类Collection(单列),Map(双列),两者都没有直接实现类,都有各自的子接口,Collection有两个重要的子接口List(有序可重复,对数组的优化,也称动态数组),Set(无序不可重复)

 

Collection


Collection常用API

Collection常用API:add(),addAll()(并集),size(),isEmpty(),clear(),contains()(其中调用了equals()),containsAll(),remove(),removeAll()(差集),retainAll()(交集),equals(),toArray(),iterator()

  • 首先需要注意的是往Collection中添加的对象都应该重写equals(),因为Collection部分API会调用此方法
  • 这些API的操作结果都是在原有的容器上做的变动,也就是说不会生成新的容器,
  • 扩展:关于数组转List,在Array工具类中有一个方法,asList(),需要注意其使用规则,若使用的List用了泛型,泛型中不要定义数组类型,否则转化成List时会把被添加的数组整体当成一个元素。
  • iterator(),用于集合的遍历,每次调用此方法都会返回一个新的指向集合第一个元素的前一个地址的指针(对象),返回的对象有几个常用方法,hasNext(),next()(next(),有两个动作,一是指针下移,二是返回当前指向的元素),remove()(可用于遍历集合时删除相应的元素,不同于Collection接口原装的remove())。扩展:java5新特性foreach()底层也是用的迭代器

 

List三个实现类的异同

List三个实现类的异同。List有三个主要的实现类分别是:ArrayList,LinkedList,Vector。三者的相同点是三个子接口的存储特点一样,都是存储有序可重复的数据。三者的不同点:ArrayList是最常用的子接口,底层是使用的Object[],线程不安全的,效率高;Vector是比较老的接口了,在java1时就存在,底层也是使用的数组存储,属于线程安全的相应的效率比较低,现在基本不怎么使用;LinkedList底层使用的双向链表进行存储,对于频繁的插入,删除有着较高的效率。

  • ArrayList源码分析:jdk7和jdk8中关于ArrayList的源码略有不同,相同部分:往容器中添加元素,当容器满了需要扩容时,先扩其原先容量了1.5倍,还不够扩至其需要的容量,若这个容量比规定的最大容量还要大,则将容量设置成为Integer设置的最大值,若还不够就只能抛异常了,扩容这部分的逻辑jdk7和jdk8是一样的。不同的部分:初始化ArrayLists时,jdk7是直接给容器分配了10个空间,而jdk8初始化时没有给其分配空间,只有在第一次添加元素时才为其分配10个空间,这样做的好处是节省内存空间,7的做法有点像饿汉式,8的做法像懒汉式。

  • LinkedList源码分析:底层是用双向链表实现的

  • Vector源码分析:跟ArrayList大致相同,不同之处在于扩容的时候,Vector扩至原来的2倍,且Vector是线程安全的,效率较低,如果我们想使用线程安全的ArrayList可以使用Collections工具类实现。

List接口常用API

List接口常用API:增:add(),删:remove(int index)/remove(Object ele),改:set(int index,Object ele),查:get(int index),插:add(int index,Object ele),长度:size();注意两个remove方法的区别,有些面试题会考到。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值