Java列表和数组都是用来存储数据的容器,但它们之间有一些重要的区别。
首先,数组是一种固定大小的容器,而列表是可变大小的容器。这意味着,当你想要在数组中添加新元素时,你必须重新分配内存来存储新元素。而在列表中,你可以轻松地添加或删除元素。
其次,数组只能存储相同类型的元素,而列表可以存储不同类型的元素。这意味着,如果你想要在数组中存储不同的对象(例如String、Integer、Float、Boolean 等),你必须使用Object 数组。而在列表中,你可以轻松地将不同的对象放在一个列表中。
此外,数组是有序的容器(即元素排序是固定的) ;而列表是无序的容器 (即元素排序是不固定的 ) 。这意味着当你想要根据特定条件对数据进行排序时 ; 使用数组会很方便 ; 而使用列表会需要一些额外工作 。
// 声明一个int 数组 int[] array = new int[10]; // 声明一个ArrayList ArrayList list = new ArrayList();
列表是对象的有序集合,在 List
界面中定义。 List
接口表示集合框架中的列表。
列表可以具有重复的元素。并且我们可以在列表中存储多个空值。
List
接口继承了集合接口和它添加了一些方法来支持使用索引访问其元素。
我们可以在 List
或的末尾添加一个元素在由整数索引标识的任何位置。
列表中元素的索引是从零开始的。
我们可以使用以下方法使用索引添加,获取,删除和替换其元素。
its add(int index, E element), addAll(int index, Collection<? extends E> c), get(int index), remove(int index) set(int index, E element)
我们可以搜索元素的位置 List
使用indexOf(Object o)或 lastIndexOf(Object o)
方法。
indexOf()
方法搜索指定的对象从开始,它返回索引的对象的第一次出现。
lastIndexOf()
方法从列表的末尾搜索元素。两个方法都返回-1如果 List
不包含指定的对象。
subList(int fromIndex,int toIndex)
返回一个子列表的原始列表从索引fromIndex(包括)到索引toIndex(独占)。
ListIterator
从 List
接口可以返回在向前和向后方向上遍历其元素。
以下是实现 List
接口的两个类:
ArrayList由数组备份。链接列表由链接列表备份。
如果我们频繁地访问列表的元素,那么 ArrayList
会表现得更好。访问ArrayList中的元素更快,因为它是数组后端。
从 ArrayList
添加或删除元素更慢除非从头到尾,因为 ArrayList
必须执行数组副本内部保持元素的顺序。
LinkedList
的性能优于 ArrayList
用于添加和从列表中间删除元素。但是,访问列表中的元素更慢,除非在列表的头部。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Java"); list.add("Oracle"); list.add("CSS"); list.add("XML"); System.out.println("List: " + list); int count = list.size(); System.out.println("Size of List: " + count); // Print each element with its index for (int i = 0; i < count; i++) { String element = list.get(i); System.out.println("Index=" + i + ", Element=" + element); } List<String> subList = list.subList(1, 3); System.out.println(subList); // Remove "CSS" from the list list.remove("CSS"); // Same as list.remove(2); System.out.println(list); } }
上面的代码生成以下结果。
ArrayList APIs
LinkedList APIs
我们可以使用 ListIterator
接口以遍历列表。
ListIterator
接口继承了 Iterator
接口并且它增加了几个方法来从当前位置向后访问列表中的元素。
以下代码显示了如何从列表中获取列表迭代器:
ListIterator<String> fullIterator = list.listIterator();
为了得到在正向从索引5开始的列表迭代器,使用以下代码。
ListIterator<String> partialIterator = list.listIterator(5);
以下代码显示如何使用 ListIterator
。
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Oracle"); list.add("SQL"); list.add("CSS"); list.add("XML"); System.out.println("List: " + list); // Get the list iterator ListIterator<String> iterator = list.listIterator(); while (iterator.hasNext()) { int index = iterator.nextIndex(); String element = iterator.next(); System.out.println("Index=" + index + ", Element=" + element); } // Reuse the iterator to iterate from the end to the beginning while (iterator.hasPrevious()) { int index = iterator.previousIndex(); String element = iterator.previous(); System.out.println("Index=" + index + ", Element=" + element); } } }
上面的代码生成以下结果。
ListIterator
可以向前看或回头一个列表。
next()
方法向前移动一个索引,而 previous()
方法向后移动一个索引。
如果使用 next()
方法,后跟 previous()
方法,迭代器返回到相同的位置。
ListIterator APIs
Java集合教程 -Java特殊类型映射已排序的映射分类映射按顺序保存映射条目。它基于键对映射条目进行排序从代码中的 Comparable 接...
JSF教程 -JSF 列表框多选以下代码显示了如何创建多个可选择选择框。h:selectManyListbox标记渲染HTML输入元素的类型“select与大...
JSF教程 -JSF表单密码示例h:inputSecret标签渲染类型为“password的HTML输入元素。以下JSF标记h:inputSecret value=password /被...
JSF教程 -JSF转换数字示例f:convertNumber标记用于将字符串值转换为所需格式的数字。以下代码显示如何使用f:convertNumber标记f:...
JPA教程 -JPA 实体管理器删除示例我们可以使用JPA中的EntityManager来删除一个实体。在下面的代码中,我们首先通过使用EntityMan...