`
Everyday都不同
  • 浏览: 720515 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

【总结】关于List的一些容易出错的地方

阅读更多

1.关于list.isEmpty

只要有list.add操作。即使是list.add("") (1次或若干次),list.isEmpty也是返回false; 如果你仅仅是声明一个List,而没有add操作,则list.size=0 并且list.isEmpty才会返回true;

 

2.list转Array(数组)

拿List<String>集合转String[]数组来说,你不能直接用String[] strs = (String[])list.toArray()。虽然这样做,编译的时候可以通过,但是运行的时候会报异常:

[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;  所以最好这样做:String[] strs = list.toArray(new String[list.size()]);

 

3.Array转List

最常见的1种情况是:String[]转List<String> list,而String[]又来源于1个字符串根据","分隔。问题来了,当该字符串是空串的时候,即使执行split(",")方法,也不会报错。如果你

直接把空串split操作后的String数组转成List<String>,则该集合的size为1,而不为0(这也是我栽了跟头的地方,)

如运行以下代码,打印结果会是:1 false

String str = "";
String[] strs = str.split(",");
List<String> list = Arrays.asList(strs);
System.out.println(list.size());
System.out.println(list.isEmpty());

 ps:我之前一直以为是 0 true。。。。。)

而且即使当该字符串为不为空串时,split得到的就是1个元素为他的数组,该数组长度为1

String str = "sd";
String[] strs = str.split(",");
System.out.println(Arrays.toString(strs));//注意打印数组元素的方法,不能直接打印他的变量哈

 

打印结果为:[sd] 

 

更为合理的改动是:

List<String> list = null;
if(!str.equals("")) {
    String[] ids = appIps.split(",");
    list = Arrays.asList(ids);//用户传过来的,所选择的集合
}else{
    list = new ArrayList();
}

 4.数组和ibatis相关:sql语句是in(..)  括号里期待后台传的是一个形如'str1', 'str2', 'str3',……的字符串,我们可以给它直接传一个字符串数组而非字符串集合的toStirng格式

 

5.两个个集合取交集、差集

java.util.List<String> l = new ArrayList<String>();
l.add("server7");
l.add("server2");
l.add("server9");
l.add("server62");
l.add("server23");
List<String> tmp = new ArrayList<String>();
tmp.addAll(l);

java.util.List<String> l2 = new ArrayList<String>();
l2.add("server23");
l2.add("server7");
l2.add("server6");
l2.add("server9");

boolean bool1 = l.containsAll(l2);
boolean bool2 = l2.containsAll(l);
tmp.retainAll(l2);//取交集得到tmp
//		System.out.println(bool2 && bool1);
l2.removeAll(tmp);
System.out.println("list和list2的交集:" + tmp.toString());
l.removeAll(tmp);
System.out.println("list里有而list2里沒有的:" + l.toString());
System.out.println("list2里有而list里沒有的:" + l2.toString());

 打印结果如下:

list和list2的交集:[server7, server9, server23]

list里有而list2里沒有的:[server2, server62]

list2里有而list里沒有的:[server6]

 

6.比较两个集合元素是否一样?

list1.containsAll(list2) && list2.containsAll(list1);

返回true表示元素一模一样,false则表示不一样

 

7.如果由Arrays.asList(array)得到的list,再去执行add remove retainAll removeAll remove contains等操作,编译时可以通过,运行时却会出现异常如下:

java.lang.UnsupportedOperationException

at java.util.AbstractList.remove(AbstractList.java:161)

at java.util.AbstractList$Itr.remove(AbstractList.java:374)

at java.util.AbstractCollection.removeAll(AbstractCollection.java:373)

Arrays.asLisvt() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等method

 在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,

 但是Arrays$ArrayList没有override remove(int),add(int)等,所以throw UnsupportedOperationException。

 

 解决办法:将Arrays$ArrayList转成ArrayList即可

 List<String> list2 = Arrays.asList(ids);
 List<String> list = new ArrayList(list2);

  再用list去执行add remove retainAll removeAll remove contains等操作即可。

===============    持续补充中。。。  ======================

4
3
分享到:
评论
1 楼 戢_时光 2015-09-08  
 

相关推荐

    vc编程系列之Addison Wesley - More Exceptional C++

    C++的异常处理机制允许程序员在程序运行期间处理错误情况,而不必在每个可能出错的地方都进行繁琐的错误检查。通过理解`try`、`catch`和`throw`关键字,开发者可以构建更健壮的程序,能够优雅地处理运行时错误,而...

    WPF 对象初始化器_1 对象初始化器_1

    这种方式不仅繁琐,而且容易出错。对象初始化器则提供了一种更简洁、更易读的方式来初始化对象及其成员。 #### 二、对象初始化器应用场景 1. **简化初始化流程**:当需要初始化多个属性时,对象初始化器可以减少...

    lmh-单元测试1

    边界值分析则关注于输入数据边界附近的值,因为这些地方往往容易出错。 测试脚本的实现通常使用Java语言,结合JUnit或Mockito等库来模拟驱动代码(Drive)和桩代码(Stub)。这样可以隔离待测试函数,避免依赖其他...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    json转换JavaBean

    这需要编写大量的解析代码,效率较低且容易出错。例如,你可以使用`org.json`库的`JSONObject`和`JSONArray`类来解析JSON,并通过反射机制设置JavaBean的属性。 ```java import org.json.JSONObject; public class...

    使用Ajax或Easyui等框架时的Json-lib的处理方案

    首先,每次都需要手动添加字段,容易出错且不易维护。其次,如果多个地方需要转换同一种类型的对象,代码会变得重复,降低了代码的可重用性。 ### Json-lib处理方案 为了解决这些问题,我们可以引入Json-lib库,它...

    Git权威指南.txt

    - 在版本控制系统的出现之前,软件开发者通常采用手动复制文件的方式来保留不同版本的信息,这种方式非常低效且容易出错。 - **1.2 CVS——开启版本控制大爆发** - CVS (Concurrent Versions System) 是第一个...

    Activiti6.0教程例子下载

    工作流引擎解决的就是这个问题:如果应用程序缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。 1.2. BPMN2.0规范 BPMN(Business Process Model and Notation)--业务流程模型与符号。 BPMN是...

Global site tag (gtag.js) - Google Analytics