在java中String,对象,Integer(包装类型的)关于引用传递还是值传递
场景:
大家都知道基本的数据类型,int,float等等这种是按值传递的。但是对于String,对象,Integer是怎样传递呢?
原理知识:
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。
如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
测试用例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public
class
Person {
private
int
id;
private
String name;
public
int
getId() {
return
id;
}
public
void
setId(
int
id) {
this
.id = id;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
public
class
TestBasicType {
public
static
void
methonInt(
int
p) {
p =
10
;
}
public
static
void
methonInteger(Integer p) {
p =
10
;
}
public
static
void
methonString(String p) {
p =
"word"
;
}
public
static
void
methonStringObject(String p) {
p =
"world"
;
}
public
static
void
methodObj(Person p) {
p.setId(
34534
);
}
public
static
void
main(String[] args) {
int
a =
3
;
Integer b =
4
;
String s =
"hello"
;
String sobj =
new
String(
"hello"
);
Person p =
new
Person();
p.setId(
12312
);
TestBasicType.methodObj(p);
TestBasicType.methonInt(a);
TestBasicType.methonInteger(a);
TestBasicType.methonString(s);
System.out.println(
"--int-------->"
+ a);
System.out.println(
"--Integer-------->"
+ b);
System.out.println(
"--String-------->"
+ s);
System.out.println(
"--StringObject-------->"
+ sobj);
System.out.println(
"--Object-------->"
+ p.getId());
}
}
输出结果为:
--
int
-------->
3
--Integer-------->
4
--String-------->hello
--StringObject-------->hello
--Object-------->
34534
|
测试说明:
String,基本类型(int等等),包装类型(Integer等等)都是值传递
实际的对象为引用传递。
疑问:
在这里可能会有网友问了,包装类型,String难道不是对象么?说实话这里我也有疑惑,但是不管怎么样还是以测试结果为准。
##########################################################################################################33
标签: 杂谈 |
int 是基本类型,直接存数值
Integer是类,产生对象时用一个引用指向这个对象
Java把内存划分成两种:一种是栈内存,另一种是堆内存
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
而实际的对象是在存储堆内存中
即
int i = 5;//直接在栈中分配空间
Integer i = new Integr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中
在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理.
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
而实际的对象是在存储堆内存中
即
int i = 5;//直接在栈中分配空间
Integer i = new Integr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中
在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理.
因为在堆中分配空间所需的时间远大于从栈中分配存储空间,所以JAVA速度比C 慢
当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的外覆类了。Java中每种基本类型都有相应的外覆类。
int 和 Integer 的区别
java 提供两种不同的类型:引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的 数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 from:http://community.csdn.net/Expert/topic/3666/3666081.xml?temp=.9687921 int 是基本类型,(int)(Math.Random()*100)就是一个数,可以进行加见乘除。 Integer是class ,那么 new Integer(temp)就是一个对象了,可以用到Integer这个class的方法,例如用intvalue()可以返回这个int的值。 |