「java交换两个对象」java交换两个整数的值
今天给各位分享java交换两个对象的知识,其中也会对java交换两个整数的值进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、JAVA对象交换的问题
- 2、java 封装一个类编写一个实现交换2个对象属性的方法
- 3、java swap(Integer a ,Integer b)实现交换?
- 4、Java中能否不借助中间变量交换两个类对象的位置?
- 5、在 Java 应用程序中如何编写一个方法来交换两个基本类型的值或两个对象引用的值呢?
JAVA对象交换的问题
public class cs{ public static void main(String[] args){ example [] exa=new example[5]; exa[0]=new example(); exa[1]=new example(); exa[2]=new example(); exa[0].set("one"); exa[1].set("two"); exa[2].out(exa,0,1); System.out.println(exa[0].st); System.out.println(exa[1].st); exa[2].set(exa[2]); System.out.println(exa[2].st); } } class example { String st; public void set(String st){ this.st=st; } public void out(example[] e,int i,int j){ example t=e[i]; e[i]=e[j]; e[j]=t; } public void set(example exa){ exa.st="one one"; } } Java中的引用传递,是把变量的所在内存中的地址传递给参数,参数通过地址找到变量的值。 对于方法method(Object o)的调用method(x), 不是把对象x复制一份传递给参数o,而是把对象x的在内存中的首地址,也就是把对象x的引用拷贝给参数o。所以直接交换对象是不行的,不过可以交换数组中的对象元素。或者通过反射来实现。
java 封装一个类编写一个实现交换2个对象属性的方法
编写User类添加属性 name,代码如下
public class User {
private String name;
public User(String name){
this.setName(name);
}
public void changeName(User u){
String uName = u.getName();
u.setName(this.name);
this.name = uName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
其中 changeName()用来交换对象的name属性.
编写测试类,代码如下:
public class Test {
public static void main(String args[]){
User zhangsan = new User("张三");
User lisi = new User("李四");
zhangsan.changeName(lisi);
System.out.println(zhangsan.getName());
System.out.println(lisi.getName());
}
}
new出张三李四两个对象,name分别为张三 李四,调用changeName()方法.输出张三李四的名字,会发现已经改变~~请采纳,不懂再问
java swap(Integer a ,Integer b)实现交换?
public class App {
public static void main(String[] args) {
Integer a=1, b=2;
System.out.println("before:a=" + a + ", b=" + b);
swap(a,b);
System.out.println("after:a=" + a + ", b=" + b);
}
public static void swap(Integer i1, Integer i2) {
Integer tmp = i1;
i1 = i2;
i2 = tmp;
}
}
输出结果:a=1,b=2
java里两种参数传递形式:值传递,引用传递
java变量分为基本类型,引用类型,两种类型的参数传递给方法时都是按值传递
形参和实参所占的内存地址不一样
形参中的内容只是实参中存储的对象引用的一份拷贝
交换的是两个引用变量的副本,原来的a,b引用指向不变。
请查看Integer.java
private final int value;
public Integer(int value) {
this.value = value;
}
public class App {
public static void main(String[] args) {
Integer a=1; // Integer a = Integer.valueOf(1); IntegerCache.cache[1+128] == 1
Integer b=2;
System.out.println("before: a=" + a + ", b=" + b);
swap(a, b);
System.out.println("after: a=" + a +", b=" + b);
}
public static void swap(Integer i1, Integer i2) throws NoSuchFieldException {
//通过反射获得类私有不可变变量(private final int value;)
Field field = Integer.class.getDeclaredField(name:"value");
//通过setAccessible去访问私有的成员变量
field.setAccessible(true);
int tmp = i1.intValue(); //tmp值是1,
field.set(i1, i2.intValue()); // i1的值设置为Integer.valueOf(i2.intValue()).intValue(),此时i1地址是IntegerCache.cache[1+128]: 值为2
field.set(i2, tmp); //int--Object Integer.valueOf(tmp).intValue(), tmp的值是地址IntegerCache.cache[1+128],
}
}
javap -v App.class 查看App的字节码
自动封装
Integer a = 1; // Integer a = Ineger.valueOf(1);
valueOf(int i) i在-128到127之间,返回缓存中的值 return IntegerCache.cache[i + (-IntegerCache.low)]
所以Integer a=1,b=1时,a == b ,两个的内存地址是同一个。
上面运行结果:
a=2, b=2
解决:
Integer tmp = new Integer(i1.intValue());
得 a=2, b=1
知识点:
1.自动装箱和拆箱
2.Integer -128到127之间的缓存
3.反射,通过反射去修改private final 变量。
这里列出了field.setInt()方法,跟上面的set方法的区别, 应该?是参数类型不一致,是否用到IntegerCache
这里副本的值指向a,b的地址。用this可实现,但注意static方法里不能用this。
Java中能否不借助中间变量交换两个类对象的位置?
typedef struct lista{
struct lista *next;
int data;
}list;
void insert(list *h);
void del(list *h);
int main()
{
int flag;
list *head=(list *)malloc(sizeof(list));
head-next=NULL;
while(1)
{
在 Java 应用程序中如何编写一个方法来交换两个基本类型的值或两个对象引用的值呢?
基本类型值的交换与C一样。比如:
int tmp = a;
a = b;
b = tmp;
引用值的交换业和上面类似,这又叫做浅拷贝。比如:
Object tmp = a;
a = b;
b = tmp;
如果要将类中的所有成员都复制,需要深拷贝。比如:
Object tmp = a.clone();
a = (Object)b.clone();
b = (Object)tmp.clone();
这里方法clone由用户自定义。
关于java交换两个对象和java交换两个整数的值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。