Java集合框架--LIST,ArrayList,LinkedList

List

Java集合框架中的List是一个有序且允许元素重复的集合接口 。它位于java.util包下, 继承自Collection接口。List集合中的元素按照插入的顺序进行排序, 并且可以通过索引来访问元素, 索引从0开始。List允许我们存储元素的集合,‌并且可以包含重复的元素,‌这些元素是有序的。‌下面是一些正确使用Java集合框架中List接口的基本指导原则:‌

1. 创建List实例

Java提供了多种List的实现,‌如ArrayList、‌LinkedListVector等。‌每种实现都有其特点和适用场景。‌

List list = new ArrayList<>(); // 使用ArrayList
// 或者
List linkedList = new LinkedList<>(); // 使用LinkedList

2. 添加元素

List提供了多种添加元素的方法,‌包括add(E element)  、‌add(int index, E element)等。‌

list.add("Hello");
list.add(1, "World"); // 在索引1处插入"World"

3. 访问元素

可以通过索引访问List中的元素,‌使用get(int index)方法。‌

String element = list.get(0); // 获取索引为0的元素

4. 移除元素

可以使用remove(int index)remove(Object o)方法来移除元素。‌

list.remove(0); // 移除索引为0的元素
list.remove("Hello"); // 移除第一个"Hello"元素(‌如果存在)‌

5. 遍历List

遍历List可以使用传统的for循环、‌增强的for循环(‌也称为"for-each"循环)‌或Java 8引入的forEach方法结合Lambda表达式。‌

‌传统的for循环‌:‌

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

‌增强的for循环‌:‌

for (String item : list) {
    System.out.println(item);
}

‌Java 8的forEach和Lambda表达式‌:‌

list.forEach(item -> System.out.println(item));

6. 排序和搜索

List可以转换为数组,‌使用方法。‌对于排序,‌如果List的元素实现了接口,‌可以使用方法进行排序。‌对于搜索,‌可以使用或方法查找元素的索引。‌

7. 注意事项

在多线程环境下,‌如果多个线程同时访问同一个List实例,‌并且至少有一个线程在结构上修改了列表,‌那么必须外部同步这个List。‌是同步的,‌但通常性能不如,‌因此在单线程环境下推荐使用。‌对于大量随机访问和添加/删除操作较少的场景,‌是较好的选择。‌如果频繁地在列表的开头或中间进行添加/删除操作,‌那么可能更合适。‌

ArrayList

在Java中,‌是一个非常常用的集合类,‌它实现了接口,‌并提供了基于动态数组的实现。‌以下是正确使用的一些基本指导原则:‌

1. 创建ArrayList实例

首先,‌你需要创建一个ArrayList的实例。‌你可以指定元素的类型,‌这样可以在编译时期就进行类型检查。‌

ArrayList list = new ArrayList<>();

这里,‌我们创建了一个存储String类型元素的ArrayList。‌

2. 添加元素

ArrayList提供了多种添加元素的方法,‌最常用的有add(E element)add(int index, E element)。‌

使用add(E element)在列表的末尾添加元素。‌

list.add("Hello");
list.add("World");

使用add(int index, E element)在指定索引处添加元素,‌注意索引从0开始,‌且索引值不能超出当前列表的范围。‌

list.add(1, "Java"); // 列表现在变为["Hello", "Java", "World"]

3. 访问元素

你可以通过索引来访问ArrayList中的元素,‌使用get(int index)方法。‌

String firstElement = list.get(0); // 获取第一个元素

4. 移除元素

ArrayList提供了remove(int index)remove(Object o)方法来移除元素。‌ 

使用remove(int index)移除指定索引处的元素。‌

list.remove(1); // 移除索引为1的元素,‌列表现在变为["Hello", "World"]

使用remove(Object o)移除列表中第一个出现的指定元素。‌

list.remove("Hello"); // 移除"Hello",‌如果列表中存在

5. 遍历ArrayList

遍历ArrayList可以使用传统的for循环、‌增强的for循环(‌也称为"for-each"循环)‌或Java 8引入的forEach方法结合Lambda表达式。‌

传统的for循环 :

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

增强的for循环 :

for (String item : list) {
    System.out.println(item);
}

Java 8的forEach和Lambda表达式 :

list.forEach(item -> System.out.println(item));

6. 注意事项

  1. ArrayList在添加或删除元素时,‌如果数组需要扩容,‌则可能会涉及到数组复制,‌这会影响性能。‌因此,‌在知道ArrayList大概的元素数量时,‌可以使用的构造器指定初始容量。‌
  2. ArrayList不是线程安全的。‌如果你需要在多线程环境下使用,‌可以考虑使用Vector(‌但通常不推荐,‌因为它比ArrayList更慢)‌,‌或者使用Collections.synchronizedListArrayList包装成线程安全的列表,‌或者使用​​​​​​​java.util.concurrent包下的并发集合类。‌​​​​​​​​​​​​​​

LinkedList

LinkedList是Java集合框架中一个非常有用的类,‌它实现了接口和接口,‌提供了基于链表的数据结构。‌与不同,‌在添加或删除元素时不需要移动其他元素,‌因此这些操作在上通常更高效。‌但是,‌由于内部是通过节点(‌Node)‌来存储元素的,‌随机访问元素(‌通过索引访问)‌可能会比较慢。‌以下是一些使用的正确方法:‌

1. 创建LinkedList实例

你可以像创建其他集合一样创建LinkedList的实例,‌指定元素的类型。‌

LinkedList linkedList = new LinkedList<>();

2. 添加元素

LinkedList提供了多种添加元素的方法,‌包括在列表末尾添加、‌在列表开头添加以及在指定位置添加。‌

在列表末尾添加元素:‌

linkedList.add("Hello");

在列表开头添加元素(‌这是LinkedList特有的高效操作)‌:‌

linkedList.addFirst("First");

// 或者

linkedList.add(0, "First"); // 这在ArrayList中效率较低,‌但在LinkedList中效率较高

在指定位置添加元素(‌注意,‌这可能会比ArrayList慢,‌因为LinkedList需要遍历到该位置)‌:‌

linkedList.add(2, "Middle");

3. 访问元素

虽然支持LinkedList通过索引访问元素,‌但这不是它最擅长的操作。‌如果你需要频繁地通过索引访问元素,‌那么ArrayList可能是更好的选择。‌

String element = linkedList.get(0); // 获取第一个元素

4. 移除元素

LinkedList提供了多种移除元素的方法,‌包括移除第一个元素、‌最后一个元素、‌指定位置的元素或指定的对象。‌

移除并返回列表的第一个元素:‌

String firstElement = linkedList.removeFirst();

// 或者

String firstElementByIndex = linkedList.remove(0);

移除并返回列表的最后一个元素:‌

String lastElement = linkedList.removeLast();

移除指定位置的元素:‌

linkedList.remove(1); // 移除索引为1的元素

5. 遍历LinkedList

遍历LinkedList可以使用传统的for循环、‌增强的for循环或Java 8引入的​​​​​​​forEach方法结合Lambda表达式。‌由于​​​​​​​LinkedList实现了接口​​​​​​​List,‌这些遍历方法都适用。‌

增强的for循环 :

for (String item : linkedList) {
    System.out.println(item);
}

Java 8的forEach和Lambda表达式 :

linkedList.forEach(item -> System.out.println(item));

6. 注意事项

  1. LinkedList不是线程安全的。‌如果多个线程同时访问一个实例,‌并且至少有一个线程从结构上修改了LinkedList列表,‌那么它必须保持外部同步。‌
  2. 尽管在LinkedList添加和删除元素时通常比​​​​​​​ArrayList更高效,‌但​​​​​​​在随机访问元素时可能较慢。‌因此,‌在选择使用LinkedList还是ArrayList时,‌应考虑你的具体需求。‌

你可能感兴趣的:(java,list,开发语言,学习)