澳门新葡萄京官网注册 2

Java程序员容易犯的10个错误

1. Array 转 ArrayList

貌似开荒者钟爱用:

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

Arrays.asList(State of Qatar会再次来到三个ArrayList,这是Arrays里内嵌的一个个体静态类,而并非java.util.ArrayList类java.util.Arrays.ArrayList
有set(卡塔尔(قطر‎, get(卡塔尔,
contains(卡塔尔方法,但并协助添日币素,所以大小是定点的,想要创设一个实在的ArrayList,你应该:

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

有关那些点子愈来愈多的解释,请参见笔者事情发生从前的一篇小说

 

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;

率先种艺术比第两种的可读性越来越好。

 

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();
    }
}

小说列出了Java开荒者最常犯的是个谬误。

4. Hashtable vs HashMap

在算法中,哈希表是数据布局的称谓。但在Java中,数据构造的名字是HashMap中。个中三个Hashtable和HashMap的里边的重大差异是,Hashtable是一块的。所以,非常多时候,你并无需哈希表,HashMap就丰裕了。

 

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

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的三个祖先类。

 

6.探问权限

有的是开拓者使用public修饰类的字段,那样相当轻易取得字段值,但那是二个不佳的规划。经历准绳是给客商尽只怕低的拜见权限。

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;

先是个比第三个的可读性越来越好。

 

7.ArrayList vs. LinkedList

相当多的开拓者并不知道ArrayList和LinkedList
的界别,所以日常使用ArrayList,那些看起来更熟练。可是,在这两个之间,有一个相当的大的属性差距。

简易的话,在有众多布署和删除操作时,同期有超少或许大约未有轻巧访谈的操作情状下,推荐应用LinkedList。其次,再使用ArrayList。

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()的源代码。

 

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

不可变对象有超级多优势那样轻便,安全,等等。但它对于每二个两样的变量,须求三个独门的对象。太多的指标或者会变成高花费的废料搜集。所以在甄选可变和不可变的时应该有个衡量。

平时的话,使用可变对象,避防止生出过多的中游对象。三个经文的例子就是连接大量的字符串。倘使选取不可变的String,你会发生众多当下要被垃圾搜集回笼的目的,那很耗时和生命力。即使利用二个不可变的,相似StringBuffer。

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

可变对象还会有别的的例子:函数字传送参的长河中,可以流传可变对象,那样可以博得多少个结实。

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

9.父类和子类的创设

澳门新葡萄京官网注册 1

编译出错的缘故根本是私下认可的Super类的布局函数并未被定义。在Java中,要是三个类未有落到实处布局函数,编写翻译器暗许会给那个类插入三个无参布局函数。若是在父类中早就有了结构函数,那么编写翻译器将不会再插入暗中认可无参构造函数。

子类的构造函数,要么是带参的依旧是无参的,都会调用父类的无参构造。因为编写翻译器想在子类中,参加super(State of Qatar,然而父类的无参构造函数并海市蜃楼。所以,编写翻译器会报错。

为了减轻这些难点,有三种消除办法,第一,在Super类中,插手无参布局:

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

第三种艺术,移除自定义的父类构造函数

其两种办法,子类的布局函数中参预super(value卡塔尔(قطر‎

 

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是三个原始类型,而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。

 

6.走访品级

开辟者平时应用Public作为类的修饰符,那样能够十分轻易的通过直接引用获得值,但那是叁个特糟糕的宏图。依照经历,分配给成员的拜谒品级应竭尽的低。
public, default, protected, and
private

 

7.ArrayList vs LinkedList

当开荒者不明了ArrayList和LinkedList的分其余时候,平日会动用ArrayList,因为它看起来更纯熟。可是,两个之间有一点都不小的性质差别。轻巧地说,当有雅量的插入/删除操作並且未有太多的随机拜望操作的时候,应该使用LinkedList。借使对此不太领悟,可参照ArrayList
vs.
LinkedList。

 

8.可变与不可变

不可变对象有不菲的亮点,比如简单,安全等等。可是对于每一个不一的值都要有四个单独的指标,过多的目的产生垃圾堆回收的高消耗。当选择可变与不足变时应该有一个权衡。
日常意况下,可变对象能够用来幸免发生过多的高级中学级对象。多个经文的实例就是连接多量的字符串,假若应用不可变的字符串,将会发出大批量的内需张开垃圾回笼的对象。那会浪费CPU大批量的小时,使用可变对象才是不错的方案(举个例子StringBuilder)。

?

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

在其它的一些景况下也是内需利用可变对象的,举例将可变对象作为参数字传送入方法能够使您没有必要运用过多语句便得以获得八个结实。其它一个例证是排序和
过滤:当然,你能够写几个方法来收取原始的集聚,何况重临二个排好序的聚焦,不过这样对于大的聚焦就太浪费了。(来自StackOverFlow的dasblinkenlight的答案)。
Why String is
Immutable?

 

9.父类和子类的布局函数

澳门新葡萄京官网注册 2
因为从没概念父类的暗中认可布局函数,在编写翻译的时候会爆发错误。在Java里边,假使一个类未有概念构造函数,编写翻译器将会插入二个无参数的私下认可布局函数。如若在父类里边定义了三个布局函数,在这里例中即Super(String
s)
,编写翻译器将不会插入暗中同意的无参数布局函数。那就是地点示例中父类的情状。
子类的布局函数,不管是不曾参数还应该有有参数,都会调用父类的无参布局函数。因为编写翻译器试图把super()插入到子类的七个布局函数中。可是父类暗中认可的布局函数未定义,编写翻译器就能够报出这些错误新闻。
要修复那几个主题素材,能够轻易的经过1卡塔尔(قطر‎在父类中加多三个Super(卡塔尔(قطر‎结构方法,就如那样:

?

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

大概2卡塔尔国移除自定义的父类构造函数,或许3卡塔尔在子类的构造函数中调用父类的super(value卡塔尔(قطر‎。
Constructor of Super and
Sub

 

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?

 

后天的办事

这一个列表是本人依照大气的GitHub上的开源项目、Stack
Overflow上的标题和局地宽广的谷歌(Google卡塔尔国寻找获得的。未有鲜明示的评估注解它们是准确的前10,但它们相对是冷的刺骨眼观望的主题素材。假如您不容许任一部
分,请留下您的评价。假若你能建议任何一些科学普及的乖谬,小编将会特别多谢。

翻译自:Top 10 Mistakes Java Developers
Make

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注