2010-03-10 47 views
44

在Java中,如何在初始化之后创建一个ArrayList只读(以便无人添加元素,编辑或删除元素)?make ArrayList只读

回答

86

将ArrayList传递到Collections.unmodifiableList()。它返回指定列表的不可修改视图。只能使用这个返回的List,而不要使用原来的ArrayList。

+28

“...并且只使用返回的列表,从来没有原始的'ArrayList'”是一个非常重要的添加!将'ArrayList'传递给该方法不会奇迹般地改变对象。它只返回一个不可修改的包装。 – 2010-03-10 18:11:25

+0

@Joachim绍尔 - 伟大的一点! – 2010-03-10 18:23:40

+3

有时候你想保留原来的'ArrayList'。这可能是暴露对象内封装的类似List的类视图的一种很好的技术。对该对象的修改将更新'List'视图,但视图本身不接受任何修改。 – Matthew 2010-03-10 19:38:24

0

您确定要在这种情况下使用ArrayList吗?

也许最好先将所有信息填入ArrayList,然后在Java程序初始化时将ArrayList转换为最终数组。

+0

HI Jama,我发现Collections.unmodifiableList()这将以我想要的方式工作。尝试这种方法,它直接前进 – gmhk 2010-03-11 04:46:16

+0

好吧,我会...这太棒了! – Jama22 2010-07-05 03:55:44

2

将列表对象传递给Collections.unmodifiableList()。看下面的示例。

import java.util.*; 

    public class CollDemo 
    { 
     public static void main(String[] argv) throws Exception 
    { 
      List stuff = Arrays.asList(new String[] { "a", "b" }); 
      List list = new ArrayList(stuff); 
      list = Collections.unmodifiableList(list); 
      Set set = new HashSet(stuff); 
      set = Collections.unmodifiableSet(set); 
      Map map = new HashMap(); 
      map = Collections.unmodifiableMap(map); 
      System.out.println("Collection is read-only now."); 
     } 
    } 
0

传递的集合对象到其等效不可修改的功能集合类 下面的代码演示使用unmodifiableList的

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 


public class Temp { 

    public static void main(String[] args) { 

     List<Integer> objList = new ArrayList<Integer>(); 
     objList.add(4); 
     objList.add(5); 
     objList.add(6); 
     objList.add(7); 

     objList = Collections.unmodifiableList(objList); 
     System.out.println("List contents " + objList); 

     try { 
      objList.add(9); 
     } catch(UnsupportedOperationException e) { 
      e.printStackTrace(); 
      System.out.println("Exception occured"); 
     } 
     System.out.println("List contents " + objList); 
    } 

} 

同样的方式,你可以创建其他集合不可修改以及

  • 集合.unmodifiableMap(地图);
  • Collections.unmodifiableSet(set);