[Javaスタディノート]リストインターフェイスとその実装クラス

目次

1.リストコレクションの特徴

2.リストコレクションのユニークな機能

2.1機能の追加

2.2関数の取得

2.3削除機能

2.4リストイテレータ

 2.5変更機能

3.同時変更の例外の原因と解決策

4.リストコレクションのユニークなトラバーサル機能

5.リストの3つのサブカテゴリの特徴

6.ArrayListの場合

6.1文字列を保存してトラバースする

6.2カスタムオブジェクトを保存してトラバースする

7.Vectorのユニークな機能

7.1機能の追加

7.2関数の取得

8.LinkedListのユニークな機能

8.1機能の追加

8.2関数の取得

8.3削除機能


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]

 

おすすめ

転載: blog.csdn.net/weixin_44679832/article/details/105455810