Java开发常见错误
2016-05-23 01:32
417 查看
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方法:
//转换成set Set<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,这样可以获取最高的访问权限,但是这样设计类是不合理的不符合开放封闭原则。相关文章推荐
- Java常见错误整理(一)
- java编写中常有的错误
- java多线程等待唤醒机制
- Eclipse添加maven依赖找不到maven库中的jar
- Java设计模式-观察者模式
- java 基础静态工厂
- java 实验二 Java基本语句(无脑实验系列)
- Java反射学习-使用反射修改一个类中的所有String类型的成员变量的值
- 获取Java工作目录问题
- Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案
- JAVA多线程实现的三种方式
- ubuntu eclipse 导入报错:JRE System Library[Unbound]
- 验证码,java
- java中的序列化以及好处
- Java中this运用
- Spring 配置详解
- 【java基础总结系列】:java 多线程3种实现方式
- 关于ubuntu16.4 中安装最新的eclipse或者是STS出现页面特卡,且新建项目没有提示,preference选项中点击左侧标签右侧没反应的解决办法,参照google, 排版不太好,希望对一些小伙伴有所帮助
- java 实验一Java开发环境(无脑实验系列)
- struts-2小练习