string[] 和 arraylist互转及问题解决 1,String 数组转成 list

xuanchen001 2017-12-14 03:22:25


String[] s={"1","2","3","5","6"};
List<String> listA = Arrays.asList(s);
String 数组在转成 list<String>后, 直接对该list进行操作, 会出异常,例如:

复制代码
public static void main(String[] args) {
String[] s={"1","2","3","5","6"};
List<String> listA = Arrays.asList(s);
listA.add(3,"4");
for(String temp:listA){
System.out.println(temp);
}
}
复制代码
运行时会抛出如下异常:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)

原因分析:

在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等 method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。

解决方法:
转换为ArrayList,例如上面代码改成如下:
复制代码
public static void main(String[] args) {
String[] s={"1","2","3","5","6"};
List<String> listA = Arrays.asList(s);
List<String> listB = new ArrayList<String>(listA);
listB.add(3,"4");
for(String temp:listB){
System.out.println(temp);
}
}
复制代码
运行结果:输出 1 2 3 4 5 6

PS: 这里顺便说明一下arraylist 的 remove() add() 特点

1)arraylist add时, 指定了index添加时,原本该index上的位置不会被删除, 而是从index位置上的数据都向右移。

2)arraylist delete时, 删除后, 该位置后面的所有数据自动向左移,所以遍历的时候, index需要-1 才不会漏掉, 或者直接从倒序遍历,

例如如下代码:

复制代码
public static void main(String[] args) {
String[] s={"1","2","2","3","5","6"};
List<String> listA = Arrays.asList(s);
List<String> listB = new ArrayList<String>(listA);
for(int i=0;i<listB.size();i++){
if (listB.get(i).equals("2")){
listB.remove(i);
}
}
for(String temp:listB){
System.out.println(temp);
}
}
复制代码
运行结果:输出 1 2 3 4 5 6 , 该原list index=2位置漏掉遍历,所以得到结果不符合预期

改成如下:

复制代码
public static void main(String[] args) {
String[] s={"1","2","2","3","5","6"};
List<String> listA = Arrays.asList(s);
List<String> listB = new ArrayList<String>(listA);

//1. Should reduce 1 once remove
for(int i=1;i<listB.size();i++){
if (listB.get(i).equals("2")){
listB.remove(i);
i--;
}
}
/**
* 2. reverse traversal
for(int i=listB.size()-1;i>=0;i--){
if (listB.get(i).equals("2")){
listB.remove(i);
}
}**/
for(String temp:listB){
System.out.println(temp);
}
}
复制代码
运行结果:输出 1 3 4 5 6



2, list<String>转成String 数组

String[] b = list.toArray(new String[list.size()]);


3,String数组直接转成string输出

Arrays.toString(数组名)
...全文
4274 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由自在_Yu 2017-12-14
  • 打赏
  • 举报
回复
public class Test {
	public static void main(String[] args) {
        String[] s={"1","2","3","5","6"};
        List<String> listA = new ArrayList<String>();
        for (int i = 0; i < s.length; i++) {
			listA.add(s[i]);
		}
        listA.add(3,"4");
        for(String temp:listA){
            System.out.println(temp);
        }
    }
}

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧