问一个克隆数组的问题----clone String[] x = new String[100];String[] y = new String[100];y=x;但这时改变了x的值,y的值也会变。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,刚看完这一点。上面的回答都正确,thinking in java 中的例子就是想第二个那么写的 System.arraycopy(src,srcPos,dest,destPos,length) String[] y = new String[100]; for(int i = 0; i < 100; i++) { y[i] = x[i].clone(); } TO:楼主浅层copy q7pb() 的方法就可以实现了TO wdman(天空) x[i].clone(); String类型好象没有这个功能吧 String[] x = new String[100];String[] y = new String[100];y=x;但这时改变了x的值,y的值也会变。其实String[] x = new String[100];String[] y;y=x;就行了; 一、改变的仅仅是引用,都指向s1String s1[] = { "a","f"};String s2[];s2 = s1;二、copyString s1[] = { "a","f"};String s2[] = new String[2];System.arraycopy(s1,0,s2,0,2);三、cloneString s1[] = { "a","f"};String s2[] = new String[2];s2=s1.clone(); 楼上的,String[] 没有clone这个功能呢 clone方法是Object的方法。在java中,Object是所有类的父类! 楼上的,您说的没错,clone方法是Object的方法。在java中,Object是所有类的父类!但是在对象调用clone()这个方法时,会检查此对象是否有实现Cloneable这个接口 我也正在奇怪,理论上确实如你所说。你编译一下: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]); } }}事实上可以通过。以至于我也不明白! --------------------Configuration: j2sdk1.4.1 <Default>--------------------C:\Documents and Settings\user\桌面\test\A.java:9: incompatible typesfound : java.lang.Objectrequired: java.lang.String[] s2=s1.clone(); ^1 errorProcess completed.-------------------------------------哈哈,楼上的 事实上你是正确的。可能是我的编译器或是其他问题!对于本题来说,实现一个cloneable接口也是很简单的。 哦,纠正一下。我的程序是没有问题的:Note that all arrays are considered to implement the interface Cloneable.也就是说数组是可以被看成已经实现了Cloneable接口的。可以直接调用。fog628(发粪涂墙) 编译出现的问题是类型不匹配,可改为:s2=(String[])s1.clone(); 楼上的,我试过了,数组确实可以clone,对于对象数组采用的还是深层copy,------------------------------------------楼主:y = (String[])x.clone();可以达到你要的结果,就是说y[0] = "fog";也不会改变x[[0]的值,如果是用System.arraycopy()的话,y[0] = "fog";之后x[[0]的值也成了"fog" 感谢各位进行深入地探究,终于找到了正确的方法。方法并不重要,重要的是我现在明白了clone()的用法,还知道了system.arraycopy()。分儿太少了,决定不结贴了。呵呵另外,to fog628(发粪涂墙),我用arraycopy作了一下,发现也不连带改变。请核对一下。 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 除外) 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差不多的效果 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,所以两个数组完全分离,所以怎么改变也不会影响到另一个楼主,帖子好像是要结的,要不会扣你的信誉分的 想不明白这个问题:JAVA IO 金字塔如何实现 JAVA实现端到端的通信 Java 编程 for循环问题 eclipse 打包成 .jar 后图片无法加载 用户用不用配置数据源 请问有java 操作visio 的函数库吗? 求JAVA编程思想课后练习答案 请问大家如何使用JTextField来达到输入过滤? 这个求质数的代码,怎么计数呢? 下了个Javabeans Development Kit(ZIP格式的),解压后怎么运行啊?需要设置CLASSPATH吗?在线~ 提问兼散专家分:请问DefaultCellEditor类如何使用?
上面的回答都正确,thinking in java 中的例子就是想第二个那么写的
String[] y = new String[100];
for(int i = 0; i < 100; i++)
{
y[i] = x[i].clone();
}
浅层copy q7pb() 的方法就可以实现了TO wdman(天空)
x[i].clone();
String类型好象没有这个功能吧
String[] y = new String[100];
y=x;
但这时改变了x的值,y的值也会变。其实
String[] x = new String[100];
String[] y;
y=x;
就行了;
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();
在java中,Object是所有类的父类!
clone方法是Object的方法。
在java中,Object是所有类的父类!
但是在对象调用clone()这个方法时,
会检查此对象是否有实现Cloneable这个接口
你编译一下:
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]);
}
}
}
事实上可以通过。以至于我也不明白!
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.
-------------------------------------
哈哈,楼上的
对于本题来说,实现一个cloneable接口也是很简单的。
Note that all arrays are considered to implement the interface Cloneable.也就是说数组是可以被看成已经实现了Cloneable接口的。可以直接调用。fog628(发粪涂墙) 编译出现的问题是类型不匹配,可改为:
s2=(String[])s1.clone();
对于对象数组采用的还是深层copy,
------------------------------------------楼主:
y = (String[])x.clone();
可以达到你要的结果,就是说y[0] = "fog";
也不会改变x[[0]的值,
如果是用System.arraycopy()的话,y[0] = "fog";
之后x[[0]的值也成了"fog"
方法并不重要,重要的是我现在明白了clone()的用法,还知道了system.arraycopy()。
分儿太少了,决定不结贴了。呵呵另外,to fog628(发粪涂墙),我用arraycopy作了一下,发现也不连带改变。请核对一下。
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 除外)
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差不多的效果
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,所以两个数组完全分离,所以怎么改变也不会影响到另一个楼主,帖子好像是要结的,要不会扣你的信誉分的