在面向对象语言中,空(Empty)、空值(Null)、不存在(Not Exists)分别具有这不同含义。
举个通俗的例子:
空表示这个位置是用来放这个东西的,但是这个东西的数量现在是0;
Null是一个占位符,表示这个地方我占了,现在没空间给你放东西;
不存在表示根本就没有这里地方,更别说放在这里的东西了;
面向对象是不是很神奇!其实和我们平常对事物的理解是一样的。
因此,空(Empty)、空值(Null)也是一个对象,既然是对象自然就都可以加入到Java的集合当中了。
我们来做个实验,并探讨如何删除集合中的Null。
package com.demo.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class test {
private static ArrayList list = new ArrayList();
private static HashMap map = new HashMap();
private static HashSet set = new HashSet();
static {
list.add("a");
list.add(null);
list.add(null);
list.add("c");
list.add(null);
map.put(1, "a");
map.put(2, "b");
map.put(3, null);
map.put(4, "d");
map.put(5, "e");
set.add("a");
set.add(null);
set.add("c");
set.add(null);
}
private static void printList() {
System.out.println("printList");
for(String str : list) {
System.out.println(str);
}
System.out.println();
}
private static void printMap() {
System.out.println("printMap");
Set> entrySet = map.entrySet();
Iterator> iterator = entrySet.iterator();
while(iterator.hasNext()) {
Entry entry = iterator.next();
System.out.println(entry.getKey() + " = " + entry.getValue());
}
System.out.println();
}
private static void printSet() {
System.out.println("printSet");
for(String str : set) {
System.out.println(str);
}
System.out.println();
}
private static void removeNullAtList() {
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
if(iterator.next() == null) {
iterator.remove();
}
}
printList();
}
private static void removeNullAtMap() {
Set> entrySet = map.entrySet();
Iterator> iterator = entrySet.iterator();
while(iterator.hasNext()) {
Entry entry = iterator.next();
if(entry.getValue() == null) {
iterator.remove();
}
}
printMap();
}
private static void removeNullAtSet() {
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
if(iterator.next() == null) {
iterator.remove();
}
}
printSet();
}
public static void main(String[] args) {
printList();
for(int i=0;i
if(list.get(i) == null) {
list.remove(i);
}
}
printList();
list.add(null);
list.add(null);
printList();
removeNullAtList();
System.out.println("=============");
printMap();
System.out.println(6 + " = " + map.get(6) + "\n");
map.remove(4);
printMap();
removeNullAtMap();
System.out.println("=============");
printSet();
removeNullAtSet();
}
}
运行截图如下:
结论如下: (1)list、map、set 三个集合类型都是可以存放null的。 (2)list是不能简单的用 for…in 来删除数据的,因为每次删除一个位,该位后面的数据便会往前移一位。如果非要用 for…in 不仅要新增下一位的判断,还有判断数组索引是否越界,写法比较麻烦而且不优雅,所以不推荐。 (3)如果要删除集合中的元素可以使用迭代器iterator,iterator是一个接口,每个集合类都实现了该接口。迭代器删除当前元素后位置并不会移动,且它与下一个元素之间的关系也不会改变(有点类似于链表结构)。