java.util.ArrayList<E>有什么用??

本文详细介绍了Java中的ArrayList类,包括其内部实现、构造方法、常用操作如增删查改、批量操作及查询,同时还提供了遍历方法的效率对比。

java.util.ArrayList是一个列表类,它是用来存放其他Java对象,内部是通过数组来实现的。
只要是java对象就可以往ArrayList里面放
java.util.ArrayList内部是通过数组来实现的:
当数组容量不够的时候,会对数组容量进行扩容可以通过数组下标来快速的访问ArrayList里面的元素
 当新增或者删除ArrayList里面的元素时,可能会涉及到移位操作可以截取数组的子数组操作.
 定义如下:

1 public class ArrayList<E> extends AbstractList<E>
 2         implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
 3     //fields
 4    
 5     //constructor
 6 
 7     //methods
 8 
 9     //inner class 'Itr'
10 
11     //inner class 'ListItr'
12 
13     //inner class 'SubList'
14 }

java.util.ArrayList的常见属性:

    //序列号
    private static final long serialVersionUID = 8683452581122892189L;
    //ArrayList实际存储元素的地方 
    private transient Object[] elementData;
    //ArrayList中存储的元素个数
    private int size;
    //ArrayList最多存储元素的个数
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    //fast-fail失败机制标记
    protected transient int modCount = 0;

构造方法:
第一种:默认构造方法(无参数构造方法)

public ArrayList()

第二种: 带初始列表容量大小参数的构造方法

public ArrayList(int initialCapacity) 

第三种:带初始化子列表参数的构造方法

public ArrayList(Collection<? extends E> c)

常用方法:
修改操作:

boolean add(E e) 	将指定的元素添加到此列表的尾部
void add(int index,E element) 	将指定的元素插入此列表中的指定位置
E remove(int index) 	移除此列表中指定位置上的元素
boolean remove(Object o) 	移除此列表中首次出现的指定元素
E set(int index,E element) 	用指定的元素替代此列表中指定位置上的元素

批量操作

boolean addAll(Collection<? extends E> c) 	将子集合c中的元素添加到此集合中
boolean addAll(int index,Collection<? extends E> c) 	将子集合c中的元素添加到此集合中的index位置开始处
void clear() 	清空此集合
protected void removeRange(int fromIndex,int toIndex) 	移除集合中索引在fromIndex(包括)和toIndex(不包括)之间的所有元素
public boolean removeAll(Collection<?> c) 	移除此collection中那些也包含在指定collection中的所有元素
public boolean retainAll(Collection<?> c) 	仅保留在子集合c中那些也包含在此集合中的元素

查询操作

boolean contains(Object o) 	判断集合中是否包含了元素o
E get(int index) 	返回此集合中index位置上的元素
int indexOf(Object o) 	返回此集合中首次出现元素o的位置
boolean isEmpty() 	判断此集合是否为空
int lastIndexOf(Object o) 	返回此集合中最后一次出现元素o的位置
int size() 	返回此集合中元素的个数

其他操作

Object clone() 	返回此列表实例的浅复制
void ensureCapaCity(int minCapacity) 	如有必要,增加此列表实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数
void trimToSize() 	 将此列表实例的容量调整为列表的当前大小

数组操作

Object[] toArray() 	 按适当顺序返回包含此列表中所有元素的数组
<T> T[] toArray(T[] a) 	 按适当顺序返回包含此列表中所有元素的数组

Iterator和子List操作

ListIterator<E> listIterator(int index) 	 返回列表的ListIterator实例
ListIterator<E> listIterator() 	 返回列表的ListIterator实例
Iterator<E> iterator() 	 返回列表的Iterator实例
List<E> subList(int fromIndex, int toIndex) 	 返回列表的子列表

ArrayList遍历方法:

支持三种遍历方式:

第一种: 通过索引值去遍历(随机遍历)(效率最好)

第三种: 通过增强的for循环去遍历(效率最低)

第三种: 通过迭代器去遍历(效率次之)

**正确答案:B 和 C** ### 解释: 题目要求选择两个**线程安全(同步)的集合类**。我们逐项分析每个选项。 --- #### ✅ B. `java.util.Hashtable` - **是同步的 ✔️** - `Hashtable` 是 Java 早期提供的映射类,它的所有公共方法都是 **`synchronized`** 的,例如: - `put()`, `get()`, `remove()`, `size()` 等。 - 因此它是线程安全的,可以在多线程环境中使用而无需额外同步。 - 缺点是性能较低,因为整个表被锁定。 > 注意:与 `HashMap` 不同,`Hashtable` 是线程安全的。 --- #### ✅ C. `java.util.Vector` - **是同步的 ✔️** - `Vector` 是 `ArrayList` 的线程安全版本。 - 它的方法如 `add()`, `get()`, `set()`, `remove()` 等都声明为 `synchronized`。 - 因此多个线程可以安全地访问同一个 `Vector` 实例(但性能较差)。 > 示例: > ```java > public synchronized void add(E e) { ... } > ``` --- #### ❌ A. `java.util.TreeSet` - **不是同步的 ✖️** - `TreeSet` 实现了 `NavigableSet` 接口,基于 `TreeMap` 实现。 - 它本身 **不提供任何同步措施**,在多线程并发修改时会抛出 `ConcurrentModificationException`。 - 如果需要同步,必须手动包装: ```java Set<String> syncSet = Collections.synchronizedSortedSet(new TreeSet<>()); ``` --- #### ❌ D. `java.util.LinkedList` - **不是同步的 ✖️** - `LinkedList` 是非线程安全的列表实现。 - 所有操作都没有同步控制。 - 多个线程同时访问时可能导致数据不一致或异常。 - 同样可以通过 `Collections.synchronizedList()` 包装来获得线程安全版本。 --- ### 总结对比: | 类别 | 是否同步 | 说明 | |------|----------|------| | `Hashtable` | ✅ 是 | 方法用 `synchronized` 修饰,老式线程安全 Map | | `Vector` | ✅ 是 | 老式的线程安全动态数组 | | `TreeSet` | ❌ 否 | 基于 `TreeMap`,无内置同步 | | `LinkedList`| ❌ 否 | 非线程安全链表结构 | --- ### 补充建议(现代替代方案): 虽然 `Vector` 和 `Hashtable` 是同步的,但在现代 Java 开发中更推荐使用: - `ConcurrentHashMap` 替代 `Hashtable` - `CopyOnWriteArrayList` 或 `Collections.synchronizedList()` 替代 `Vector` - 使用并发集合提高性能和灵活性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值