Java程序员要注意的10个问题————————好东西就是要拿来分享
【本文来自优优码: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个问题————————好东西就是要拿来分享的更多相关文章
- Java程序员应该掌握的10项技能
这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下 1.语法:必须比较熟悉,在写代码的时候ID ...
- Java程序员常犯的10个错误
本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> lis ...
- 作为Java程序员应该掌握的10项技能
本文详细罗列了作为Java程序员应该掌握的10项技能.分享给大家供大家参考.具体如下: 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- Java程序员应该知道的10个Eclipse调试技巧
Eclipse是众多Java程序员实用的开发工具,其中开发技巧也是繁多,但作为优秀的Java程序员,需要掌握最起码的调试技巧. 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 ...
- (转)Java程序员应该了解的10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- Java程序员应该了解的10个设计原则
引用: http://www.cnblogs.com/leehongee/archive/2012/03/18/2404760.html 面向对象设计原则是OOPS(Object-Oriented P ...
- [译]Java 程序员应该了解的 10 个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- Java 程序员容易犯的10个SQL错误
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
随机推荐
- Android——TableLayout
TableLayout的行数由开发人员直接指定,即有多少个TableRow对象(或View控件),就有多少行. TableLayout的列数等于含有最多子控件的TableRow的列数.如第一Table ...
- [Java] 我的Coding Style 总结
1. 缩进 采用4个空格的缩进方式 2. tab 不采用"hard" tab. 需要更改编辑器的默认配置.将tab值改成4个空格. 3. 换行 3.1 一行不超过75个字符 3.2 ...
- OpenWRT TP_LINK703N 校园网 锐捷认证解决办法
OpenWRT TP_LINK703N 校园网 锐捷认证解决办法 一.准备的工具 1) SSH登录工具,推荐使用MobaXterm_Personal下载链接https://moba.en.s ...
- Weblogic发布小问题——weblogic.descriptor.DescriptorException: VALIDATION PROBLEMS WERE FOUND
前几天发布应用时出现了如下所示的一段错误提示信息: weblogic.descriptor.DescriptorException: VALIDATION PROBLEMS WERE FOUND pr ...
- Iphone5S 体验(视频+截图)
Iphone5S眨眼从外观看和5区别不大,仔细一看后面,最大的变化还是闪光灯,内部使用了A7的处理器运算速度增强了不少.无论照相还是FaceTime摄像都非常清晰,就连常用的手电筒和动态天气预报都考虑 ...
- Alfresco安装与配置图解
Alfresco安装与配置图解 Alfresco是一款开源的企业内容管理系统(ECM),为企业提供了日常的文档管理.工作流(可以和企业目前的OA协同接合使用).工作记录管理.知识管理.网络内容管理.图 ...
- MFC常见问题解惑
MFC类的分类 1 Root: CObject : CObject2 Application Architecture Classes: CWinApp/CFrameWnd/... 3 Window, ...
- Leetcode005 Longest Palindromic Substring
o(n)算法地址:http://blog.163.com/zhaohai_1988/blog/static/2095100852012716105847112/ /* pivot varies whe ...
- TRMM数据的读取
编辑下头文件,就有投影信息,然后再转换成你需要的投影方式1) From the command line, type in, ENVI, 2) Click File|Open External Fil ...
- CSS3 伪类选择器 :nth-child()
:nth-child()可以选择某个的一个或多个特定的子元素,你可以按这种方式进行选择: :nth-child(length);/*参数是具体数字*/ :nth-child(n);/*参数是n,n从0 ...