论坛首页 入门技术论坛

讨论Java的数组和集合操作

浏览 3619 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-13  

很简单的数组和集合操作. 在打印出结果之前, 请先预料一下, 注意一下注释和代码中红色的部分. 欢迎给出您的看法.  谢谢!   

java 代码
  1. public static void main(String[] args) {   
  2.         LabelValueBean[] lvBeans = new LabelValueBean[3];   
  3.         lvBeans[0] = new LabelValueBean("l0","v0");   
  4.         lvBeans[1] = new LabelValueBean("l1","v1");   
  5.         lvBeans[2] = new LabelValueBean("l2","v2");   
  6.            
  7.         Map<String, LabelValueBean> arrMap = new HashMap<String, LabelValueBean>();   
  8.            
  9.         arrMap.put("lv0", lvBeans[0]);   
  10.         arrMap.put("lv1", lvBeans[1]);   
  11.         arrMap.put("lv2", lvBeans[2]);   
  12.            
  13.         for(int i = 0;i < lvBeans.length;i ++) {   
  14.             logInfo("before: " + lvBeans[i].getLabel());   
  15.         }   
  16.   
  17.    /**  
  18.      *Collection 的 Object[] toArray() 方法有这样的注释:(注意加粗部分)  
  19.      *  
  20.      * Returns an array containing all of the elements in this collection.  If  
  21.      * the collection makes any guarantees as to what order its elements are  
  22.      * returned by its iterator, this method must return the elements in the  
  23.      * same order.<p>  
  24.      *  
  25.      * The returned array will be "safe" in that no references to it are  
  26.      * maintained by this collection.  (In other words, this method must  
  27.      * allocate a new array even if this collection is backed by an array).  
  28.      * The caller is thus free to modify the returned array.<p>  
  29.      *  
  30.      * This method acts as bridge between array-based and collection-based  
  31.      * APIs.  
  32.      *  
  33.      * @return an array containing all of the elements in this collection  
  34.      */  
  35.        
  36.   
  37.         Object[] lv1 = (Object[]) arrMap.values().toArray();   
  38.   
  39.         for(int i = 0;i < lv1.length;i ++) {   
  40.             LabelValueBean lv = (LabelValueBean)lv1[i];   
  41.             lv.setLabel("++");   
  42.             logInfo("Modifying: " + lv.getLabel());   
  43.         }   
  44.   
  45.         for(int i = 0;i < lvBeans.length;i ++) {   
  46.             logInfo("after: " + lvBeans[i].getLabel());   
  47.         }   
  48.     }   
  49.   
  50.     public static void logInfo(String str) {   
  51.         System.out.println("-----Info:\n " + str);   
  52.     }   

 

另: LabelValueBean 定义

java 代码
  1. public class LabelValueBean {   
  2.     private String label;   
  3.     private String value;   
  4.        
  5.     public LabelValueBean() {   
  6.            
  7.     }   
  8.        
  9.     public LabelValueBean(String label, String value) {   
  10.         this.label = label;   
  11.         this.value = value;   
  12.     }   
  13.   
  14.     public String getLabel() {   
  15.         return label;   
  16.     }   
  17.   
  18.     public void setLabel(String label) {   
  19.         this.label = label;   
  20.     }   
  21.   
  22.     public String getValue() {   
  23.         return value;   
  24.     }   
  25.   
  26.     public void setValue(String value) {   
  27.         this.value = value;   
  28.     }   
  29.   
  30. }  
   发表时间:2007-07-13  
打印出*改变后*的输出。


注释中所说的,
array安全,是指该array是一个copy(也就是,如果实际集合采用array实现,不能直接返回集合中的那个array,而应该重新创建,否则就是不安全的),不是指array中的元素是原元素的copy。

总之:
modify array,是指改变Array中的元素顺序,值类型数据,清空等等
相反的,仅仅改变array中的ref目标数据,不算改变array。

-------------
呵呵,让我想到了hibernate的关联缓存和对象缓存的问题,所以回复。

0 请登录后投票
   发表时间:2007-07-13  
Qieqie 写道
打印出*改变后*的输出。


注释中所说的,
array安全,是指该array是一个copy(也就是,如果实际集合采用array实现,不能直接返回集合中的那个array,而应该重新创建,否则就是不安全的),不是指array中的元素是原元素的copy。

总之:
modify array,是指改变Array中的元素顺序,值类型数据,清空等等
相反的,仅仅改变array中的ref目标数据,不算改变array。

-------------
呵呵,让我想到了hibernate的关联缓存和对象缓存的问题,所以回复。


Thanks a lot!
0 请登录后投票
   发表时间:2007-07-13  
呵呵,看看她的源码不就行了.

public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }


	public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

arraycopy的c代码我找了半天没找到,郁闷,不知道谁熟悉jvm源码的结构的,能告诉俺一下。

这里注释是指返回的数组将会是安全的,因为集合没有维持对它的引用。而是直接通过arraycopy copy了一个新数组。如果能看到arraycopy的c代码这些就更一目了然了.

0 请登录后投票
   发表时间:2007-07-13  
呵呵发个调试出来的图片!
  • 描述: 调试图片
  • 大小: 778.8 KB
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics