关键词:
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));
关于这个方法更多的解释,请参见我之前的一篇文章
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();
- }
- }
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
6.访问权限
很多开发者使用public修饰类的字段,这样很容易获取字段值,但这是一个糟糕的设计。经验法则是给用户尽可能低的访问权限。
7.ArrayList vs. LinkedList
大部分的开发者并不知道ArrayList和LinkedList 的区别,所以经常使用ArrayList,这个看起来更熟悉。但是,在这两者之间,有一个很大的性能差异。
简单来说,在有很多插入和删除操作时,同时有很少或者几乎没有随机访问的操作情况下,推荐使用LinkedList。其次,再使用ArrayList。
8.Mutable vs. Immutable(可变 VS 不可变)
不可变对象有很多优势这样简单,安全,等等。但它对于每一个不同的变量,需要一个单独的对象。太多的对象可能会导致高成本的垃圾收集。所以在选择可变和不可变的时应该有个权衡。
一般来说,使用可变对象,以避免产生过多的中间对象。一个经典的例子就是连接大量的字符串。如果使用不可变的String,你会产生很多立马要被垃圾收集回收的对象,这很消耗时间和精力。如果使用一个不可变的,类似
- StringBuffer。
- String result="";
- for(String s: arr){
- result = result + s;
- }
可变对象还有其他的例子:函数传参的过程中,可以传入可变对象,这样可以得到多个结果。
9.父类和子类的构建
编译出错的原因主要是默认的Super类的构造函数并没有被定义。在Java中,如果一个类没有实现构造函数,编译器默认会给这个类插入一个无参构造函数。如果在父类中已经有了构造函数,那么编译器将不会再插入默认无参构造函数。
子类的构造函数,要么是带参的要么是无参的,都会调用父类的无参构造。因为编译器想在子类中,加入super(),但是父类的无参构造函数并不存在。所以,编译器会报错。
为了解决这个问题,有两种解决办法,第一,在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
spring常犯的十大错误,打死都不要犯!
原文:https://www.toptal.com/spring/top-10-most-common-spring-framework-mistakes作者:ToniKukurin,译者:万想译文:www.cnblogs.com/liululee/p/11235999.html1.错误一:太过关注底层我们正在解决这个常见错误,是因为“非我所创”综合症在软件开发领域... 查看详情
java程序员常犯的10个错误
...而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错。那么对于广大的Java程序员来说,它们最常犯的10个错误是什么呢?本文通过总结出Java程序员最常犯的10大错误,可以有效地帮组Java后来者少走弯路,少加... 查看详情
看看这5个最容易犯的java错误,你犯了没?(代码片段)
...而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错。那么对于广大的Java程序员来说,它们最容易犯的几个错误是什么呢?接下来就一起来看看这些错误是否也是你经常犯的!1、重复造轮子一个明显的错误就... 查看详情
java初学者容易犯的代码错误
...触最多的异常,没有之一。原因是,你们拿到一个对象后容易不假思索的直接使用(直接给这个对象的属性赋值,直接调用这个对象的方法等),不报异常才怪呢!下面是最经典的判断空的例子:privatebooleanisEmpty(Stringstr){if(str==n... 查看详情
java程序员常犯的10个sql错误!
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准:技能(任何人都能容易学会命令式编程)模式(有些人用“模式-模式”,举个例子,模式可以应用到任何... 查看详情
避坑手册|java编码中容易踩坑的十大陷阱(代码片段)
大家好,又见面了。JAVA编码中存在一些容易被人忽视的陷阱,稍不留神可能就会跌落其中,给项目的稳定运行埋下隐患。此外,这些陷阱也是面试的时候面试官比较喜欢问的问题。本文对这些陷阱进行了统一的整理,让你知道... 查看详情
比较容易犯的一些智障错误(不定时修改)
无论在什么学习中,在成长的过程中,注定要犯一些错误,有些比较高级的错误,有些是比较智障的错误。那么在oi的学习中,我们最讨厌的就是一些智障的小错误,因为如果是大错误的话一般情况下在测试样例的时候都是能够... 查看详情
linux新手容易犯的7个错误
...和优先级,以及不同的做事方式。因此,新的Linux用户很容易混淆,因为他们使用Windows开发的期待结果不再适用。Linux新手容易犯的7个错误例如,下面就是很多Windows用户开始使用Linux的时候,会犯的7个错误 查看详情
java程序员们最常犯的10个错误
Java程序员们最常犯的10个错误 1.将数组转化为一个列表时,程序员们经常这样做: List<String>list=Arrays.asList(arr);Arrays.asList()会返回一个ArrayList对象,ArrayList类是Arrays的一个私有静态类,而不是java.util.ArrayList类,jav... 查看详情
应用程序开发人员犯的数据库开发错误[关闭]
...乎重复【参考方案1】:1.未使用适当的索引这是一个相对容易的事情,但它仍然会一直 查看详情
嵌入式软件容易犯的错误和规避方法总结
...入式软件设计缺陷的影子。那么捷配小编今天就把软件所容易犯的错误和规避的方法一一罗列,并给出应对之法。嵌入式软件的最大特点是以控制为主,软硬结合的较多,功能性的操作较多,模块相互间调用的较多,外部工作环... 查看详情
作为程序员必须注意的十大编程禁忌!
作为一名程序员,除了要技能好,还有注意在工作的过程中避免一些错误,我们除了可以从错误中吸取教训,还可以从前辈那里得到一些经验,避开这些我们会犯的常识性错误,提高自己的工作效率。一、不提升非技术技能我们... 查看详情
go十大常见错误第8篇:并发编程中context使用常见错误(代码片段)
...sacrossAPIboundariesandbetweenprocesses.光看这段描述,还是很容易让人迷糊的,我们接下来具体看看Context到底是什么以及可以帮助我们做什么事情。Context顾名思义,表示的是goroutine的上下文,Context定义如下所示://AC... 查看详情
真人踩过的坑,告诉你避免自动化测试新手常犯的10个错误
...学习总是更好的。作为一个自动化测试人员,分享常见的容易犯的10个错误,可以从中吸取教训,引以为鉴。一、必要时才自动化新人小王接到为Web应用程序自动化测试脚本的任务时,既高兴又紧张,因为这是他进入团队的第一... 查看详情
开发新手最容易犯的50个rubyonrails错误(代码片段)
...】本文最早发布与JETRuby博客,主要介绍了开发新手最容易犯的Ruby错误。文章系国内ITOM管理平台OneAPM编译呈现。一年前,我们创立了以“Rubyboost”为名的RubyonRails课程。简而言之,本课程的目标是使对编程了解不多的... 查看详情
开发新手最容易犯的50个rubyonrails错误(代码片段)
...】本文最早发布与JETRuby博客,主要介绍了开发新手最容易犯的Ruby错误。文章系国内ITOM管理平台OneAPM编译呈现。一年前,我们创立了以“Rubyboost”为名的RubyonRails课程。简而言之,本课程的目标是使对编程了解不多的... 查看详情
自学前端最容易犯的10个的错误,新手学前端快来看看
...平。3、不学习算法和数据结构:算法和数据结构是所有程序员必须学习的内容,前端开发也不例外。学习算法和数据结构可以帮助你更好地解决问题和构建更高效的代码。例如,了解常用的排序算法和搜索算法可以帮助你更快... 查看详情
php开发最容易犯的错误
阅读目录相关内容1在foreach循环后留下数组的引用2误解isset()的行为3关于通过引用返回与通过值返回的困惑4在循环中执行查询5内存使用欺骗与低效6忽略Unicode/UTF-8的问题7认为$_POST总是包含你POST的数据8认为PHP支持单字符数据类型... 查看详情