Java中数组为null 和数组长度为0的区别

java中数组为空和数组长度为0的区别(注意是坑) CollectionUtils工具类

https://blog.csdn.net/qq_33146717/article/details/80268688

CollectionUtils

在  import org.apache.commons.collections.CollectionUtils包下面的方法

可以直接判断数组为空 || size> 0

两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常。
eg:

if(array == null || 0 == array.length) {...}   // 这种写法正确,因为执行到 “0 == array.length”则说明数组不为空,不会产生空指针异常。

if (0 == array.length || array == null) {...} // 这种写法可能会产生空指针异常。
例:

int[] n;        //只声明了一数组变量;                              
int[] nil = null;        //声明一数组变量,并赋值 null,nil是一个数组类型的空引用,不指向任何对象;                             
int[] zero = new int[0];  //声明并创建一数组对象,长度是0;

对于上面三条语句,一个比一个做的动作多,系统占用也是后面的多:
语句一变量还没初始化,打印 n 会出错:“可能尚未初始化变量 n”;
语句二虽已初始化,打印“nil.length”会出现异常:NullPointerException;

语句三打印“nil.length”是0,数组内还没有元素。
       假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回null,才能对放回数组进一步处理,而如果返回空数组,则无须null引用检查。鉴于此,返回数组的方法在没有结果时我们通常返回空数组,而不是null,这样做对于函数调用者的处理比较方便。


Java中数组为空和数组长度为0的区别

https://blog.csdn.net/u012156116/article/details/79690277

今天在做题的时候遇到了这个问题,首先

         List<List<Integer>> results = new ArrayList<>();
         if (nums == null) {
             return results; 
         }
         
         if (nums.length == 0) {
            results.add(new ArrayList<Integer>());
            return results;
         }

nums是一个数组,可以看到他们的区别。

int[] array = null; 数组为空,此时array不指向任何对象;

int[] array = new array[0]; 定义一个长度为0的数组;

int[] array = new array[2]; 定义一个长度为2的数组,此时如果数组没有被初始化,默认的值为null;

一般先判断 nums 是否为空,然后再判断长度是否为0,因为可能报空指针异常。

所以如果在一行代码中要同时判断的时候需要这样写:

if(array == null || array.length == 0)

因为 || 是短路或,前面的符合了后面的就不考虑了。


【Java】返回长度为零的数组或者集合,而不是null

https://www.cnblogs.com/yongh/p/9812596.html

 今天在牛客网上做一个编程题时,在提交代码后老是抛出NullPointerException异常,大概的代码如下:

public ArrayList<Integer> foo(TreeNode root) {
    if (root == null)
        return null;
        ……
        ……
}

 后来改成如下代码就通过了。

public ArrayList<Integer> foo(TreeNode root) {
    if (root == null)
        return new ArrayList<Integer>();
        ……
        ……
}

 具体原因应该是牛客网中的测试代码没有考虑null的情况,希望我们返回的是一个空的ArrayList。

  就返回值到底应该是用null还是空集合的问题,查了一些资料:

《阿里巴巴JAVA开发手册》书中表示:可以返回null,因为防止NPE是调用者的责任。

《Effective Java (Third Edition)》书中表示:返回长度为零的数组或者集合,而不是null。

再结合一下别的博客,自己大概总结一下:

  1)返回值为null并不会有什么问题,但是在“解引用”(dereference)时,调用者没有对null进行判断就会出现NullPointerException。

  2)在返回值为数组或者集合时,尽量返回长度为零的数组或者集合,而不是null,这样在调用时就能简化代码,减少不必要的麻烦,并且不必担心NullPointer异常(除非这对性能会造成很大的影响)。

  就对自己以后编程来说,编写方法时,如果返回值是数组或者集合,就尽量返回长度为零的数组或者集合,而不是null。而自己调用方法时,还是要注意对null情况的判断。

  此外,如果返回值为空对象时没有意义的话,就可以考虑直接抛出异常。

 

 

 

 

 

 

 

 

 

  • 25
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将两个数组合并为一组,可以使用以下方法: 首先,创建两个需要合并的数组a和b。假设数组a的长度为x,数组b的长度为y。\[1\] 然后,创建一个新的数组c,长度为a和b的长度之和。可以使用Arrays.copyOf()方法来创建一个新的数组c,长度为a和b的长度之和。\[3\] 接下来,使用System.arraycopy()方法将数组a的元素复制到数组c的前半部分,将数组b的元素复制到数组c的后半部分。\[2\] 最后,数组c就是合并后的结果。 以下是一个示例代码: ```java String\[\] a = new String\[x\]; String\[\] b = new String\[y\]; String\[\] c = Arrays.copyOf(a, a.length + b.length); System.arraycopy(b, 0, c, a.length, b.length); ``` 这样,数组a和数组b就被成功合并为数组c了。 #### 引用[.reference_title] - *1* *2* [将两个或多个数组进行合并](https://blog.csdn.net/lkq_kai/article/details/83895288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [java两个数组合并为一个数组](https://blog.csdn.net/SUMMERENT/article/details/131211918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值