当前位置: 首页 > 科技观察

Java程序员最容易犯的十大常见错误

时间:2023-03-12 01:14:26 科技观察

1。ArraytoArrayList一般开发者喜欢使用:Listlist=Arrays.asList(arr);Arrays.asList()会返回一个ArrayList,这是Arrays里面嵌入的一个私有静态类,不是java.util.ArrayList类java.util.Arrays.ArrayList有set(),get(),contains()方法,但它不支持添加元素,所以大小是固定的,要创建一个真正的ArrayList,你应该:ArrayListarrayList=newArrayList(Arrays.asList(arr));关于这个方法更多的解释可以参考我之前的文章http://www.cnblogs.com/tina-smile/p/5056174.html2.检查一个Array是否包含一个元素。通常,开发人员喜欢使用:Setset=newHashSet(Arrays.asList(arr));returnset.contains(targetValue);此代码可以工作,但它不会先将列表转换为集合,并且将列表转换为集合需要额外的时间。您可以使用以下更简单的方法:Arrays.asList(arr).contains(targetValue);或者for(Strings:arr){if(s.equals(targetValue))returntrue;}returnfalse;第一种方法比第二种方法更具可读性。3.要在循环中删除列表中的元素,请考虑以下方法:ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));for(inti=0;ilist=newArrayList(Arrays.asList("a","b","c","d"));for(Strings:list){if(s.equals("a"))list.remove(s);}会报ConcurrentModificationException。正确的应该是:ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));Iteratoriter=list.iterator();while(iter.hasNext()){Strings=iter.next();if(s.equals("a")){iter.remove();}}4.HashtablevsHashMap在算法中,哈希表是数据结构的名称。但是在Java中,数据结构的名称是HashMap。Hashtable和HashMap之间的主要区别之一是Hashtable是同步的。所以,很多时候,你不需要哈希表,HashMap就够了。5.使用原始类型的集合在Java中,原始类型和无限通配符类型很容易混合在一起。以Set为例,set是原始类型,set是无界通配类型。使用原始类型列表,考虑以下情况:,10);Strings=list.get(0);}这段代码会抛出错误:Exceptioninthread"main"java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.Stringat...使用是危险的原始类型集合一件事,因为它跳过了类属性检测并且是不安全的。设置、设置和设置6。Access很多开发者使用public来修饰类的字段,这样很容易得到字段值,但这是一个糟糕的设计。经验法则是为用户提供尽可能低的访问权限。7.ArrayListvs.LinkedList大多数开发者不知道ArrayList和LinkedList的区别,所以他们经常使用ArrayList,看起来比较眼熟。但是,两者之间存在很大的性能差异。简单的说,LinkedList在插入删除操作比较多,随机访问操作很少或者几乎没有的情况下推荐使用。第二,再次使用ArrayList。8.Mutablevs.Immutable(可变VS不可变)不可变对象具有简单、安全等诸多优点。但它需要为每个不同的变量创建一个单独的对象。过多的对象会导致代价高昂的垃圾回收。因此,在可变和不可变之间进行选择时应该进行权衡。通常,使用可变对象以避免创建过多的中间对象。一个典型的例子是连接大量的字符串。如果使用immutableString,会生成很多对象,马上就会被垃圾回收,既费时又费力。如果你使用不可变的,比如StringBuffer。Stringresult="";for(Strings:arr){result=result+s;}变量对象还有其他的例子:在函数参数传递的过程中,可以传入变量对象,从而得到多个结果。9、父类和子类的构造编译错误的主要原因是没有定义Super类的默认构造函数。在Java中,如果一个类没有实现构造函数,编译器会默认为该类插入一个无参构造函数。如果父类中已经有一个构造函数,那么编译器将不会插入一个默认的无参构造函数。子类的构造函数,无论有无参数,都会调用父类的无参构造函数。因为编译器要给子类加上super(),但是父类的无参构造函数不存在。因此,编译器会报错。为了解决这个问题,有两种解决方案。一是给Super类添加一个无参结构:publicSuper(){System.out.println("Super");}第二种方式是去掉自定义父类构造函数的第三种方法是添加super(value)10到子类构造函数。“”还是构造函数?有两种创建字符串的方法://1。使用双引号Stringx="abc";//2.使用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);//假System.out.println(c.equals(d));//真