如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面,我们也应该放回一个零长度的数组或者集合,而不是返回null。如果返回了null,客户端程序员就要检测返回的是不是null,然后才能进行下一步操作,否则就会引发NullPointException。但是如果是返回的的是空数组或者集合,就不会再后续的使用这个对象上,引发空指针异常,我们可以根据代码的行为和表现,来判断数组和集合是不是为空。
在Collections中有专门针对List,Set,Map的空的实现。如:
Collections.emptyList()
Collections.emptySet();
Collections.emptyMap();
在返回这些集合的方法中,尽量不要返回空值,避免NullPointerException。而就尽量返回非空值,这时候上面所示的三个空(不是null)集合就有用武之地了,可以使用它们。
如在某方法中这样做:
publci List<String> getInterests(){
if(interests == null){
return Collections.emptyList();
}
return interests;
}
返回字符串的方法是不是也应该返回一个空串呢?
之前在项目开发的时候,一直喜欢在一些public方法中来判断一些条件,如果不满足就return null
比如
public String getSubString(String data, int start, int end){
if(TextUtil.isEmpty(data)){
return null;
}
return data.subString(start, end);
}
或者
private final List data =…;
.
.
.
public String getDataItem(int i){
if(data == null){
return null;
}
return data.get(i);
}
一直对于这种写法深信不宜,认为即安全又高效。
但是今天看了中的第43条
发现这样写是非常愚蠢的。因为对于这种写法的API的调用者,无时不刻需要对你返回的东西进行非常判断。
而且我一直认为return null开销比较小,不用对内存进行重新分配(这也是看了深入理解java虚拟机之后没有完全理解造成的弊端,总想要尽量避免GC)。
其实这些担心都是多余的,这种方法对内存的影响几乎是没有的。
所以正确的写法应该是
public String sgetDataItem(int i){
if(data == null){
return “”;
}
return data.get(i);
}
返回一个空String
相关推荐
在编程实践中,推荐使用集合接口而不是具体的实现类,这样可以更容易地更换底层实现,不影响代码的其他部分。例如,将`public ArrayList m();`改为`public List m();`,这样可以在不修改方法签名的情况下改变使用的...
在编程领域,数组是一种基本的数据结构,用于存储同类型的元素集合。在处理数组时,我们经常需要进行元素的增删改查操作。标题"不改变长度删除数组中的元素"所涉及的知识点,实际上是在探讨如何在保持数组长度不变的...
数组提供了一种高效且结构化的数据存储方式,而集合类则提供了更灵活的数据组织和操作机制。 6.1 数组 数组是一种在内存中连续存储相同类型数据的结构。数组的特点包括: - 数组由同一类型的数据构成,可以是基本...
1. **数组是固定大小的**,而集合(如`List`、`Set`、`Map`等)的大小可以根据需要动态变化。 2. **数组只能存放相同类型的元素**,而集合可以更灵活地管理不同类型的数据。 #### 集合体系结构 Java集合框架的核心...
数组的长度在声明时指定,之后不能更改,而集合的长度可以在程序运行时动态扩展或收缩。 2. 类型约束:数组只能存储同一种类型的元素,这意味着数组中的所有元素必须是同一数据类型的实例。而集合则更灵活,它可以...
C#数组的特点之一是它的索引从零开始,这意味着第一个元素的索引是0,最后一个元素的索引是数组长度减1。例如,一个包含10个元素的数组,其索引范围是0到9。在C#中,数组的声明与许多其他语言有所不同,数组类型需要...
### Java宝典:数组与集合的神秘面纱——从新手到高手的进阶之路 #### 数据结构,编程的灵魂 在程序设计的世界里,数据结构扮演着至关重要的角色。它不仅决定了程序的性能,还直接影响了代码的可读性和可维护性。...
C#中的数组是一种存储同一类型数据的集合,它提供了一种高效且有序的方式来管理大量数据。数组分为一维数组、二维数组甚至多维数组,它们是C#编程基础中的重要组成部分。 一维数组是最简单的形式,它就像一条线性的...
2)在Java中,数组复制时,使用 `=` 运算符实际上是将一个数组的引用赋值给另一个数组,这意味着两个数组引用同一个内存空间,而不是复制内容。 3)没有显式引用变量的数组称为匿名数组。例如,`new int[5]` 创建了...
在Java中,数组被当作一种引用类型,这意味着数组本身是在堆内存中分配的,而数组的元素可以是基本类型(如int、char)或者是引用类型(如对象实例)。数组具有固定的大小,一旦创建后,其长度就不能更改。 ### 1. ...
如果数组长度大于列表大小,那么数组的剩余位置会被填充为`null`。 通过以上介绍和示例,相信你已经掌握了如何将`List<String>`转换为`String[]`数组的基本方法。这种转换在实际开发中非常常见,掌握它对于提高编程...
`numbers.length`始终返回创建数组时指定的长度,即使后续改变了创建数组时使用的变量的值也不会影响数组的长度。 9. **多维数组声明**:选项C`float f[][]=new float[][6];`是不正确的,因为创建多维数组时,必须...
- `length` 属性:返回数组的长度,例如 `numbers.length` 返回数组元素的数量。 - `clone()` 方法:复制数组,创建一个新的具有相同元素的新数组。 - `System.arraycopy()`:复制数组的一部分到另一个数组。 - ...
6. **下标错误**:可能是由于下标值直接硬编码错误,比如误写成了10,而数组长度只有9。 解决这类问题的步骤包括: 1. **审查代码**:仔细检查涉及到数组访问的代码段,尤其是循环和条件语句。 2. **使用调试器**...
此外,对于对象类型的数组,每个数组元素实际上是对象的引用,而非对象本身,这也解释了为何数组元素默认初始化为`null`,因为此时尚未创建任何对象实例。 #### 四、最佳实践 - **合理规划数组大小**:在设计程序...
这里的关键点在于`name.length`,它返回数组`name`的长度,即数组中元素的数量。 #### 二、添加(向数组中添加元素) 数组在创建时大小固定,因此直接向数组添加元素并不是直接可行的。但是可以通过以下方式实现:...
foreach循环遍历数组和集合元素时,无须获得数组和集合长度,无须根据索引来访问数组元素和集合元素, foreach循环自动遍历数组和集合的每个元素。 •当使用foreach循环来迭代输出数组元素或集合时,通常不要对...
赋值操作(如`bb = aa`)只会让两个数组引用指向同一块内存,而`System.arraycopy()`方法则会真正复制数组的内容到另一块内存。 在处理大量数据时,Java集合框架中的`ArrayList`和`LinkedList`等集合类通常比数组更...