当前位置:网站首页 > 国际新闻 > 正文

三星s8,Java 程序员排行前 10 的过错,你有没有中?,雪的诗句

admin 0

  • Array转ArrayList
  • 判别一个数组是否包括某个值
  • 在循环内部删去List中的一个元素
  • HashTable与HashMap
  • 运用调集原始类型(raw type)神马
  • 拜访等级
  • ArrayList和Li上海神明电机有限公司nkedList
  • 可变与不bravotube可变
  • 父类和子类的结构办法
  • “”仍是结构办法
  • 未来作业霸爱魔君

这个列表总结了10个Java开发人员最常犯的差错。

Array转ArrayList

当需求把Array转成ArrayList的时分,开发人员常常这样做:

List list = Arrays.asList(arr);

Arrays.asList()会回来一个ArrayList,可是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类。jav窥阴器a.util.Arrays邱培龙.ArrayLis邪琉璃t类完成了set(), get(),contains()办法,可是并没有完成添加元素的办法(现实上是能够调用add办法,可是没有详细完成,只是抛出UnsupportedOperationException反常),因而它的巨细也是固定不变的。为了创立一个真实的java.util.ArrayList,你应该这样做:

ArrayList arrayLis三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句t = new ArrayList(Arrays.asList(arr));

ArrayList的结构办法能够接纳一个Collection类型,而java.util.Arrays.ArrayList现已完成了该接口。

判别一个数组是否包括某个值

开发人员常常这样做:

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

以上代码能够正常作业,三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句可是没有必要将其转换成set调集,将一个List转成Set需求额定的时刻,其实咱们能够简略的运用如下办法即可:

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

或许

for(String s: ar炸芋球r){
if(s.equals(targetValue))
return true;
}
return false;

榜首种办法可读性更强。

在循环内部删去List中的一个元素

考虑如下代码,在迭代期间删去元素:

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

成果打印:

[b, d]

在上面这个办法中有一系列的问题,当一个元素被删去的时分,list巨细减小,然后原先索引指向了其它元素。所以假如你想在循环里经过索引来删去多个元素,将不会正确作业。

你或许知道运用迭代器是在循环里删去元素的正确办法,或许你也知道foreach循环跟迭代器很相似,但现实状况却不是这样,如下代码:

ArrayList list = new ArrayList(Arrays.asLis三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句t("a", "b", "c","d"));
for (String s : list) {
if (s.eq三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句uals("a"))
list.remove(s);
}

将抛出ConcurrentModificationException反常。

可是接下来的代码却是OK的:

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

HashTable与HashMap

从算法的视点来讲,HashTable是一种数据结构称号。可是在Java中,这种数据结构叫做HashMap。HashTable与HashMap的一个首要的差异是HashTable是同步的,所以,一般来说,你会运用HashMap,而不是Hashtable。

更多信息:HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap Top 10 questions about Map

运用调集原始类型(raw type)

在Java中,原始类型(raw type)和无界通配符类型很简略让人混杂。举个Set的比如,Set是原始类型,而Set是无界通配符类型。

请看如下代码,add办法运用了一个原始类型的List作为入参:

public static void add(List list, Object o){
list.add(o);
}
public static vosw472id main(String[] args){
List list = new ArrayList();
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, 和Set这三个有很大的不吴悦彤同,详细请看:类型擦除和Raw type 托盘货架vs. Unbounded wildcard。


拜访等级

开发人员常常运用public润饰类字段,尽管这很简略让他人直接经过引证获取该字段的值,三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句但这是一个欠好的规划。依据经历,应该尽可能的下降成员特点的拜访等级。

相关阅览:public, default, protecte阿奇那塞斯黑什么意思d, and private

ArrayList和LinkedList

为什么开发人员常常运用ArrayList和LinkedList,却不知道他们之间的差异,由于它们看起来很像。可是它国润大宗们之间有着巨大的功能差异。简略的说,假如有许多的添加删去操作而且没有许多的随机拜访元素的操作,应该首选LinkedList。

相关阅览:ArrayList vs. LinkedList

可变与不可变

不可变目标有许多长处,如简略、安全等。可是关于每个不同的值都需求一个独自的目标,太多的目标会引起许多废物收回,因而在挑选可变与不可变的时分,需求有一个平衡。

一般,可变目标用于防止发生许多的中心目标,一个经典的比如是许多字符串的拼接。假如你运用一个不可变目标,将会立刻发生许多契合废物收回规范的情味按摩目标,这浪费了CPU许多的时刻和精力。运用可变目标是正确的解决方案(StringBuilder);

String result="";
for(String s: arr){
result = result + s;体智能徒手游戏三百种
}

别的,在有些其它状况下也是需求运用可变目标。例如往一个办法传入一个可变目标,然后搜集多种成果,而不需求写太多的语法。另一个比如是排序和过滤:当然,你能够写一个办法来接纳原始的调集,而且回来一个排好序的调集,可是那样关于大的调集就太浪费了。

更多阅览:Why String is Immutable??

Why we need mutable classes?

父类和子类的结构办法

之所以呈现这个编译差错,是由于父类的默许结构办法未界说。在Java中,假如一个类没有界说结构办法,编译器会默许刺进一个无参数的结构办法;可是假如一个结构办法在父类中已界说,在这种状况,编译器是不会主动刺进一个默许的无参结构办法,这正是以上demo的状况;

关于子类来说,不管是无参结构办法仍是有参结构办法,都会默许调用父类的无参结构办法;当编译器测验在子类中往这两个结构办法刺进super()办法时,由于父类没有一个默许的无参结构办法,所以编译器报错;

要修正这个差错,很简略:

1、在父类手动界说一个无参结构办法:

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

2、移除父类中自界说的结构办法

3、在子类中自己写上父类结构办法的调用;如super(value);

“”仍是结构办法

有两种创立字符串的办法:

//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 S三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句tring("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,但它们肯定是很常见的。假如您不同意任一部分,请 留下您的谈论。假如您能提出其它一些常见的差错,我将会十分感激。

译文链接:http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/

来历:http://t.cn/EJscOju


查找微信号(ID:芋道源码),能够获得各种 Java 源码解析。

而且,回复【书本】后,能够收取笔者引荐的各种 Java 从入门到架构的书本三星s8,Java 程序员排行前 10 的差错,你有没有中?,雪的诗句。

来吧,骚年~