Set和List的区别
-
Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
-
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
-
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
多线程不用ArrayList,LinkedList需要线程同步。
HashSet :该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
Vector:该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。
Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。
Hashtable 是 Dictionary(字典) 类的子类,位于 java.util 包中。
Properties 继承于 Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。
IDEA 中,对可迭代遍历输入.for 可以快捷生成for-each代码片段;
对集合实例使用iterator() 即可获得迭代器,用于遍历或删除元素。
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @Description: TODO
* @author: HardyDragon
* @date: 2021年06月06日 16:34
*/
public class Test02 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
// for -each 遍历
for (Integer i : list) {
System.out.println(i);
}
System.out.println("---------------");
// 不用使用int[] ,toArray 返回的是 object[] 数组
Integer[] arr = new Integer[list.size()];
list.toArray(arr);
for (Integer i : arr) {
System.out.println(i);
}
System.out.println("---------------");
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
1
2
3
---------------
1
2
3
---------------
1
2
3
map 映射
map映射的变量使用 entrySet() 返回一个包含所有键值对 的 set集合。
public void formap() {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "人");
map.put(2, "天");
map.put(3, "地");
// 对keySet() 进行for-each遍历,两次遍历
for (Integer key : map.keySet()) {
System.out.println("key:" + key + " and value:" + map.get(key));
}
System.out.println("-------------------");
// 使用entrySet() 生成 Map.Entry() 再是生成其迭代器
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key:" + entry.getKey() + " and value:" + entry.getValue());
}
System.out.println("-------------------");
// 简化第二种迭代器方法;
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println("key:" + entry.getKey() + " and value:" + entry.getValue());
}
System.out.println("-------------------");
// 只能遍历所有的 value ,不能看到key
for (String value : map.values()) {
System.out.println("value:" + value);
}
}
key:1 and value:人
key:2 and value:天
key:3 and value:地
-------------------
key:1 and value:人
key:2 and value:天
key:3 and value:地
-------------------
key:1 and value:人
key:2 and value:天
key:3 and value:地
-------------------
value:人
value:天
value:地
集合是一个对象,可容纳其他对象的引用。集合接口声明对每一种类型的集合可以执行的操作。
集合框架的类和接口均在java.util包中。
任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。任何对象没有使用泛型之前会自动转换Object类型,使用泛型之后不用强制转换。