首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么ArrayList仍然是空的,而将另一个类中的对象添加到列表中仍然有效?

ArrayList是Java中的一个动态数组,它可以存储任意类型的对象。当我们创建一个ArrayList对象时,它的初始大小为0,即为空。

在Java中,对象是通过引用来传递的。当我们将一个类的对象添加到ArrayList中时,实际上是将该对象的引用添加到了列表中。这意味着,即使原始对象被修改或删除,列表中的引用仍然有效。

所以,当你将另一个类中的对象添加到ArrayList中时,即使原始ArrayList仍然为空,列表中仍然有效地存储了该对象的引用。这是因为ArrayList只是存储了对象的引用,并没有复制对象本身。

举个例子来说明:

代码语言:txt
复制
class MyClass {
    int value;
    
    public MyClass(int value) {
        this.value = value;
    }
}

public class Main {
    public static void main(String[] args) {
        ArrayList<MyClass> list = new ArrayList<>();
        MyClass obj = new MyClass(10);
        
        list.add(obj);
        obj.value = 20;
        
        System.out.println(list.get(0).value);  // 输出结果为20
    }
}

在上面的例子中,我们创建了一个ArrayList对象list和一个MyClass对象obj。我们将obj添加到list中,并修改了obj的value属性。然后,我们通过list获取到了obj,并打印了它的value属性。由于list中存储的是obj的引用,所以当我们修改obj的属性时,list中的引用也会反映出这个改变。

总结一下,ArrayList仍然是空的,是因为它的大小为0,没有存储任何对象。但是,将另一个类中的对象添加到列表中仍然有效,是因为ArrayList存储的是对象的引用,而不是对象本身。

相关搜索:如何将对象添加到另一个类的列表中?如何从C#中的另一个类创建对象的ArrayList从具有另一个对象arraylist属性的对象数组列表中获取值如何将类中的方法添加到另一个类的现有对象中python -将类对象追加到另一个类中的列表如何将对象从ArrayList移动到另一个类中的RecyclerView?Spring Boot:为什么Custom Validator类中的自动连接对象为空?为什么包含在类外部的模块将实例方法添加到类的对象中根据.net中的另一个列表过滤或删除DTO类对象中的数组对象如何获取和处理另一个类中的对象列表?将一个类的信息添加到另一个类的数组列表中如何将一个类的多个对象引用添加到flutter中的列表中?在C#中将空项添加到自定义对象的下拉列表中将另一个类引发的值添加到列表中引发NullRefernceException将一个文件中的所有对象添加到另一个文件的列表中有效地将多个项目添加到arraylist对象中,以避免向android studio java中的另一个活动发送意图时出现越界异常。如何将列表的子集添加到另一个列表中对象的属性-最佳/最快实践为什么我不能在c#中将对象添加到我的列表中?如何遍历Object类型(如类)的列表(特别是ArrayList)并收集每个对象中的特定字符串为什么当通过另一个脚本将脚本添加到选定的游戏对象时,会将该脚本添加到列表中的每个对象两次?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 面试系列之-同步容器与高并发容器(JAVA基础)

    除了提供对SortedSet进行同步包装的方法之外,java.util.Collections还提供了一系列对其他的基础容器进行同步包装的方法,如synchronizedList()方法将基础List包装成线程安全的列表容器,synchronizedMap()方法将基础Map容器包装成线程安全的容器,synchronizedCollection()方法将基础Collection容器包装成线程安全的Collection容器与同步包装方法相对应,java.util.Collections还提供了一系列同步包装类,这些包装类都是其内部类。这些同步包装类的实现逻辑很简单:实现了容器的操作接口,在操作接口上使用synchronized进行线程同步,然后在synchronized的临界区将实际的操作委托给被包装的基础容器。‍高并发容器:‍ JUC高并发容器是基于非阻塞算法(或者无锁编程算法)实现的容器类,无锁编程算法主要通过CAS(Compare And Swap)+Volatile组合实现,通过CAS保障操作的原子性,通过volatile保障变量内存的可见性。无锁编程算法的主要优点如下: (1)开销较小:不需要在内核态和用户态之间切换进程。 (2)读写不互斥:只有写操作需要使用基于CAS机制的乐观锁, 读读操作之间可以不用互斥。 JUC包中提供了List、Set、Queue、Map各种类型的高并发容器,如ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList和CopyOnWriteArraySet。在性能上,ConcurrentHashMap通常优于同步的HashMap,ConcurrentSkipListMap通常优于同步的TreeMap。当读取和遍历操作远远大于列表的更新操作时,CopyOnWriteArrayList优于同步的ArrayList。 List:JUC包中的高并发List主要有CopyOnWriteArrayList,对应的基础容器为ArrayList。CopyOnWriteArrayList相当于线程安全的ArrayList,它实现了List接口。在读多写少的场景中,其性能远远高于ArrayList的同步包装容器。 Set:·CopyOnWriteArraySet继承自AbstractSet类,对应的基础容器为HashSet。其内部组合了一个CopyOnWriteArrayList对象,它的核心操作是基于CopyOnWriteArrayList实现的。 ·ConcurrentSkipListSet是线程安全的有序集合,对应的基础容器为TreeSet。它继承自AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的。 Map:·ConcurrentHashMap对应的基础容器为HashMap。JDK 6中的ConcurrentHashMap采用一种更加细粒度的“分段锁”加锁机制,JDK 8中采用CAS无锁算法。 ·ConcurrentSkipListMap对应的基础容器为TreeMap。其内部的SkipList(跳表)结构是一种可以代替平衡树的数据结构,默认是按照Key值升序的。 Queue:JUC包中的Queue的实现类包括三类:单向队列、双向队列和阻塞队列。 ·ConcurrentLinkedQueue是基于列表实现的单向队列,按照FIFO(先进先出)原则对元素进行排序。新元素从队列尾部插入,而获取队列元素则需要从队列头部获取。 ·ConcurrentLinkedDeque是基于链表的双向队列,但是该队列不允许null元素。ConcurrentLinkedDeque可以当作“栈”来使用,并且高效地支持并发环境。 ·ArrayBlockingQueue:基于数组实现的可阻塞的FIFO队列。 ·LinkedBlockingQueue:基于链表实现的可阻塞的FIFO队列。 ·PriorityBlockingQueue:按优先级排序的队列。 ·DelayQueue:按照元素的Delay时间进行排序的队列。 ·SynchronousQueue:无缓冲等待队列。

    02

    LinkedList源码解析

    在这一篇中我们主要介绍LinkedList集合类。它和ArrayList不同的是,LinkedList底层是通过双向链表的方式实现的。下面我们介绍一下双向链表的知识。在上一篇中我们知道ArrayList底层数组在处理业务有一个很大的性能问题,就是如果我们从数组的中间位置要删除一个元素要付出很大的代价,原因就是将元素删除之后,这个元素后面的元素都要向数组的前端移动,所以会造成性能的损失,同样,在数组的中间位置插入元素时,也会有上述等问题。于是Java的设计者们为了解决ArrayList的性能问题时,于是LinkedList诞生了。因为它底层是采用双向链表的方式实现的,所以不会出现上述等问题。下面我们详细了解一下链表这个数据结构。

    02
    领券