Java——集合(Collection子接口——List接口)

集合(Collection子接口——List接口)

List接口

鉴于Java中数组用来存储数据的局限性,我们通常使用List(动态数组)替代数组

List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector(现在基本没有人使用了)。

List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引(区别于set)来操作集合元素的方法。
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在集合中首次出现的位置,如果不存在返回 -1
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素(重载了Ccllection的remove方法)
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置(左闭右开)的子集合,原来的list并没有变化。

ArrayList

ArrayList 源码分析

jdk7 :
ArrayList list = new ArrayList(); // 底层会直接创建了长度为10的 Object[] 数组 elementData
list.add(123);
···
···
list(11);// 当添加的元素个数超过了10,之后数组的容量就不够了,就会发生扩容,但这些不需要我们自己去动手,在底层直接会自动扩容,一般情况下是扩容1.5倍,同时将原数组的元素复制到新数组上。
结论:建议使用代参的构造器,ArrayList list = new ArrayList(int capacity); capacity在这里指的是数组的长度。

jdk8:
ArrayList list = new ArrayList(); // 底层是 Object[] 数组 elementData{},说明在我们创建对象的时候没有直接给定长度。
list.add(123); //但是当第一次执行add方法时,才会创建长度为10 的数组。
其余的扩容方法都与jdk7中一样。

小结:jdk7中的ArrayList 对象的创建模式相当于单例模式中的饿汉式,jdk8中的ArrayList 对象的创建模式相当于单例模式中的懒汉式,延迟了数组的创建,节省了内存。

LinkedList

新增方法:
void addFirst(Object obj)
void addLast(Object obj)
Object getFirst()
Object getLast()
Object removeFirst()
Object removeLast()

LinkedList:双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量:
prev变量记录前一个元素的位置
next变量记录下一个元素的位置

在这里插入图片描述

LinkedList源码分析

其实跟我前几天写的单链表差不过,只不过在节点类中多加了一个指针,能指向上一个节点,这样就能在底层构成双向链表。其实看图就很容易懂了,不懂可以翻翻我之前写的单链表的api。

面试题

面试题:ArrayList、LinkedList和Vector的异同
相同:三个类都是实现了List接口,存储数据都是有序的,可重复的。
不同:
ArrayList:作为List接口的主要实现类,线程不安全,效率高。而在调用get和set方法时,使用ArrayList会比LinkedList更快捷。底层使用Object[] 存储。
LinkedList:线程不安全。对于频繁的插入和删除操作时,使用此类比ArrayList效率高。底层使用的是双向链表存储。
Vector:作为List接口的古老实现类,线程安全的,效率低。底层使用Object[] 存储。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。

面试题:

   public void testListRemove() {
            List list = new ArrayList();
            list.add(1);
            list.add(2);
            list.add(3);
            updateList(list);
            System.out.println(list);
    }
   private static void updateList(List list) {
            list.remove(2);
     }

输出的结果为:

1
2

因为我这个remove方法是根据索引删除的,所以删除的是 3 这个元素。如果想要删除2这个元素应该这么写

list.remove(new Integer(2));//这样才表示删除的是2 这个元素 ,而不是索引。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 往集合中添加元素可以使用Collection接口中的add()方法,该方法可以将指定的元素添加到集合的末尾。例如: List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); 上述代码创建了一个ArrayList集合,并向其中添加了三个元素。需要注意的是,如果添加的元素已经存在于集合中,那么add()方法不会将其重复添加。 ### 回答2: 在Java集合类中,Collection是一个接口,它是所有集合类的基础。Collection接口提供了许多有用的方法,如添加元素、删除元素、查找元素等。这里我们将重点讨论向集合中添加元素这一操作。 Collection接口提供了两个向集合中添加元素的方法:add()和addAll()。 add()方法: add()方法用于向集合中添加单个元素。该方法有以下两种形式: 1. boolean add(E e) 将指定元素添加到集合中。如果该集合不允许重复元素,则添加成功返回true,否则返回false。 2. void add(int index, E element) 将指定元素插入到集合的指定位置。如果该集合不支持这种操作,则抛出UnsupportedOperationException异常。 addAll()方法: addAll()方法用于向集合中添加多个元素。该方法有以下两种形式: 1. boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到当前集合中。如果当前集合发生改变,则返回true,否则返回false。 2. boolean addAll(int index, Collection<? extends E> c) 从指定位置开始,将指定集合中的所有元素插入到当前集合中。如果当前集合发生改变,则返回true,否则返回false。 需要注意的是,当向集合中添加元素时,如果该集合不允许重复元素,则若添加了已存在的元素,则add()方法会返回false,addAll()方法会返回false并且只添加未存在于该集合中的元素。 总体而言,向集合中添加元素这一操作非常简便,只需调用add()或addAll()方法即可实现。而具体调用哪个方法,要根据要添加的元素数量和位置需求来确定。 ### 回答3: Java集合类是Java语言提供的一个重要工具,它们提供了一种方便管理和操作数据结构的方法。其中,Java集合框架包括了许多核心接口,其中之一是Collection接口CollectionJava集合框架的基础,所有集合都实现了该接口,因此了解该接口的使用方法对于操作Java集合非常重要,以下是对往集合中添加元素的详细解释。 在Java中,往集合中添加元素是一个非常普遍的行为。Collection接口定义了一组通用的添加元素的方法来满足这一需求。其中,最简单的方法是add(),可将一个新元素添加到集合末尾。该方法有以下两种形式: public boolean add(E e) public boolean addAll(Collection<? extends E> c) 第一种形式的add()方法是将单个元素添加到集合中,该方法返回一个boolean值,指示添加操作是否成功。第二种形式的addAll()方法是将一个集合中的所有元素添加到当前集合中。 除了add()和addAll()方法之外,Collection接口还提供了其他一些方法来添加新元素。例如,使用add(int index, E element)方法可以指定要添加的新元素的位置。还有,使用set(int index, E element)方法可以将指定位置上的元素替换为一个新元素。 此外,当使用LinkedList等特定类型的集合时,我们可以选择在开头或指定位置添加元素,如: offerFirst(E e) 在列表的开头插入指定的元素。 offerLast(E e) 在列表的结尾插入指定的元素。 addFirst(E e) 在列表的开头插入指定的元素。 addLast(E e) 在列表的结尾插入指定的元素。 push(E e) 在列表的开头插入指定的元素。 需要注意的是,当我们向集合中添加元素时,可能会出现以下几种情况: 1. 如果集合的实现不允许重复元素,则添加相同的元素将不会改变集合的大小。 2. 如果添加元素会导致集合大小超出容量,则会抛出OutOfMemoryError或类似的异常。 3. 如果集合使用的是泛型类型,则不能添加不合法的元素。 4. 如果我们使用迭代器遍历集合时对其进行修改,会抛出ConcurrentModificationException异常。 在一个及其庞大的项目中,了解Java集合类及其接口是至关重要的。 通过使用Java集合类,我们可以轻松管理各种数据结构,提高代码的可读性,使其更加灵活,可处理大量数据。了解如何添加元素是使用Java集合的基础,并且将有助于使用Java集合处理数据的所有方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真真最可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值