wangflood

精心维护一个技术blog,为了工作,也是爱好。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks
最近框架里那个method(Object...params)引发了一系列的不兼容反应,包括我的生理反应。。。
import java.util.ArrayList;
import java.util.List;

public class TestList {

    
public static void main(String[] args) {
        List
<String> list = new ArrayList<String>();
        list.add(
"wang");
        list.add(
"hello");
        list.add(
"world");
        
// list不能做为String params的参数
        
// test(list);
        
// 不能转换成功。why ?
        
//test((String[]) list.toArray());
        String[] arr = list.toArray(new String[list.size()]);
        test(arr);
        
//源码代看不太懂,toArray方法里面为什么不自己
        
//new String[list.size()];难道不是做缓冲的吗?
        String[] arr2 = list.toArray(new String[1]);//一个长度也成功。这不是耍我吗?
        test(arr2);
    }

    
public static void test(String params) {
        
for (int i = 0; i < params.length; i++) {
            System.out.println(params[i]);
        }
    }
}
1.为什么(String[])list.toArray()转换会出错。
2.实践证明list.toArray(new String[xx])括号里面的是用作缓冲的。当然分配得多速度就会快了。这个影响会有多大了。
   java这个设计再次让程序参与到性能中,JVM优化边界在哪?什么时候,我们需要考虑到分配一个和N的内存单元缓冲,在速度上的不同?
   这样的时候多吗?如果有,什么时候?

posted on 2011-03-29 20:43 wangflood 阅读(4066) 评论(3)  编辑  收藏 所属分类: java

Feedback

# re: List的toArray方法 2011-08-15 18:55 xp
1.向子类强制转型出错了
public Object[] toArray() {
int s = size;
Object[] result = new Object[s];
System.arraycopy(array, 0, result, 0, s);
return result;
}

toArray返回的是Object[],并不是List<String>。  回复  更多评论
  

# re: List的toArray方法 2011-08-15 19:02 xp
2.个人认为是:
list.toArray(new String[1]);
目的只是为了把类型传进去,使得返回的类型是String
当然String数组够大时,里面就不用重新new,

public <T> T[] toArray(T[] contents) {
int s = size;
if (contents.length < s) {
@SuppressWarnings("unchecked") T[] newArray
= (T[]) Array.newInstance(contents.getClass().getComponentType(), s);
contents = newArray;
}
System.arraycopy(this.array, 0, contents, 0, s);
if (contents.length > s) {
contents[s] = null;
}
return contents;
}  回复  更多评论
  

# re: List的toArray方法 2012-03-19 16:19 Spartan
list.toArray(new String[1])
是为了将类型穿进去,使得返回的类型是传进去的,在这个方法里它做了几步主要的工作:
1.判断穿进去的是否是Object类型,如果是new一个Object数组,如果不是那么使用反射生成一个空的类型为参数类型的数组,这个数组的每个内容都为空。
2.使用本地化方法拷贝内容给新数组。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: