java免费学习请关注评论处
1.ArrayList与LinkedList
当开发人员不知道之间的区别ArrayList和LinkedList他们经常使用ArrayList,因为它看起来很熟悉。但是,它们之间存在巨大的性能差异。LinkedList如果存在大量的添加/删除操作并且没有大量的随机访问操作,则应该首选。
2.可变与不可变
不可变对象具有诸如简单性,安全性等诸多优点。但是,它需要为每个不同的值分别创建一个对象,并且过多的对象可能会导致垃圾收集的高成本。在可变和不可变之间进行选择时应该有一个平衡。
通常,可变对象用于避免产生太多中间对象。一个典型的例子是连接大量的字符串。如果你使用一个不可变的字符串,你会产生很多对象,这些对象可以立即进行垃圾回收。这浪费了时间和精力在CPU上,使用可变对象的正确解决方案(例如StringBuilder)。
String result = “” ;
for (String s : arr ){
result = result + s ;
}
3.Super和Sub的构造函数
在Java中,如果一个类没有定义构造函数,编译器默认会为该类插入一个默认的无参构造函数。如果在Super类中定义了一个构造函数,在这种情况下,Super(String s),编译器不会插入默认的无参数构造函数。这是上面超级类的情况。
Sub类的构造函数(带有-argument或no-argument)将调用无参数的Super构造函数。由于编译器试图向Sub类中的2个构造函数中插入super(),但Super的默认构造函数未定义,因此编译器会报告错误消息。
要解决这个问题,只需要1)添加一个Super()构造函数给Super类
4.使用原始类型的集合
在Java中,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是原始类型,Set而是无界通配符类型。
考虑使用原始类型List作为参数的以下代码:
public static void add(List list, Object o){
list.add(o);
}
public static void main(String[] args){
List list = new ArrayList();
add(list, 10);
String s = list.get(0);
}
这段代码会抛出一个异常,使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查并且不安全。
5.检查数组是否包含值
开发人员经常这样做:
Set set = new HashSet(Arrays.asList(arr));
return set.contains(targetValue);
代码有效,但不需要先将列表转换为首先设置。将列表转换为集合需要额外的时间。它可以像下面这样简单:Arrays.asList(arr).contains(targetValue);
要么:
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
6.从循环内的列表中删除元素
下面的代码在迭代过程中删除元素:
ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i
list.remove(i);
}
这种方法存在严重的问题。当一个元素被删除时,列表的大小会缩小,并且索引也会改变。所以,如果你想通过使用索引删除循环内的多个元素,那将无法正常工作。
您可能知道使用迭代器是删除循环内部元素的正确方法,并且您知道Java中的foreach循环像迭代器一样工作,但事实上并非如此。考虑下面的代码:
ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
for (String s : list) {
if (s.equals("a"))
list.remove(s);
}
它会抛出ConcurrentModificationException。
相反,以下是确定的:
ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
Iterator iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}
.next()必须在之前被调用.remove()。在foreach循环中,编译器会.next()在删除元素的操作之后调用该函数,从而导致该操作ConcurrentModificationException。你可能想看看ArrayList.iterator()的源代码。
java免费学习请关注评论处
领取专属 10元无门槛券
私享最新 技术干货