百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

你还在使用Guava的Lists.newArrayList()吗

liuian 2025-05-27 15:54 79 浏览

Guava

说起Guava,做Java开发的应该没人不知道吧,毕竟“google出品,必属精品”。虽然应该没有Spring那样让Javaer无法避开,但是其中很多工具类的封装还是让人欲罢不能。

而我们今天要说的就是Guava中对集合类型构造方法的封装,拿Lists.newArrayList()举例。

源码

事情的起因其实是某次Code Review中同事说到的一句话,他问“你们为什么不直接用new ArrayList(),却喜欢用Lists.newArrayList()?”。多么朴实无华的问题,我当然要趁此机会推销一波,“使用Lists.newArrayList()多有逼格啊”,“内部其实就是new了个List,性能没区别的”。然后他慢悠悠地说了后半句:“源码注释写着不建议使用”。

说实话,源码我肯定是看过的,毕竟很简单,只要你点进去过,你就敢说自己看过源码。这就是我之前视角中的源码,除了方法调用栈深了一层,跟new ArrayList()有半毛钱区别吗?

public static <E> ArrayList<E> newArrayList() {
  return new ArrayList<>();
}

但其实完整地带注释的方法源码长这样,版本是28.1-jre。

/**
 * Creates a <i>mutable</i>, empty {@code ArrayList} instance (for Java 6 and earlier).
 *
 * <p><b>Note:</b> if mutability is not required, use {@link ImmutableList#of()} instead.
 *
 * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
 * deprecated. Instead, use the {@code ArrayList} {@linkplain ArrayList#ArrayList() constructor}
 * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
 */
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList() {
  return new ArrayList<>();
}

重点是注释的后半部分,对于Java7以及之后的版本,本方法不必要且应被弃用,建议直接使用ArrayList的构造方法,可以利用新的“菱形语法”的优势。

一开始看到菱形语法这个新名词我是懵逼的,还好注释里很贴心地贴了个链接,其实就是泛型中的<>,这玩意儿就叫菱形语法。那为啥两个看上去没啥区别的方法又和这个扯上关系了呢?

泛型实例创建时的类型推断

泛型是JDK1.5推出的一个语法糖,但其实我本人觉得还是挺有用的,可以在编译期帮助我们提前发现代码的问题。平时我们泛型见得最多的地方应该就是集合了,比如List<String>就代表这个列表只能存放String类型的变量,如果放错了,我相信你的ide就会友好地提醒你,除非你用记事本编程。

在idea中新建一个ArrayList试试,为了直观地显示idea的提示,我这边使用截图。

  • 第一行不加菱形有一个警告,提示你应该使用泛型
  • 第二行,perfect
  • 第三行,提示String多余

我这边使用的是JDK8,按照Oracle的官方说明,在JDK7其实就有这种现象了:

In Java SE 7, you can substitute the parameterized type of the constructor with an empty set of type parameters (<>):

Map<String, List<String>> myMap = new HashMap<>();

还有一句比较关键的话

Note that to take advantage of automatic type inference during generic class instantiation, you must specify the diamond.

这就是为啥第一行会报警告的原因,因为不加这个菱形就不做类型推断。

为啥不推荐用

看到这里是不是还是一脸懵逼,不知道Guava为啥不推荐使用,因为Lists.newArrayList()的内部就是new ArrayList<>(),带菱形的,完全符合JDK7及以上版本的要求。所以我只好把Oracle的解释全文看了一遍,并且找到了关键点:

List<String> list = new ArrayList<>();
list.add("A");

  // The following statement should fail since addAll expects
  // Collection<? extends String>

list.addAll(new ArrayList<>());

In comparison, the following example compiles:

// The following statements compile:

List<? extends String> list2 = new ArrayList<>();
list.addAll(list2);

是的,如果不明确在构造方法指明泛型类型,也就是单纯的一个菱形,那类型推断功能是受限的。拿上面的举例,new ArrayList<>()并不能根据上上下推断出想要构造的集合是一个List<? extends String>。所以按照官方的意思,在这种情况下用Lists.newArrayList()就搞不定了。

上面的例子是Oracle的官方说法,那到底是不是呢?idea中试一把。

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("A");

    // The following statement should fail since addAll expects
    // Collection<? extends String>

    list.addAll(new ArrayList<>());
}

跑起来完全没问题。。。当然,将allAll方法中的new ArrayList<>()替换为Lists.newArrayList()也是没问题的。

写在最后

从我个人观点来看,我觉得这应该不是idea做的优化,这么看来,官方的说法还是有待考证。

就算官方的说法是对的,那么也只是限制了某些编译期就会报错的场景,似乎问题不大,所以到底用不用Guava的集合创建方法,还是看大家的个人喜好吧。

相关推荐

windows7如何清理c盘(win7怎么清理c盘)

1.打开桌面计算机,右键点击“C盘”,并选取“属性”。2.待新窗口弹出后,依次点击“工具”、“立即进行碎片整理”。3.最后,选取C盘,在按下“磁盘碎片整理”按钮,系统就会对C盘进行分析,并进行整理。4...

win10自带分区工具(win10官方分区工具)

Win10自带的分区工具是磁盘管理器,可以用来创建、删除、格式化和调整磁盘分区。下面是使用磁盘管理器分区的步骤:1.打开磁盘管理器。您可以在Windows10搜索栏中输入“磁盘管理器”来快速打开。...

appstore正版下载软件(apple store下载正版)

不会,他是正版的,因为只有ios系统可以用,但他里面的好游戏都是要收费的,所以打架都要越狱,去其它地方下载,不去商店的在安卓上,GooglePlayStore是类似于苹果的AppStore一...

手机锁屏密码键盘没了(手机输入密码的键盘没了怎么办)

如果手机锁屏密码的键盘找不到,首先要确认是否是由于软件问题导致的。可以尝试重启手机或者清理手机缓存来解决。如果问题仍然存在,可以尝试更换输入法或者恢复手机出厂设置来解决。如果以上方法都没有效果,建议联...

移动硬盘跟固态硬盘的区别(移动硬盘跟固态硬盘的区别是什么)

一:移动硬盘移动硬盘是指以传统机械磁盘作为存储介质,用于计算机之间交换大容量数据,讲究移动便携性的存储产品。优点:具有容量大、价格便宜的特点,方便存储大量文件数据。(推荐学习:web前端视频教程)缺...

windows怎么截图快捷键(windows截图快捷键没反应)

1、按Prtsc键截图这样获取的是整个电脑屏幕的内容,按Prtsc键后,可以直接打开画图工具,接粘贴使用。也可以粘贴在QQ聊天框或者Word文档中,之后再选择保存即可。2、按Ctrl+Prtsc键截图...

显示器分辨率有哪几种(显示器屏幕分辨率都有哪些)

目前使用较多的显示器分辨率有640*480,800*600,1024*768,1280*1024四种。刷新率,这主要是指显示器显示画面每秒刷新的次数,现在的电脑显示屏刷新率一般为75Hz,如果刷新率在...

小马激活工具网址(小马激活工具是什么东西)
  • 小马激活工具网址(小马激活工具是什么东西)
  • 小马激活工具网址(小马激活工具是什么东西)
  • 小马激活工具网址(小马激活工具是什么东西)
  • 小马激活工具网址(小马激活工具是什么东西)
windows7激活工具 知乎(win7激活工具怎么使用教程)

Win7激活工具有很多,比如kms激活工具、小马激活工具、Windowsloader等。下面以这三款激活工具为例,做一个简单的比较。1、kms激活工具,相对比较稳定,通用性强,对各种gho、iso镜...

英伟达高端显卡排行(英伟达最高级显卡)

具体的排名如下:1、NVIDIAGeForceRTX30902、NVIDIAGeForceRTX3080Ti3、NVIDIAQuadroRTXA60004、NVIDIAGeFor...

苹果电脑为啥不能玩游戏(买苹果电脑的十大忠告)

1、MacBook本身就不是用来玩游戏的,是用来轻度办公的,只有集成显卡没有独立显卡,玩游戏也会非常卡。2、MacOS系统虽然支持steam软件,但是里面的游戏并不支持MacOS,况且本身支持MacO...

笔记本电脑显卡驱动怎么安装

使用驱动精灵或者驱动之家搜索驱动,下载后会自动安装驱动的。您好,以下是安装MacBook独立显卡驱动的步骤:1.打开“应用程序”,找到“实用工具”文件夹,打开“终端”。2.在终端窗口中输入以下命令...

家庭wifi已连接不可上网(家里wifi已连接不可用是什么原因)

WiFi已连接不可上网原因和解决方法一、路由器不稳定有些无线路由器、光猫(宽带猫)的质量比较差,长时间运行后会出现死机等一系列的问题。解决办法:把你家里的无线路由器、光猫(宽带猫)断电,等待几分钟,然...

win10专业版在哪下(win10专业版在哪下载)

1.登陆MicroSoft官方网站会员中心,https://insider.windows.com/?lc=1033,点击“登陆”。2.使用hotmail邮箱或者开发者帐号登陆即可。3.选择“获...

中国杀毒软件十大排名(杀毒软件十大排名电脑有哪些)

第一名:火绒安全软件免费下载优点:口碑最好、安静、轻巧、界面简洁、无广告弹窗、无捆绑其他软件、占用内存少。缺点:我杀毒不行、不要紧张,我防毒也不行。第二名:腾讯电脑管家免费下载优点:我从良了...