目次
1.リストコレクションの特徴
コレクション内のオブジェクトはインデックス位置に従ってソートされ、重複するオブジェクトが存在する可能性があります。
2.リストコレクションのユニークな機能
2.1機能の追加
- void add(int index、Object element):指定された位置に要素を追加します
2.2関数の取得
- Object get(int index):指定された位置にある要素を取得します
2.3削除機能
- Object remove(int index):インデックスに従って要素を削除し、削除された要素を返します
2.4リストイテレータ
- ListIterator listIterator():リストコレクションの一意のイテレーター。このイテレーターはイテレーターイテレーターを継承するため、hasNext()メソッドとnext()メソッドを直接使用できます。リストイテレータには、次の固有の機能があります。
- boolean hasPrevious():要素があるかどうかを判別します
- オブジェクトprevious():前の要素を取得します
具体的な使用法については、次のコードを参照してください。
package com.hw.list;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/**
* 列表迭代器 ListIterator
* listIterator():List集合特有的迭代器,该迭代器继承了Iterator迭代器,所以可以直接使用hasNext()和next()方法。
*
* 特有功能:
* Object previous():获取上一个元素
* boolean hasPrevious():判断是否有元素
*
* @author HW
*
*/
public class ListDemo2 {
public static void main(String[] args) {
// 创建集合对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("Jmeter");
list.add("Selenium");
list.add("AirTest");
// 遍历集合
// 通过集合对象获取列表迭代器对象
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
System.out.println(lit.next());
}
System.out.println("==========");
// 逆向遍历集合,前提是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
while(lit.hasPrevious()){
System.out.println(lit.previous());
}
}
}
操作の結果は次のとおりです。
Jmeter
Selenium
AirTest
==========
AirTest
Selenium
Jmeter
2.5変更機能
- Object set(int index、Object element):インデックスに従って要素を変更し、変更された要素を返します
Listコレクションの固有の関数の具体的な使用法については、次のコードを参照してください。
// 创建集合对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("Jmeter");
list.add("Selenium");
list.add("AirTest");
System.out.println("原始数据:" + list);
// void add(int index,Object element):在指定位置添加元素
list.add(1, "Python");
System.out.println("在索引为1的位置添加元素后:" + list);
// Object get(int index):获取指定位置的元素
System.out.println("获取索引为2的元素:" + list.get(2));
System.out.println("修改元素前:" + list);
// Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
System.out.println("被修改的元素:" + list.set(3, "Fiddler"));
System.out.println("修改元素后:" + list);
// Object remove(int index):根据索引删除元素,返回被删除的元素
System.out.println("删除索引为0的元素:" + list.remove(0));
System.out.println("最终元素:" + list);
操作の結果は次のとおりです。
原始数据:[Jmeter, Selenium, AirTest]
在索引为1的位置添加元素后:[Jmeter, Python, Selenium, AirTest]
获取索引为2的元素:Selenium
修改元素前:[Jmeter, Python, Selenium, AirTest]
被修改的元素:AirTest
修改元素后:[Jmeter, Python, Selenium, Fiddler]
删除索引为0的元素:Jmeter
最终元素:[Python, Selenium, Fiddler]
3.同時変更の例外の原因と解決策
要件:コレクション[Hello、World、Java]があります。その中に要素「world」があるかどうかを確認したいのですが、ある場合は「javaee」要素を追加してください。それを実現するコードを記述してください。
コードは次のように表示されます。
// 创建集合对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("Java");
// 遍历集合
// 使用迭代器遍历
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String str = it.next();
if (str.equals("world")) {
list.add("javaee");
}
}
System.out.println("list:" + list);
次の図に示すように、操作結果は例外ConcurrentModificationExceptionを報告します。
ConcurrentModificationException:この例外は、メソッドがオブジェクトの同時変更を検出した場合にスローされますが、そのような変更は許可されていません。
同時変更例外の理由:イテレータはコレクションに依存しています。判定が成功すると、新しい要素がコレクションに追加されますが、イテレータはそれを認識しないため、例外が報告されます。この例外は次のように呼び出されます。同時変更の例外。実際、この問題は次のことを説明しています。イテレータが要素をトラバースする場合、コレクションを介して要素を変更することはできません。
同時変更例外の解決策:
- 方法1:イテレータが要素をトラバースし、イテレータが要素を変更します
// 方式一:迭代器遍历元素,迭代器修改元素
// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String str = lit.next();
if (str.equals("world")) {
lit.add("javaee");
}
}
- 方法2:コレクションは要素をトラバースし、コレクションは要素を変更します(つまり、通常のforループ)
// 方式二:集合遍历元素,集合修改元素
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.equals("world")) {
list.add("javaee");
}
}
完全なコードは次のとおりです。
package com.hw.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* 需求:有一个集合[Hello, World, Java],想判断里面有没有"world"这个元素,如果有,就添加一个"javaee"元素,请写代码实现。
*
* ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
*
* @author HW
*
*/
public class ConcurrentModificationExceptionDemo {
public static void main(String[] args) {
// 创建集合对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("Java");
// 遍历集合
// 使用迭代器遍历
/*Iterator<String> it = list.iterator();
while (it.hasNext()) {
String str = it.next();
if (str.equals("world")) {
list.add("javaee");
}
}*/
// 方式一:迭代器遍历元素,迭代器修改元素
// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
/*ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String str = lit.next();
if (str.equals("world")) {
lit.add("javaee");
}
}*/
// 方式二:集合遍历元素,集合修改元素
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.equals("world")) {
list.add("javaee");
}
}
System.out.println("list:" + list);
}
}
4.リストコレクションのユニークなトラバーサル機能
- size()メソッドをget()メソッドと組み合わせて使用します
// 创建集合对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("Jmeter");
list.add("Selenium");
list.add("AirTest");
list.add("Python");
list.add("Fiddler");
// 遍历集合
// List集合的特有遍历功能(普通for循环遍历集合)
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
5.リストの3つのサブカテゴリの特徴
配列リスト
- 基礎となるデータ構造は、配列、高速クエリ、低速の追加と削除です。
- スレッドは安全で効率的ではありません
ベクター
- 基礎となるデータ構造は、配列、高速クエリ、低速の追加と削除です。
- スレッドセーフ、低効率
LinkedList
- 基になるデータ構造はリンクリストであり、クエリが遅く、追加と削除が高速です。
- スレッドは安全で効率的ではありません
6.ArrayListの場合
6.1文字列を保存してトラバースする
// 创建集合对象
ArrayList<String> list = new ArrayList<String>();
// 添加元素
list.add("Jmeter");
list.add("Selenium");
list.add("AirTest");
list.add("Python");
list.add("Fiddler");
// 遍历集合
// 方式一:普通for循环遍历集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("==========");
// 方式二:迭代器遍历集合
// 通过集合对象获取迭代器对象
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
6.2カスタムオブジェクトを保存してトラバースする
- 学生(名前、年齢)
// 创建集合对象
ArrayList<Student> list = new ArrayList<Student>();
// 创建学生对象
Student s1 = new Student("西施", 18);
Student s2 = new Student("貂蝉", 16);
Student s3 = new Student("昭君", 20);
Student s4 = new Student("杨贵妃", 22);
// 把学生对象添加到集合中
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
// 遍历集合
// 方式一:通过迭代器对象遍历集合
Iterator<Student> it = list.iterator();
while (it.hasNext()) {
Student stu = it.next();
System.out.println(stu.getName() + "---" + stu.getAge());
}
System.out.println("==========");
// 方式二:普通for循环遍历集合
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getName() + "---" + stu.getAge());
}
7.Vectorのユニークな機能
7.1機能の追加
- public void addElement(Object obj):要素を追加します
7.2関数の取得
- public Object elementAt(int index):指定されたインデックス位置にある要素を取得します
- public列挙型elements()
- boolean hasMoreElements():次の要素があるかどうかを判別します
- Object nextElement():要素を取得します
上記の関数の具体的な使用法については、次のコードを参照してください。
package com.hw.list;
import java.util.Enumeration;
import java.util.Vector;
/**
* 添加功能
* public void addElement(Object obj)
*
* 获取功能
* public Object elementAt(int index)
* public Enumeration elements()
* boolean hasMoreElements():判断是否有下一个元素
* Object nextElement():获取元素
* @author HW
*
*/
public class VectorDemo {
public static void main(String[] args) {
// 创建集合对象
Vector<String> vector = new Vector<String>();
// 添加元素
vector.addElement("Fiddler");
vector.addElement("AirTest");
vector.addElement("Selenium");
System.out.println("vector集合:" + vector);
// 获取指定位置的元素
System.out.println("elementAt(1):" + vector.elementAt(1));
// 通过集合对象获取枚举对象
Enumeration<String> enu = vector.elements();
// 判断是否有下一个元素
while (enu.hasMoreElements()) {
// 获取元素
System.out.println(enu.nextElement());
}
}
}
8.LinkedListのユニークな機能
8.1機能の追加
- public void addFirst(Object e):コレクションの先頭に要素を挿入します
- public void addLast(Object e):コレクションの最後に要素を挿入します
8.2関数の取得
- public Object getFirst():コレクションの最初の要素を取得します
- public Obejct getLast():コレクションの最後の要素を取得します
8.3削除機能
- public Object removeFirst():コレクションの最初の要素を削除します
- public Object removeLast():コレクションの最後の要素を削除します
// 创建集合对象
LinkedList<String> list = new LinkedList<String>();
// 添加元素
list.add("Selenium");
list.add("Jmeter");
list.add("Fiddler");
System.out.println("LinkedList集合:" + list);
System.out.println("==========在list集合的开头和结尾插入元素==========");
// 在list集合的开头插入元素
list.addFirst("AirTest");
// 在list集合的结尾插入元素
list.addLast("Java");
System.out.println("" + list);
System.out.println("返回list集合的第一个元素:" + list.getFirst());
System.out.println("返回list集合的最后一个元素:" + list.getLast());
System.out.println("移除list集合的第一个元素:" + list.removeFirst());
System.out.println("移除list集合的最后一个元素:" + list.removeLast());
System.out.println("最终元素:" + list);
操作の結果は次のとおりです。
LinkedList集合:[Selenium, Jmeter, Fiddler]
==========在list集合的开头和结尾插入元素==========
[AirTest, Selenium, Jmeter, Fiddler, Java]
返回list集合的第一个元素:AirTest
返回list集合的最后一个元素:Java
移除list集合的第一个元素:AirTest
移除list集合的最后一个元素:Java
最终元素:[Selenium, Jmeter, Fiddler]