String[] x = new String[100];
String[] y = new String[100];
y=x;
但这时改变了x的值,y的值也会变。

解决方案 »

  1.   

    呵呵,刚看完这一点。
    上面的回答都正确,thinking in java 中的例子就是想第二个那么写的
      

  2.   

    System.arraycopy(src,srcPos,dest,destPos,length)
      

  3.   


       String[] y = new String[100];
       for(int i = 0; i < 100; i++)
       {
          y[i] = x[i].clone();
       }
      

  4.   

    TO:楼主
    浅层copy   q7pb()  的方法就可以实现了TO wdman(天空) 
    x[i].clone(); 
    String类型好象没有这个功能吧
      

  5.   

    String[] x = new String[100];
    String[] y = new String[100];
    y=x;
    但这时改变了x的值,y的值也会变。其实
    String[] x = new String[100];
    String[] y;
    y=x;
    就行了;
      

  6.   

    一、改变的仅仅是引用,都指向s1
    String s1[] = { "a","f"};
    String s2[];
    s2 = s1;
    二、copy
    String s1[] = { "a","f"};
    String s2[] = new String[2];
    System.arraycopy(s1,0,s2,0,2);
    三、clone
    String s1[] = { "a","f"};
    String s2[] = new String[2];
    s2=s1.clone();
      

  7.   

    楼上的,String[] 没有clone这个功能呢
      

  8.   

    clone方法是Object的方法。
    在java中,Object是所有类的父类!
      

  9.   

    楼上的,您说的没错,
    clone方法是Object的方法。
    在java中,Object是所有类的父类!
    但是在对象调用clone()这个方法时,
    会检查此对象是否有实现Cloneable这个接口
      

  10.   

    我也正在奇怪,理论上确实如你所说。
    你编译一下:
    public class A
    {
    public static void main(String args[])
    {
    String s1[] = { "a","f"};
    String s2[] = new String[2];
    // s2 = s1;
    // System.arraycopy(s1,0,s2,0,2);
    s2=s1.clone(); for(int i= 0;i<s1.length;i++)
    {
    System.out.print(" ");
    System.out.print(s1[i]);
    }
    System.out.println();
    for(int i= 0;i<s1.length;i++)
    {
    System.out.print(" ");
    System.out.print(s1[i]);
    }
    }
    }
    事实上可以通过。以至于我也不明白!
      

  11.   

    --------------------Configuration: j2sdk1.4.1 <Default>--------------------
    C:\Documents and Settings\user\桌面\test\A.java:9: incompatible types
    found   : java.lang.Object
    required: java.lang.String[]
    s2=s1.clone();
                               ^
    1 errorProcess completed.
    -------------------------------------
    哈哈,楼上的
      

  12.   

    事实上你是正确的。可能是我的编译器或是其他问题!
    对于本题来说,实现一个cloneable接口也是很简单的。
      

  13.   

    哦,纠正一下。我的程序是没有问题的:
    Note that all arrays are considered to implement the interface Cloneable.也就是说数组是可以被看成已经实现了Cloneable接口的。可以直接调用。fog628(发粪涂墙) 编译出现的问题是类型不匹配,可改为:
    s2=(String[])s1.clone();
      

  14.   

    楼上的,我试过了,数组确实可以clone,
    对于对象数组采用的还是深层copy,
    ------------------------------------------楼主:
    y = (String[])x.clone();
    可以达到你要的结果,就是说y[0] = "fog";
    也不会改变x[[0]的值,
    如果是用System.arraycopy()的话,y[0] = "fog";
    之后x[[0]的值也成了"fog"
      

  15.   

    感谢各位进行深入地探究,终于找到了正确的方法。
    方法并不重要,重要的是我现在明白了clone()的用法,还知道了system.arraycopy()。
    分儿太少了,决定不结贴了。呵呵另外,to fog628(发粪涂墙),我用arraycopy作了一下,发现也不连带改变。请核对一下。
      

  16.   

    class ATest{
    private int a;
    ATest(int i){ a = i; }
    void set(int i) { a = i; }
    int get(){ return a; }
    }public class ArrayCopy{
    static void print(ATest[] s){
    for(int i = 0; i <s.length; i++ ){
    System.out.println(s[i].get());;
    }
    }
    public static void main(String args[]){
    ATest[] arr = new ATest[5];
    for(int i = 0; i < arr.length; i++ ){
    arr[i] = new ATest(i);
    }

    ATest[] arrCopy = new ATest[arr.length];

    System.arraycopy(arr, 0, arrCopy, 0, arr.length);

    System.out.println("befor updated");
    print(arrCopy); 
    print(arr);

    System.out.println("after updated");
    arrCopy[0].set(100);
    print(arrCopy);
    print(arr);
    }
    }
    楼主,我不应该拿String来作示范,因为它是一个特殊的东西,你不可以改变其内容的,你对String类型的变量: s = "fog"; 你实际并没有改变s所指向的内存空间的内容,而是将s指向的了一块新的内容为"fog"的内存空间,以上程序说明,执行了System.arraycopy之后,改变两个数组中的任意一个都会改变另一个的内容(String 除外)
      

  17.   

    class ATest{
    private int a;
    ATest(int i){ a = i; }
    void set(int i) { a = i; }
    int get(){ return a; }
    }public class Clone{
    static void print(ATest[] s){
    for(int i = 0; i <s.length; i++ ){
    System.out.println(s[i].get());;
    }
    }
    public static void main(String args[]){
    ATest[] arr = new ATest[5];
    for(int i = 0; i < arr.length; i++ ){
    arr[i] = new ATest(i);
    }

    ATest[] arrClone = (ATest[])arr.clone();

    System.out.println("befor updated");
    print(arrClone); 
    print(arr);

    System.out.println("after updated");
    arrClone[0].set(100);
    print(arrClone);
    print(arr);
    }
    }
    这个只是做了浅copy,和System.arraycopy差不多的效果
      

  18.   

    class ATest implements Cloneable{
    private int a;
    ATest(int i){ a = i; }
    void set(int i) { a = i; }
    int get(){ return a; }

    public Object clone(){
    Object o = null;
    try{
    o = super.clone();
    }catch(CloneNotSupportedException e){
    System.err.println("Can not clone");
    }
    return o;
    }
    }public class DeepClone{
    static void print(ATest[] s){
    for(int i = 0; i <s.length; i++ ){
    System.out.println(s[i].get());;
    }
    }
    public static void main(String args[]){
    ATest[] arr = new ATest[5];
    for(int i = 0; i < arr.length; i++ ){
    arr[i] = new ATest(i);
    }

    //first, clone array
    ATest[] arrClone = (ATest[])arr.clone();

    //then clone each object of this array
    for(int i = 0; i < arr.length; i++ ){
    arrClone[i] = (ATest)arr[i].clone();
    }


    System.out.println("befor updated");
    print(arrClone); 
    print(arr);

    System.out.println("after updated");
    arrClone[0].set(100);
    print(arrClone);
    print(arr);
    }
    }这个做了深层copy,所以两个数组完全分离,所以怎么改变也不会影响到另一个楼主,帖子好像是要结的,要不会扣你的信誉分的