当前位置: 首页 > 面试题库 >

Collections.emptyList()而不是null检查?

寇照
2023-03-14
问题内容

如果我在某个类中有一个很少使用的集合,该集合可能被实例化很多次,则有时我可能会求助于以下“习惯用法”以节省不必要的对象创建:

List<Object> list = null;

void add(Object object) {
    if (list == null)
        list = new ArrayList<Object>();

    list.add(object);
}

// somewhere else
if (list != null)
    for (Object object : list)
         ;

现在,我想知道是否无法使用来消除这些空检查Collections.emptyList(),但是我将不得不add()像这样更改if检查:

if (list == Collections.<Object>emptyList())
    list = new ArrayList<Object>();

除了每次都分配一个新的空集合以外,还有更好的方法来处理此问题吗?

编辑: 为了清楚起见,我
使用Collections.emptyList(),但是在add()中进行上述检查确实非常丑陋……我想知道是否有更好的方法甚至是其他方法处理这个。


问题答案:

为了节省不必要的对象创建

这是一个非常糟糕的主意,它将使== null检查和其他处理极端情况的代码变得乱七八糟(无论如何最终都会导致空指针异常)!

现在我想知道是否无法使用Collections.emptyList()

不,不是。emptyList()返回一个空列表。你 可以

if (list.equals(Collections.<Object>emptyList()))

但是,如果list == null,它仍然会抛出NullPointerException ,所以它仍然不是您想要的。

我的建议:始终将列表初始化为new ArrayList<Object>,或者,例如,如果要从方法返回空列表,请Collections.emptyList()改用。(这每次都会返回相同的实例,因此也不会在其中创建不必要的对象。)

然后使用.isEmpty()来检查集合是否为空。



 类似资料:
  • 我从数据库中读取一个字符串值,并通过servlet将其打印到jsp页面上。问题是,在Jsp上,如果数据库中的字段为空,就会打印出字符串“null”。如果数据库中的值为空,我需要一个空白的编辑框。 我的数据库访问对象: 我的Servlet: 我的Jsp: 我的数据库是Oracle 11g,浏览器是FireFox。

  • 问题内容: 我必须编写一个例程,如果变量的类型为,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为或。 第一个实现是因为我认为没有数字会使算术表达式为假,但是由于计算为真,所以这是错误的。然后,我得知行为类似于0,并且以下表达式均被评估为true。 当然不是0。被评估为false。这使看似重言式的表达成为错误。 为什么实际上不是0,却像0? 问题答案: 您真正的问题似乎是: 为什么:

  • 代码段用于获取从文本文件中提取的一行文本,将其分离为单独的标记,并将每个标记存储在数组的索引中。起初我以为问题出在文本文件上,但是直接将字符串放入编辑器并不能解决这个问题。 使用字符串,如: 带分隔符的StringTokenizer对象返回前四个标记作为正确的字符串,但其余四个标记为null。 有趣的是,另一个字符串: “Gnollnonegeralany222taunttaunt” 鸡肉没有野兽

  • 所以这是我以前在jooq 3.11中工作的查询。 我正在更新一个JSON字段,但是它使用Json绑定映射到我模型中的字符串,我将在下面发布 这在升级到jooq 3.13.2后不再有效。我还不得不将我的sql方言更改为mysql,即使我正在使用mysql 5_7数据库,这可能是问题所在? 我也试过这个,它还是一样的 JsonBinding.class JsonConverter.class 以下是j

  • 问题内容: 我正在从数据库中读取希伯来语中的一些文本,并正在尝试这样做。如果我得到的结果是: 而json_encode显示: 我相信这是因为我在数据库中的文本包含一个(’)标记。尝试了各种反斜杠或real_escape_string组合,都无济于事。 问题答案: 期望将数据中的字符串编码为UTF-8。 如果尚未将它们转换为UTF-8:

  • 我在MySQL数据库中有一个表,其中包含一个默认值的列,在数据库端使用phpMyAdmin定义。当我使用HiberNate插入新行时,我得到这个错误: 通用域名格式。mysql。jdbc。例外。jdbc4。MySQLIntegrityConstraintViolationException:列“status”不能为null 我还需要做些什么来使用默认值吗? 实体