美文网首页Java
8个JAVA程序员容易犯的技术错误

8个JAVA程序员容易犯的技术错误

作者: 一个小素 | 来源:发表于2019-08-20 14:49 被阅读1次

都说Java语言是一门简单的编程语言,基于C++演化而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错。那么对于广大的Java程序员来说,它们最常犯的10个错误是什么呢?

  1. 字符串对象的两个构建方式Java中的字符串对象具有两个常见的创建方式:
//1. use double quotesStringx="abc";
//2. use constructorStringy=newString("abc");

它们之间的区别是什么呢?我们再看一下如下的代码:

Stringa="abcd";
Stringb="abcd";
System.out.println(a==b);
TrueSystem.out.println(a.equals(b));
TrueStringc=newString("abcd");
Stringd=newString("abcd");
System.out.println(c==d);
FalseSystem.out.println(c.equals(d));
True

2、可变 vs 不可变
  不可变的对象具有非常多的优势,比如简单,安全等。但是,对于每一个不同的值,都需要该类的一个对象。而且,生成很多对象带来的问题就是可能导致频繁的垃圾回收。所以,在选择可变类还是不可变类时,应该综合考虑后再做抉择。
  通常而言,可变对象可以避免创建大量的中间对象。一个非常经典的例子就是链接大量的短String对象为一个长的String对象。如果使用不可变String类,链接的过程将产生大量的,适合立即被垃圾回收的中间String对象,这将消耗大量的CPU性能和内存空间。此时,使用一个可变的StringBuilder或StringBuffer才是正确的。
Stringresult="";for(Strings:arr){result=result+s;}
  除了上述情况,可变对象在其他场景下可能由于不可变对象。比如,传递一个可变的对象到方法内部,利用该对象可以收集多个结果,而不用在多个循环层次中跳进跳出。
  3、ArrayList vs LinkedList
  很多的Java初学者不明白ArrayList与LinkedList之间的区别,所以,他们完全只用相对简单的ArrayList,甚至不知道JDK中还存在LinkedList。但是,在某些具体场景下,这两种List的选择会导致程序性能的巨大差异。简单而言:当应用场景中有很多的 add/remove 操作,只有少量的随机访问操作时,应该选择LinkedList;在其他的场景下,考虑使用ArrayList。
  4、
  访问权限
  很多的Java初学者喜欢使用 public 来修饰类的成员。这样可以很方便地直接访问和存取该成员。但是,这是一种非常糟糕的编程风格,正确的设计风格应该是尽可能降低类成员的访问权限。
  5、在Collection中使用原始类型
  在Java中,很容易把原始类型与无限通配类型混淆。我们举个Set相关的例子:Set就是原始类型;Set就是无限通配类型。我们看一个使用在List中使用原始类型的例子:

publicstaticvoidadd(Listlist,Objecto){
    list.add(o);
}
publicstaticvoidmain(String[]args)
{
    Listlist=newArrayList();
    add(list,10);
    Strings=list.get(0);
}

这个示例代码会抛出来一个异常:Exceptioninthread"main"java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.Stringat...
  在Collection使用原始类型是具有很多的类型错误风险的,因为原始类型没有静态类型检查。实际上,Set、Set和Set之间具有非常大的差异。
  6、Hashtable vs HashMap
  学习过数据结构的读者都知道一种非常重要的数据结构叫做 哈希表。在Java中,对应哈希表的的类是 HashMap 而不是 Hashtable。HashMap与Hashtable之间的最核心区别就是:HashMap是非同步的,Hashtable是同步的。
  7、数组是否包含特定值
  为了检查数组中是否包含某个特定值,很多Java程序员会使用如下的代码:
  Setset=newHashSet(Arrays.asList(arr));returnset.contains(targetValue);
  就功能而言,该代码是正确无误的,但在数组转List,List再转Set的过程中消耗了大量的性能。我们可以优化成如下形式:
Arrays.asList(arr).contains(targetValue);
  或者,进一步优化成如下所示最高效的代码:
  for(Strings:arr){if(s.equals(targetValue))returntrue;}returnfalse;
  8、数组转ArrayList
  为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码:
  Listlist=Arrays.asList(arr);
  Arrays.asList确实会返回一个 ArrayList对象,但是该类是 Arrays类 中一个私有静态内部类,而不是常见的 java.util.ArrayList类。这个 java.util.Arrays.ArrayList 类具有 set(),get(),contains()等方法,但是不具有任何添加或移除元素的任何方法。因为该类的大小(size)是固定的。为了创建出一个真正的 java.util.ArrayList,代码应该如下所示:
  ArrayListarrayList=newArrayList(Arrays.asList(arr));
  我们知道,ArrayList的构造方法可以接受一个 Collection 类型的对象,而我们的 java.util.Arrays.ArrayList 正好也是它的一个子类。实际上,更加高效的代码示例是:
  ArrayListarrayList=newArrayList(arr.length);Collections.addAll(arrayList,arr);
  以上是通过总结出Java程序员最常犯的8大错误,可以有效地帮组Java后来者少走弯路,少加班,并写出更健壮的应用程序。

------完结------
感谢你的阅读,点赞、关注一下再走吧!!!

相关文章

  • 8个JAVA程序员容易犯的技术错误

    都说Java语言是一门简单的编程语言,基于C++演化而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序...

  • 高级程序员和普通程序员有哪些区别?

    先不说高级。 就只说初级程序员经常容易犯的错误,把这些错误改正了,你离中级就不远了。 初级程序员经常犯的错误集锦 ...

  • Java程序员开发最容易犯的几种错误

    1.DuplicatedCode 代码重复几乎是最常见的异味了。它也是Refactoring的主要目标之一。代码重...

  • 盘点新生程序员容易出现的几大错误

    盘点新手程序员容易出现的错误 前言:新手程序员基本上都会犯的错误盘点,很多人刚开始写代码都是迫不及待的项目一到手就...

  • Java开发最容易犯的几种错误

    1.Duplicated Code 代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码...

  • Java中的Unsafe

    简介 Java是一种安全的编程语言,可以防止程序员犯许多愚蠢的错误,其中大多数错误都是基于内存管理的。但是,有一种...

  • 日常踩坑:并发与一致性!

    推荐阅读:2020年跳槽阿里天猫,难度系数超高的Java六面!列举日常工作开发中最容易犯的并发错误,并基于这些错误...

  • 常容易犯的错误

    人都很容易犯同一个错误:对陌生人太客气,而对亲密的人太苛刻。 在外面,就常遇到这样类似的情景: “你快点行不行!?...

  • 最容易犯的错误

    历史中能写出传记的大多数都是成功了的人,于是很多人从他们身上学到了很多方法和品质。 然而,像我这般自认为没什么天赋...

  • 程序员面试时容易犯的7个错误,别被坑了!

    程序员面试时容易犯的7个错误,别被坑 除了基本技能测试外,程序员在面试过程中还会遇到各种问题。虽然这些问题看似简单...

网友评论

    本文标题:8个JAVA程序员容易犯的技术错误

    本文链接:https://www.haomeiwen.com/subject/ufrpsctx.html