1.ArrayList与LinkedList
当开发人员不知道之间的区别ArrayList和LinkedList他们经常使用ArrayList,因为它看起来很熟悉。但是,它们之间存在巨大的性能差异。LinkedList如果存在大量的添加/删除操作并且没有大量的随机访问操作,则应该首选。
2.可变与不可变
不可变对象具有诸如简单性,安全性等诸多优点。但是,它需要为每个不同的值分别创建一个对象,并且过多的对象可能会导致垃圾收集的高成本。在可变和不可变之间进行选择时应该有一个平衡。
通常,可变对象用于避免产生太多中间对象。一个典型的例子是连接大量的字符串。如果你使用一个不可变的字符串,你会产生很多对象,这些对象可以立即进行垃圾回收。这浪费了时间和精力在CPU上,使用可变对象的正确解决方案(例如StringBuilder)。
3.Super和Sub的构造函数
在Java中,如果一个类没有定义构造函数,编译器默认会为该类插入一个默认的无参构造函数。如果在Super类中定义了一个构造函数,在这种情况下,Super(String s),编译器不会插入默认的无参数构造函数。这是上面超级类的情况。
Sub类的构造函数(带有-argument或no-argument)将调用无参数的Super构造函数。由于编译器试图向Sub类中的2个构造函数中插入super,但Super的默认构造函数未定义,因此编译器会报告错误消息。
要解决这个问题,只需要1)添加一个Super构造函数给Super类
小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!
4.使用原始类型的集合
在Java中,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是原始类型,Set而是无界通配符类型。
考虑使用原始类型List作为参数的以下代码:
这段代码会抛出一个异常,使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查并且不安全。
5.检查数组是否包含值
开发人员经常这样做:
代码有效,但不需要先将列表转换为首先设置。将列表转换为集合需要额外的时间。它可以像下面这样简单:Arrays.asList(arr).contains(targetValue);
要么:
6.从循环内的列表中删除元素
下面的代码在迭代过程中删除元素:
它会抛出ConcurrentModificationException。
相反,以下是确定的:
.next必须在之前被调用.remove。在foreach循环中,编译器会.next在删除元素的操作之后调用该函数,从而导致该操作ConcurrentModificationException。你可能想看看ArrayList.iterator的源代码。
好啦今天的学习文章就到这里了喜欢关注一下吧。