Java开发常见错误
来源:互联网 发布:软件开发阶段工具 编辑:程序博客网 时间:2024/05/10 12:28
Arrays.asList()
List<String> list = Arrays.asList(arr);
Arrays.asList(arr)返回的list中的一个内部类—java.util.Arrays.ArrayList
而不是—java.util.ArrayList
这个类包含set(), get(), contains() 方法,但是不支持添加和移除元素。
private static class ArrayList<E> extends AbstractList<E> implements List<E>, Serializable, RandomAccess { ...}
不过asList支持重载java.util.Arrays.ArrayList
,正确的打开方式
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
判断数组是否包含某个元素
一般写法
for(String s: arr){ if(s.equals(targetValue)) return true;}return false;
但是这样的代码不具备可读性,我们想到集合Set里面包含contains方法:
//转换成setSet<String> set = new HashSet<String>(Arrays.asList(arr));return set.contains(targetValue);
但是这样还不够简洁,更好的方式
Arrays.asList(arr).contains(targetValue);
这就是为什么上一个问题中,Arrays要写一个内部类和实现一些方法
移除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);
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));for (String s : list) { if (s.equals("a")) list.remove(s);}
查看ArrayList源码,发现他的数组结构不能一边移除一边遍历
正确的打开方式
- 使用迭代器
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(); }}
2.倒序
for(int i=list.Count-1;i>=0;i--){ if(list[i]) { list.removeAt(i); }}
3.多线程环境下 使用CopyOnWriteArrayList
public static void main(String args[]) { List<String> list = new CopyOnWriteArrayList<String>(); list.add("A"); list.add("B"); for (String s : list) { if (s.equals("B")) { list.remove(s); } }}
4.LinkedList、Set呢
public static void main(String args[]) { LinkedList<String> llist = new LinkedList<String>(); llist.add("A"); llist.add("B"); for (String s : llist) { if (s.equals("B")) { llist.remove(s); } }}
因为它们没有使用数组作为基础数据结构,所以它们不存在这个问题
使用集合的原始类型
1.原始类型是不安全的,如下:
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);}
代码运行时将会抛出java.lang.ClassCastException
异常
2.Set和Set
public static void printSet(Set<?> s) { s.add(10);//this line is illegal for (Object o : s) { System.out.println(o); }}
但是修改成Set类型就不会报错
public static void printSet(Set s) { s.add("2"); for (Object o : s) { System.out.println(o); }}
但是这样使用又会存在最开始时候的风险
访问级别
因为贪图方便所有的访问级别都使用public,这样可以获取最高的访问权限,但是这样设计类是不合理的不符合开放封闭原则。
0 0
- java开发常见错误
- Java开发常见错误
- Java开发常见错误
- Java开发常见错误整理
- Java 开发原则和常见错误
- java开发常见配置错误解决办法
- php开发常见错误
- ios开发常见错误
- ios开发常见错误
- NDK开发常见错误
- Web开发常见错误
- 开发常见错误
- android开发常见错误
- iOS开发常见错误
- python开发常见错误
- Android 开发 常见错误
- Servlet开发常见错误
- iOS开发常见错误
- Hibernate_二级缓存_Demo
- 基于 Jenkins 快速搭建持续集成环境
- Jenkins+Gradle实现android开发持续集成、打包
- esayui给datagrid添加背景图片
- Servlet中文显示问号解决方法
- Java开发常见错误
- ajax异步请求,请求与响应顺序对不上
- eclipse 保持代码干净
- 获取Text文本的高度和宽度
- 160个CrackMe 001 Acid burn
- 快速幂 hdu5690 All X
- 关于Unity游戏的序列化
- Hortworks Hadoop 2.4.2安装、配置
- Unity实现json格式的序列化并发布