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程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
随机推荐
- python 爬取百度云资源
pan1 1 import urllib.request 2 import re 3 import random 4 5 def get_source(key): 6 7 print('请稍等,爬取中 ...
- A手机等的网络udp广播,收到广播以后回复udp消息
B手机:向A手机发送一条消息,等待A回复 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...
- (续篇3):飞测独家のJmeter秘籍,限量发放
好东西,分享大家,自上次分享出来fiddler导出jmx格式V4.0版本对外公开后,收到一些反馈,我们利用工作之余时间继续优化,现在一个比较稳定的版本出炉,分享给大伙,我们一起来看看. 特性说明: 版 ...
- 【最后一篇API译文】Android开发-API指南- Contacts Provider
Contacts Provider 今年加入了某字幕组,加之杂事颇多,许久未添新文了,惭愧之极. 在听闻 Google 即将重返中国后,近日忽又发现官方网站正在放出 API 中文版,比如本文.当然不是 ...
- 解决setInterval计时器不准的问题
在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在s ...
- C# ref和out的区别
首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...
- The str method
__str__ is a special method name, like __init__, that is supposed to return a string representation ...
- NSString用法
1 创造字符串 NSString *str1 = @"hello"; NSString *str2 = [NSString string]; NSString *str3 = [N ...
- 操作笔记:linux下安装ftp
1,安装ftp [root@iZ945sgm0ugZ ~]# yum install vsftpd 安装成功的信息: [root@iZ945sgm0ugZ ~]# yum install vsftpd ...
- PL/SQL中查询某的时间段内所有执行的sql
清空缓存,重新开始统计执行的SQL alter system flush shared_pool; 查询执行过的SQL select * from v$sql where parsing_schema ...