关于list指定类型的集合能存储null,为什么???

这是我测试的代码
图片说明

这个问题其实可以说是非常典型的一个问题了,建议去看一下数据结构的基础知识。
这个问题的关键在于,List中存储的每个元素本质上是一个地址指针,它指向了一个对象的存储位置。
当你向List中添加null的时候,就相当于在List中添加了一个没有指向任何有效对象的指针或者说引用,换言之,就是先占了一个位置。
随后,你可以将这个位置的引用换成一个有效的引用。
至于你这里输出结果中打印的结果是"null",作为字符串出现。只是因为System.out.println调用了String.valueOf(),后者的代码是

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

也就是说,你的List中本来元素是null,但是输出的时候被转化成了"null"这样的一个字符串。

list.add(null);

换成下面写法,就好理解了

String s = null;
list.add(s);

null值是一种特殊的值,它可以转换为任何类型的值,可参考这篇文章http://www.importnew.com/14229.html

null值是一种特殊的值,它可以转换为任何类型的值,可参考这篇文章http://www.importnew.com/14229.html

List list = new ArrayList<>();
list.add("lll");
list.add("2222");
list.add("33333");
list.add(null);
list.add("5555555");
System.out.println(list.get(3)); //null
这么写,就不需要我说太多了吧,我觉得你肯定就理解了,null在这里代表这个位置是有一个字符串,但是这个字符串为空
你打印出来的null不是字符串“null”,而仅仅是代表这里是个空字符串

肯定可以啊,就向
String str=new String();
str=null;
一样的道理啊。

你可以去参考一下http://blog.csdn.net/u010698072/article/details/54235679

你还可以看看以下的内容:

List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
Query接口有一个实现类:LinkList
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
SortedMap有一个实现类:TreeMap
其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对。

希望对你有帮助

Null也是字符串,是一个比较特殊的字符串的,如果不是字符串你的List都不可以add

我是这样理解的。要说为啥List能存null,我想说,因为ArrayList的实现支持null呗。如果不支持null的存储,也是不能放进去的,例如HashTable就是不支持null值、null键的,会做判断如果是null值抛出异常
ArrayList是用一个Object的数组保存的

transient Object[] elementData;

Object是可以为null值的。下面是add的源码

     public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }