【本文来自优优码:http://www.uucode.net/201406/ten-issue-for-java】,好东西就是要拿来分享

1. Array 转为 ArrayList

很多人会这么写:

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

但是要知道,虽然Arrays.asList()是这么实现的:

1
2
3
public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

但是这里的ArrayList是Arrays的一个static 静态类,不是java.util,ArrayList
所以,应该这么写:

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

2. 判断是否数组里含有某个值

1
2
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

上面的写法虽然可以工作,但是没必要转为set呀,应该这么写:

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

3. 在循环里移除List的元素

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]

当然,如果你用了for也是不行的:

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

4. Hashtable 和 HashMap

Hashtable和HashMap内在的算法其实是差不多的。但是他们所处于的类族不同,一个在Collection里,一个在Dictionary里。
当然,最关键是的是Hashtable是同步的,而HashMap 不是。但一般来说,你还是用HashMap 吧!

5.使用原始类型的集合

Java5开始支持了泛型,但是很多人可能都不懒得用。喜欢什么Set这种的。考虑以下代码:

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

上面的代码可以编译通过,但是在运行时会有
Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at …
原因就是因为使用raw type,因此在编译时得不到类型检查。

6. 访问级别

不要偷懒 在属性上使用public,这样你不好控制权限。在什么时候被修改,你都不知道。

7. ArrayList vs. LinkedList

参考 《Java程序性能优化》吧!有详细的说明。这里不多说了。一个比较基础的问题

8. 可变和不可变

记住,String是不可变的。就是说当

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

当你这么做的时候,其实你在不断的产生新的String,而不是修改同一个String。但是,JDK会在编译时做优化,把上面的代码用StringBuilder重新实现一下。具体也可以参考《Java程序性能优化》

9. 子类和父类的构造函数

在Java中,一个类如果没有申明构造函数,Java会自动生成一个不带参数的构造函数。但是,如果已经声明了一个,Java就不会再生成那个构造函数了。
但是不幸的是,子类总是会调用父类的无参构造函数,所以,请一定要让父类有一个无参的构造函数,保证你编译能通过。

10. String使用””还是new

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

这个也不多少了,String不可变已经常量池的问题。这里注意String还有一个方法是intern(),返回常量池的引用。
我又要提《Java程序性能优化》了,里面有对String的说明,讲过这个问题。有兴趣的读者可以去看看。

Java程序员要注意的10个问题————————好东西就是要拿来分享的更多相关文章

  1. Java程序员应该掌握的10项技能

    这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下   1.语法:必须比较熟悉,在写代码的时候ID ...

  2. Java程序员常犯的10个错误

      本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> lis ...

  3. 作为Java程序员应该掌握的10项技能

    本文详细罗列了作为Java程序员应该掌握的10项技能.分享给大家供大家参考.具体如下: 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知 ...

  4. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. Java程序员应该知道的10个Eclipse调试技巧

    Eclipse是众多Java程序员实用的开发工具,其中开发技巧也是繁多,但作为优秀的Java程序员,需要掌握最起码的调试技巧. 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 ...

  6. (转)Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  7. Java程序员应该了解的10个设计原则

    引用: http://www.cnblogs.com/leehongee/archive/2012/03/18/2404760.html 面向对象设计原则是OOPS(Object-Oriented P ...

  8. [译]Java 程序员应该了解的 10 个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

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

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...

随机推荐

  1. [分享·JavaScript]提取Table中的内容到XML对象

    在公司工作的时候,经常需要在前端进行这样的数据提取的操作.而之前的针对每个页面中的Table都重新写原生的JS代码效率太低,且不方便aspx对XML进行处理. 所以,在今天抽时间写了这么一个JS类,见 ...

  2. 在使用 AjaxFileUpload 上传文件时,在项目发布到 iis 后,图片不能预览

    在使用 AjaxFileUpload  上传文件时,图片已经上传成功了,在站点没有发布时,可以预览,可是在项目发布到 iis 后,图片就不能预览,在网上找了很多的方案也没解决,最后的解决方案如下: 1 ...

  3. 查看linux占用内存/CPU最多的进程

    可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 可以使用一下命令查使用CPU最多的10个进程 ps -aux | sort -k3nr ...

  4. hive安装(一)

    1.解压 [root@cluster3 hadoop]# tar -zxvf apache-hive--bin.tar.gz 2.修改环境变量 export HIVE_HOME=/usr/local/ ...

  5. 洛谷P1459 三值的排序 Sorting a Three-Valued Sequence

    P1459 三值的排序 Sorting a Three-Valued Sequence 166通过 369提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 那么 ...

  6. WM_INITDIALOG与WM_CREATE消息的区别

      WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕(可以安全的使用这个窗口了,例如在它上面画控件等).在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说 ...

  7. MongoDB 2: 安装和使用

    导读:上篇博客中简单介绍了MongoDB,本篇文章主要是介绍Mongo的安装和使用(环境为win8).(PS:这是一篇没什么技术含量的文章,仅是个人的笔记式文档)下一篇博客,将介绍Mongo使用过程中 ...

  8. jQuery插件之Cookie

    一.jQuery.Cookie.js插件是一个轻量级的Cookie管理插件. 特别提醒,今日发现一个特别的错误,google浏览器提示:has no method $.cookie.火狐浏览器提示:$ ...

  9. WP8_检测列表是否滑动

    One of the UI features of lists on Windows Phone 7 is that the "scroll bars" don't really ...

  10. ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.

    这个问题, 估计是由于  在 64位系统上运行 C#.net 项目的问题. 试试,将项目 生成属性 中的 平台改成  X86  编译重新发布试试