List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。 List 接口存储一组不唯一,有序(插入顺序)的对象。
Set 接口存储一组唯一,无序的对象。
Map 接口存储一组键值对象,提供key(键)到value(值)的映射。
- Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
- Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
- List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>。
- ArrayList 实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。
- HashSet实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
- HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
- Vector 和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。
- 迭代器
- 遍历ArrayList
import java.util.*;
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
//第一种遍历方法使用 For-Each 遍历 List
for (String str : list) {
//也可以改写 for(inti=0;i<list.size();i++) 这种形式
System.out.println(str);
}
//第二种遍历,把链表变为数组相关的内容进行遍历
String[] strArray=new String[list.size()];
list.toArray(strArray);
for(int i=0;i<strArray.length;i++)
//这里也可以改写为 for(String str:strArray) 这种形式
{
System.out.println(strArray[i]);
}
//第三种遍历 使用迭代器进行相关遍历
Iterator<String> ite=list.iterator();
while(ite.hasNext())//判断下一个元素之后有值
{
System.out.println(ite.next());
}
}
}
-
遍历Map
import java.util.*; public class Test{ public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一种:普遍使用,二次取值 System.out.println("通过Map.keySet遍历key和value:"); for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); } //第二种 System.out.println("通过Map.entrySet使用iterator遍历key和value:"); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } //第三种:推荐,尤其是容量大时 System.out.println("通过Map.entrySet遍历key和value"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } //第四种 System.out.println("通过Map.values()遍历所有的value,但不能遍历key"); for (String v : map.values()) { System.out.println("value= " + v); } } }
import java.util.ArrayList;
public class CeShi{
public static void main(String[] args){
ArrayList<String> lizi = new ArrayList<String>();
lizi.add("a");
lizi.add("b");
lizi.add("c");
lizi.add("d");
lizi.add("e");
lizi.add("f");
System.out.println(lizi);
System.out.println(lizi.get(1));
lizi.set(1,"w");
System.out.println(lizi);
lizi.remove(2);
System.out.println(lizi);
System.out.println(lizi.size());
for (String i : lizi) {
System.out.println(i);
}
}
}
- ArrayList排序
- Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序。
import java.util.Collections;
Collections.sort(lizi);
- 迭代 HashMap
可以使用 for-each 来迭代 HashMap 中的元素。想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。
// 引入 HashMap 类
import java.util.HashMap;
public class CeShi{
public static void main(String[] args) {
// 创建 HashMap 对象 Lizi
HashMap<Integer, String> Lizi= new HashMap<Integer, String>();
// 添加键值对
Lizi.put(1, "Google");
Lizi.put(2, "Runoob");
Lizi.put(3, "Taobao");
Lizi.put(4, "Zhihu");
// 输出 key 和 value
for (Integer i : Lizi.keySet()) {
System.out.println("key: " + i + " value: " + Lizi.get(i));
}
// 返回所有 value 值
for(String value: Lizi.values()) {
// 输出每一个value
System.out.print(value + ", ");
}
}
}
-
Java Iterator(迭代器)
-
调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
调用 it.hasNext() 用于检测集合中是否还有元素。
调用 it.remove() 将迭代器返回的元素删除。
-
// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;
public class CeShi{
public static void main(String[] args){
ArrayList<String> lizi = new ArrayList<String>();
lizi.add("a");
lizi.add("b");
lizi.add("c");
lizi.add("d");
Iterator<String> it = lizi.iterator();
// 输出集合中的第一个元素
System.out.println(it.next());
while(it.hasNext()) {
System.out.println(it.next());//迭代器 it 逐个返回集合中所有元素
}
while(it.hasNext()) {
Integer i = it.next();
if(i < 10) {
it.remove(); // 删除小于 10 的元素
}
}
}