暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

java集合详细解析List

射手座的程序员 2021-09-27
750

前言

1.对于java来说,集合操作是非常重要的,在之后的项目过程当中应用的十分广泛,下面是java主要集合的架构图:

2.集合与数组的比较

数组的不足:

1、数组的长度必须提前指定,而且一旦指定不能更改
2、数组只能保存相同类型的元素


集合:

1、集合在使用时,长度不用指定,而且可以实现自动扩容或截断


2、集合没有指定泛型之前,默认保存的是任意类型的元素(Object类型)
指定泛型之后,可以保存对应类型 的元素

数组:比较适合保存 基本类型的元素
集合:比较适合保存 引用类型的元素(对象)


Collection

1.collection是所有单列结合的父接口,该接口定义了单列集合通用的方法,如下:

 * boolean add(Object o)/addAll(Object o)
* boolean remove(Object o)/removeAll(Collection c)
* boolean contains(Object o)/containsAll(Collection c)
* void clear
* void size
* booean isEmpty
* Iterator iterator()


List

1.List是Collection的子类,同时也是继承了Collection的方法,
2.List集合允许有重复的元素,且有序。
下面是List集合的一些方法

 * Boolean add(object)增     (这个是老方法,为了凑够增删改查插)    
* Boolean addAll(int index,Collection c) (将集合c所有元素插入List的List的index处)
* Boolean remove(index)删 删除指定索引处的元素
* Object set(index,o)改 修改指定索引处的元素
* int indexOf(o)查 获取元素的索引,如果找不到返回-1
* int indexOf(o)查 获取元素的索引,如果找不到返回-1
* int lastIndexOf(o)查 获取元素在List集合最后一次出现的位置索引
* void add(index,o)插 在列表的指定位置插入指定元素
* Object get(index)获取 获取指定索引处的元素


3.List遍历方式:

//方式1:使用iterator
@Test
public void test1() {
//3.遍历
Iterator iterator = list.iterator();

while(iterator.hasNext()){
Object book = iterator.next();
System.out.println(book);
}
}
//方式2:使用增强for
@Test
public void test2() {
//3.遍历
for (Object object : list) {
System.out.println(object);
}
}


//方式3:使用普通for
@Test
public void test3() {
for(int i=0;i<list.size();i++){
Object object = list.get(i);//
System.out.println(object);//或者是System.out.println(list.get(i));
}
}


ArrayList

1.ArrayList结合了数组和List结合的特点,我们知道数组是定长的,那么我们可以推断,当数组集合了List,它底层一定是一个可伸缩的数组。


java1.8,1.7比较


jdk8:ArrayList中维护了Object[] elementData,初始容量为0.

第一次添加时,将初始elementData的容量为10

再次添加时,如果容量足够,则不用扩容直接将新元素赋值到第一个空位上

如果容量不够,会扩容1.5倍

jdk7:ArrayList中维护了Object[] elementData,初始容量为10.
添加时,如果容量足够,则不用扩容直接将新元素赋值到第一个空位上
如果容量不够,会扩容1.5倍

jdk7和jdk8:
区别:jdk7 相当于饿汉式,创建对象时,则初始容量为10
jdk8 相当于懒汉式,创建对象时,并没有初始容量为10,而在添加时才去初始容量为10

源码解析(对add方法)

LinkedList,Vetor

1.对于ListedList,其底层结构采用了双向链表的数据结构实现

LinkedList中维护了两个重要的属性 first和last,分别指向首节点和尾节点。

每个节点(Node类型)里面又维护了三个属性item、next、prev,分别指向当前元素、下一个、上一个元素。最终实现手拉手的链表结构!

LinkedList特有的方法(是不是和链表的一些方法类似呢?)

* void add(int index, E e)
* void addFirst(O o)
* void addLast(O o)
* void getFirst(O o)
* void getLast(O o)
* Object removeFirst()
* Object removeLast()



2.对于Vetor而言,其实和ArrayList基本类似,只是它是线程安全的,当然,线程安全带来的坏处就是效率低!因此,在实际开发中很少用它。

对比 总结

喜欢的同学欢迎点赞,关注,转发三连!

                     

文章转载自射手座的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论