首页
学习
活动
专区
圈层
工具
发布

一文读懂《Effective Java》第43条:返回零长度的数组或集合,而不是null

对于一个返回null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回值的代码,进而导致NPE。...返回值为null 与性能 有时候会有程序员认为:null 返回值比零长度数组更好,因为它避免了分配数组所需要的开销,但这种观点站不住脚。...在返回值这种级别上担心性能问题是不明智的,除非分析表明这个方法是造成性能问题的真正源头 对于不返回任何元素的调用,每次返回同一个零长度数组是有可能的,因为零长度数组不可变的,而不可变对象可能被自由的共享...,没理由返回null,二是返回一个零长度的数组或者集合。...Java 的返回值为null 的做法,很可能是从C 语言沿袭过来的,在C 中,数组长度是与实际的数组分开返回的,如果返回的数组长度为0,再分配一个数组就没有任何好处了。

2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java Review - 并发编程_并发List_CopyOnWriteArrayList源码剖析

    需要注意的是,在添加元素时,首先复制了一个快照,然后在快照上进行添加,而不是直接在原来数组上进行。...而这时候array之前指向的数组的引用计数为1而不是0,因为线程x还在使用它,这时线程x开始执行步骤B,步骤B操作的数组是线程y删除元素之前的数组,如下图所示。...为什么说snapshot是list的快照呢?明明是指针传递的引用啊,而不是副本。...小结 CopyOnWriteArrayList使用写时复制的策略来保证list的一致性,而获取—修改—写入三步操作并不是原子性的,所以在增删改的过程中都使用了独占锁,来保证在某个时间只有一个线程能对list...另外CopyOnWriteArrayList提供了弱一致性的迭代器,从而保证在获取迭代器后,其他线程对list的修改是不可见的,迭代器遍历的数组是一个快照。

    39220

    JDK1.8源码分析:线程安全的CopyOnWriteArrayList与CopyOnWriteArraySet

    除此之外,CopyOnWriteArrayList的迭代器不是fail-fast的,即写操作不会影响迭代器的数据遍历。...// get不加锁,set加锁新建一个array替换原来的; // 迭代器保存array的快照,不是fail-fast; // subList与主类共享array,读写均需加锁,写不新建一个array替换原来的...而CopyOnWriteArrayList的迭代器是不受其他线程并发修改的影响的。...CopyOnWriteArrayList在返回一个迭代器的时候,会基于创建这个迭代器的时候,内部数组所拥有的数据,创建一个该内部数组当前的快照,然后迭代器遍历的是该快照,而不是内部的数组。...因为迭代器遍历的是内部数组的快照副本,故与ArrayList的迭代器不同的是,CopyOnWriteArrayList的迭代器是不支持写操作的,如添加,删除数据等。

    73930

    行为型-Iterator

    这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。...在第二种定义中,返回当前元素与后移一位这两个操作,要放到同一个函数 next() 中完成。 第一种定义方式更加灵活一些,比如我们可以多次调用 currentItem() 查询当前元素,而不移动游标。...不过,并不是所有情况下都会遍历出错,有的时候也可以正常遍历,所以,这种行为称为结果不可预期行为或者未决行为,也就是说,运行结果到底是对还是错,要视情况而定。...通过迭代器去删除这个元素的时候,我们可以更新迭代器中的游标和 lastRet 值,来保证不会因为删除元素而导致某个元素遍历不到。...而迭代器遍历的对象是快照而非容器,这样就避免了在使用迭代器遍历的过程中,增删容器中的元素,导致的不可预期的结果或者报错。接下来,我举一个例子来解释一下上面这段话。具体的代码如下所示。

    70630

    深入LinkedList,CopyOnWriteArrayList底层原理与源码解析

    ,而不需要将整个数组的数据进行转移。...假设当前线程在获取数组(执行getArray())后,其他线程修改了这个CopyOnWriteArrayList,那么它里面的元素就会改变,但此时当前线程返回的仍然是旧的数组,所以返回的元素就不是最新的了...指返回迭代器后,其他线程对list的增删改对迭代器是不可见的 public Iterator iterator() { return new COWIterator(getArray...指向的还是原来的数组,而array变量已经指向了新的修改后的数组了。...另外,CopyOnWriteArrayList提供了弱一致性的迭代器,从而保证在获取迭代器后,其他线程对list的修改是不可见的,迭代器遍历的数组是一个快照。

    31820

    List 的10个坑,保证你一定遇到过!

    接收的是一个泛型T类型的参数,T继承Object对象 所以通过断点我们可以看到把 int数组 整体作为一个对象,返回了一个 List 「那我们该如何解决呢?」...其实 Arrays.asList(arr) 返回的 ArrayList 不是 java.util.ArrayList,而是 Arrays的内部类 private static class ArrayList...说明: subList 返回的是ArrayList 的内部类SubList, 并不是ArrayList ,而是ArrayList的一个视图,対于SubList子列表的所有操作最终会反映到原列表上。...snapshot是list的快照信息,因为CopyOnWriteArrayList的读写策略中都会使用getArray()来获取一个快照信息,生成一个新的数组。...扩展:最全的java面试题库 因为迭代器遍历的仅仅是一个快照,而对快照进行增删改是没有意义的。 /** * Not supported.

    61420

    我们能用云函数做什么?

    使用无服务器云函数将帮您免除所有运维性操作,使您更加专注于核心业务的开发,实现快速上线和迭代,把握业务发展的黄金时期。...Firebase以独特的方式使用云函数来满足其独特需求,典型运用的领域: 当发生了一些新奇有趣的事情通知用户 执行实时的数据库清理和维护 在云上执行密集的任务,而不是在本地的应用程序上 与第三方的服务和...,而不是在本地的应用程序上 开发人员可以利用云端功能将云资源密集型工作(要耗费繁重的CPU资源或网络资源)将运行的实际情况传送到在用户设备上。...类似于上面的在云上执行密集的任务,而不是在本地的应用程序上 将存储在云对象存储COS的文件通过Map云函数进行文件映射 将映射出来的许多小文件分别通过云函数处理 然后将处理后的文件存储至云数据库中(使得...; 4.同时使用 无服务器云函数 支持个性化模块,根据用户的订单信息生成个性化数据并返回给客户端。

    19.4K40

    面试官最喜欢问的十道java面试题

    当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象。...ArrayList实现了可变大小的数组。它允许所有元素,包括null。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。...6.Iterator和ListIterator的区别 ●ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的"

    60080

    细数 List 的 10 大坑!99%的人都踩过

    接收的是一个泛型T类型的参数,T继承Object对象 所以通过断点我们可以看到把 int数组 整体作为一个对象,返回了一个 List 那我们该如何解决呢?...其实 Arrays.asList(arr) 返回的 ArrayList 不是 java.util.ArrayList,而是 Arrays的内部类 private static class ArrayList...说明: subList 返回的是ArrayList 的内部类SubList, 并不是ArrayList ,而是 ArrayList的一个视图,対于SubList子列表的所有操作最终会反映到原列表上。...snapshot是list的快照信息,因为CopyOnWriteArrayList的读写策略中都会使用getArray()来获取一个快照信息,生成一个新的数组。...,不支持增删操作 CopyOnWriteArrayList迭代器中的 remove()和 add()方法,没有支持增删而是直接抛出了异常 因为迭代器遍历的仅仅是一个快照,而对快照进行增删改是没有意义的。

    33720

    Flutter 移动端架构实践:Widget-Async-Bloc-Service

    有多种选择终归是件好事,但同时也可能会导致困惑,因此,选择一种能够随着app的迭代依然能良好地运行、且具有优秀拓展性的技术非常重要。 更重要的是,尽早做出正确的选择可以为我们节省大量的时间和精力。...如果有需要,我们甚至可以执行高级的流操作,例如通过combineLatest将流组合在一起。 但是要明确: 1.如果需要以某种方式组合,我建议在单个BLoC中使用多个流。...然而,对于仅使用接收器和流的“严格”版本的BLoC,这是不可能的。仅供参考,在Redux中实现这样的功能…嗯…并不是那么有趣!...处理异常时的注意事项 处理异常的另一种可行性是向流中添加一个error的对象,如下所示: Future signInWithGoogle() async { try { // 首先通过将...UI } ) } } 但这样并不优雅,原因有二: 1.它在StreamBuilder的builder中显示了一个对话框,这不是很好,因为builder只应该返回一个控件,而不是执行任何命令式的代码

    18.8K20

    中级java面试题_最新中级Java面试题及答案

    当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。...HashMap在每个LinkedList节点中储存键值对对象。 2.什么是快速失败的故障安全迭代器?...6.Iterator和ListIterator的区别 ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的”

    40110

    10 个经典的 Java 集合面试题,看你能否答得上来?

    当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象。...ArrayList实现了可变大小的数组。它允许所有元素,包括null。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。...6.Iterator和ListIterator的区别 ●ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的'

    41310

    JavaScript 高级程序设计(第 4 版)- 迭代器与生成器

    # 理解迭代 循环时迭代机制的基础,可以指定迭代的次数及每次迭代要执行什么操作。每次循环都会在下一次迭代开始之前完成,而每次迭代的顺序都是事先定义好的。迭代会在一个有序集合上进行。...迭代之前需要事先知道如何使用数据结构(数组中的每一项都只能先通过引用取得数组对象,然后再通过[]操作符取得特定索引位置上的项) 遍历顺序并不是数据结构固有的(通过递增索引来访问数据是特定于数组类型的方式...) forEach的缺陷 解决了单独记录索引和通过数组对象取值的问题,当没办法标识迭代何时终止,只适用于数组 回调结构笨拙 # 迭代器模式 迭代器模式,即把有些结构称为“可迭代对象”,它们实现了正式的...每个迭代器都会关联一个可迭代对象,而迭代器会暴露迭代其关联可迭代对象的API。迭代器无须了解与其关联的可迭代对象的结构,只需要知道如何取得连续的值。...不同迭代器的实例相互之间没有联系,只会独立地遍历可迭代对象 迭代器并不与可迭代对象某个时刻的快照绑定,而仅仅是使用游标来记录遍历可迭代对象的历程。

    68850

    剑指 Firebase ,云开发—— 腾讯云的小 B 战略能行么?

    通过组合云平台内的各项能力,BaaS 为开发者提供了整个后端的能力,包括结构化数据存储的数据库和非结构化数据存储的对象存储,以及复杂逻辑运行的函数服务。...与 Parse 不同的是, Firebase 并没有因为被收购而消失在人们的眼中,反而是因为被 Google 收入旗下,一路前行,吃掉了 Google 原本的一些服务,比如 Andord 中类似 iOS...这些小功能或许不是很复杂,但是面对一些国内的开发者来说,还是非常有用的。...、COS 对象存储和 CDN 来提供服务。...[ycs1p.jpg] 后续,wafer 进行了迭代,迭代出了 Wafer 2 ,并将其集成进入了微信小程序的开发工具当中,可惜,提前进行的过度设计使得这款产品依旧不好用。

    10K40

    MongoDB系列一(查询).

    -- $elemMatch 可以让数组的元素分别要满足查询条件,但是 $elemMatch 不会匹配非数组元素!!                          ...几乎游标对象的每个方法都返回游标本身,这样就可以按任意顺序组成方法链。...这个过程会一直持续到游标耗尽或者结果全部返回。 游标的生命周期:首先,游标完成匹配结果的迭代时,它会清除自身。...对象/文档; 6. 数组; 7. 二进制数据 8. 对象ID; 9. 布尔型; 10. 日期型; 11. 时间戳; 12. 正则表达式 13. 最大值 。...如果使用了这个选项,查询就在"_id"索引上遍历执行,这样可以保证每个文档只被返回一次。 db.foo.find().snapshot()     快照会使查询变慢,所以应该只在必要时使用快照。

    3.8K60
    领券