Top 10 Mistakes Java Developers Make(转)

图片 2

6.拜望权限

不少开垦者使用public修饰类的字段,那样比较轻便获得字段值,但那是八个倒霉的安插性。经历法则是给顾客尽或许低的拜见权限。

以后的职业

其一列表是自己根据大批量的GitHub上的开源项目、Stack
Overflow上的标题和一部分广大的Google寻觅获得的。未有明展现的评估注脚它们是标准的前10,但它们相对是很普遍的主题材料。要是你不容许任一部
分,请留下您的评介。假如您能建议任何一些大范围的错误,作者将会非常多谢。

翻译自:Top 10 Mistakes Java Developers
Make

 

2.检查评定二个Array是或不是含有叁个成分

诚如开拓者向往用:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

这段代码可以职业,但并从未先转将list转为set,list转为set须求十三分时间,能够用上边更简约的:

Arrays.asList(arr).contains(targetValue);

或者

for(String s: arr){
if(s.equals(targetValue))
    return true;
}
return false;

先是种方式比第三种的可读性更加好。

8.可变与不可变

不可变对象有成都百货上千的独特之处,譬如轻易,安全等等。可是对于每贰个莫衷一是的值都要有一个独门的对象,过多的对象产生窝囊废回收的高消耗。当选取可变与不足变时应该有二个衡量。
平时状态下,可变对象能够用来防止发出过多的中档对象。叁个卓绝的实例正是接连多量的字符串,借使利用不可变的字符串,将会爆发多量的急需开展垃圾回笼的目标。那会浪费CPU一大波的时辰,使用可变对象才是正确的方案(譬如StringBuilder)。

?

1
2
3
4
String result="";
for(String s: arr){
    result = result + s;
}

在其他的部分景色下也是急需运用可变对象的,比方将可变对象作为参数传入方法能够使您不需求接纳过多语句便足以赢得八个结果。此外三个事例是排序和
过滤:当然,你能够写二个主意来收纳原始的集聚,并且重返多个排好序的汇集,可是那样对于大的聚焦就太浪费了。(来自StackOverFlow的dasblinkenlight的答案)。
Why String is
Immutable?

8.Mutable vs. Immutable(可变 VS 不可变)

不可变对象有不胜枚举优势那样回顾,安全,等等。但它对于每叁个不等的变量,供给一个单身的目的。太多的目的或许会引致高资金的垃圾堆搜集。所以在甄选可变和不可变的时应该有个衡量。

貌似的话,使用可变对象,以制止发出过多的中间对象。一个优质的例证正是连接大批量的字符串。假使使用不可变的String,你会发生众多即时要被垃圾采摘回笼的靶子,那很耗时和精力。假设选取二个不可变的,形似StringBuffer。

String result="";
for(String s: arr){
    result = result + s;
}

可变对象还应该有任何的例证:函数字传送参的历程中,可以流传可变对象,这样能够获取多个结果。

 

3. 在八个周而复始中移除list中的成分

思量下下边这种办法:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
    list.remove(i);
}
System.out.println(list);

但愿输出是 [b, d]

但这种办法有三个严重的题目,当一个要素被移除的时候,list的轻重就收缩了,索引也时有发生了改换。所以借使想要在一个周而复始中央银行使索引移除四个要素,那是不可行的。

唯恐你又想用迭代器的方法消除那么些主题材料,但实际也不可行,思虑下上面包车型地铁代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

for (String s : list) {
    if (s.equals("a"))
        list.remove(s);
}

会报错 ConcurrentModificationException.

不可否认的相应是:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();

    if (s.equals("a")) {
        iter.remove();
    }
}

 

9.父类和子类的营造

图片 1

编写翻译出错的案由首要是暗中认可的Super类的布局函数并从未被定义。在Java中,如果叁个类未有实现布局函数,编写翻译器暗中认可会给那些类插入一个无参布局函数。假设在父类中一度有了构造函数,那么编写翻译器将不会再插入私下认可无参布局函数。

子类的结构函数,要么是带参的要么是无参的,都会调用父类的无参构造。因为编写翻译器想在子类中,参加super(卡塔尔(قطر‎,可是父类的无参布局函数并不设有。所以,编写翻译器会报错。

为了息灭那一个主题材料,有三种消灭办法,第一,在Super类中,参预无参布局:

public Super(){
    System.out.println("Super");
}

其次种办法,移除自定义的父类构造函数

其二种方法,子类的构造函数中加入super(valueState of Qatar

1.将数组转变为ArrayList

为了将数组转变为ArrayList,开采者平时会这么做:

?

1
List<String> list = Arrays.asList(arr);

Arrays.asList()会回到贰个ArrayList,但这个ArrayListArrays的民用静态类,不是java.util.ArrayListjava.util.Arrays.ArrayListset(),
get(),
contains()艺术,但不曾此外能充实成分的点子,所以它的深浅是规定的。
为了创立贰个当真的ArrayList,应该那样做:

?

1
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList的布局函数能够吸取三个Collection品类,而它也是java.util.Arrays.ArrayList的四个祖辈类。

 

7.ArrayList vs. LinkedList

相当多的开辟者并不知道ArrayList和LinkedList
的界别,所以不经常选取ArrayList,这么些看起来更熟习。可是,在这里两个之间,有一个相当的大的属性差别。

轻易易行来讲,在有超多插入和删除操作时,相同的时间有超少照旧差不离一直不自由探访的操作意况下,推荐使用LinkedList。其次,再接收ArrayList。

2.检查三个数组是还是不是含有有些值

开辟者平常这么做:

?

1
2
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

其一的代码能够干活,但没必要首先把数组转变为汇聚,把数组转变为汇集供给优良的时光。能够这么做:

?

1
Arrays.asList(arr).contains(targetValue);

或者

?

1
2
3
4
5
for(String s: arr){
    if(s.equals(targetValue))
        return true;
}
return false;

先是个比第叁个的可读性更加好。

 

4. Hashtable vs HashMap

在算法中,哈希表是数据构造的名称。但在Java中,数据布局的名字是HashMap中。在那之中叁个Hashtable和HashMap的中间的主要不一样是,Hashtable是一道的。所以,相当多时候,你并无需哈希表,HashMap就丰富了。

9.父类和子类的构造函数

图片 2
因为从没概念父类的默许布局函数,在编写翻译的时候会发出错误。在Java中间,倘诺二个类没有概念布局函数,编写翻译器将会插入三个无参数的私下认可构造函数。即使在父类里边定义了一个结构函数,在这例中即Super(String
s)
,编写翻译器将不会插入暗许的无参数构造函数。那就是下边示例中父类的情事。
子类的构造函数,不管是不曾参数还应该有有参数,都会调用父类的无参布局函数。因为编译器试图把super()插入到子类的多个布局函数中。不过父类暗中同意的布局函数未定义,编写翻译器就能报出那么些错误音讯。
要修复这几个主题素材,能够省略的经过1卡塔尔(قطر‎在父类中添加一个Super(卡塔尔(قطر‎布局方法,就疑似那样:

?

1
2
3
public Super(){
    System.out.println("Super");
}

要么2卡塔尔(قطر‎移除自定义的父类布局函数,恐怕3卡塔尔在子类的构造函数中调用父类的super(valueState of Qatar。
Constructor of Super and
Sub

10.”” or Constructor?

创造叁个String 有二种方法:

//1. use double quotes
String x = "abc";
//2. use constructor
String y = new String("abc");

分别是怎么样?

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

 

5.利用原始类型的会面

在Java中,原始类型和无界通配符类型十分轻易混在一块。以Set为例,设定为原始类型,同期set<?>是无界的通配符类型。

使用原始类型list,考虑下边的意况:

public static void add(List list, Object o){
list.add(o);
}
public static void main(String[] args){
    List<String> list = new ArrayList<String>();
    add(list, 10);
    String s = list.get(0);
}

本条代码将会抛出荒诞:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at ...

动用原始类型会集是很危殆的一件事,因为它跳过了类属性检查评定並且是不安全的。Set,
Set<?>, and Set

6.拜访等第

开拓者通常应用Public作为类的修饰符,那样能够很简单的经过一向引用获得值,但那是二个老大倒霉的统筹。依据经验,分配给成员的拜见等级应尽量的低。
public, default, protected, and
private

1. Array 转 ArrayList

诚如开垦者向往用:

List<String> list = Arrays.asList(arr);

Arrays.asList(卡塔尔会重回多少个ArrayList,那是Arrays里内嵌的二个私人民居房静态类,而并非java.util.ArrayList类java.util.Arrays.ArrayList
有set(卡塔尔, get(卡塔尔(قطر‎,
contains(卡塔尔国方法,但并帮忙添日币素,所以大小是定点的,想要创造多个确实的ArrayList,你应有:

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

关于这么些点子越来越多的表明,请参见小编事情未发生前的一篇小说

 

 

 

 

 

5.施用原有会集类型

在Java之中,原始类型和无界通配符类型相当的轻巧混合在一块儿。以Set为例,Set是三个原始类型,而Set<
? >
是二个无界通配符类型。
思考下边接收原始类型List用作参数的代码:

?

1
2
3
4
5
6
7
8
public static void add(List list, Object o){
    list.add(o);
}
public static void main(String[] args){
    List<String> list = new ArrayList<String>();
    add(list, 10);
    String s = list.get(0);
}

上边的代码将会抛出极其:

?

1
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...

选取原有群集类型是很危急的,因为本来集结类型跳过了泛型类型检查,是不安全的。SetSet<
? >
Set< Object >中间有十分的大差距。请参见Raw type vs.
Unbounded
wildcard和Type
Erasure。

 

3.在循环之中删除列表的要素

思考上边包车型大巴代码,该代码在循环之中删除成分

?

1
2
3
4
5
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
    list.remove(i);
}
System.out.println(list);

输出如下:

?

1
[b, d]

上边的秘诀有叁个严重的难题。当五个成分被移除后,列表的深浅减小了,索引也就变了。所以指望采纳索引在叁个周而复始之中删除多少个成分是做不到的。
你只怕驾驭利用迭代器在一个循环之中删除成分是人之常情的方法,而且知道Java的foreach巡回很像三个迭代器,但并非。考虑上面包车型大巴代码:

?

1
2
3
4
5
6
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
 
for (String s : list) {
    if (s.equals("a"))
        list.remove(s);
}

它将会抛出特别ConcurrentModificationException。
上面的代码是能够的:

?

1
2
3
4
5
6
7
8
9
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();
 
    if (s.equals("a")) {
        iter.remove();
    }
}

.next()艺术必得在调用.remove()方法此前调用。在foreach循环之中,编写翻译器会先调用.remove(),再调用.next(),进而形成万分ConcurrentModificationException。你也许想知道ArrayList.iterator()的源代码。

 

随笔列出了Java开垦者最常犯的是个谬误。

4.HashTable vs HashMap

听说算法的预订,HashTable是其一数据布局的名字,但在Java里边,HashMap是以此数据布局的名字。Hashtable和
HashMap的一个关键性的不等是,HashTable是同步的,而HashMap不是。所以平日无需HashTable,HashMap用的越来越多。
HashMap vs. TreeMap vs. Hashtable vs.
LinkedHashMap
Top 9 questions about Java
Maps

 

7.ArrayList vs LinkedList

当开拓者不知晓ArrayList和LinkedList的界其他时候,平时会选用ArrayList,因为它看起来更熟练。可是,两个之间有十分大的属性差距。简单地说,当有雅量的插入/删除操作何况未有太多的率性访谈操作的时候,应该使用LinkedList。假设对此不太精通,可参看ArrayList
vs.
LinkedList。

10.”“依旧布局函数?

有三种方式组织字符串:

?

1
2
3
4
//1. 利用双引号
String x = "abc";
//2. 利用构造函数
String y = new String("abc");

 

分别在哪? 下边包车型客车例子能够交到三个赶快的答案:

?

1
2
3
4
5
6
7
8
9
String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True
 
String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

 

有关它们内部存款和储蓄器分配的更加多细节,请参照他事他说加以考察Create Java String Using ”” or
Constructor?

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图