java string作为参数传递,java 字符串转数组
本文为您带来了一些关于java的知识,包括一些关于java字符串和数组作为参数传递的问题。我们来看看为什么java只有值传递。希望对你有帮助。
如何解决写爬虫IP受阻的问题?立即使用。
第一点,java里只传值!只传递值!理论基础来自《think in java》。下一步是解释为什么java只传递值。
因为java有两种数据类型:基本类型和引用类型,加上特殊的类型字符串,可以从三个方面来解释。
1. 基本数据类型
先看代码
公共类演示01 {
公共无效更改(int a) {
system . out . println( copy A A的初始值);
a=20
system . out . println( copy A A的新值);
}
公共静态void main(String[] args) {
int a=10
demo 01d=new demo 01();
d .变革(a);
system . out . println( change method 执行后更改值 a );
}
}分析:
在java中,基本数据类型遵循值传递,所以当对象D调用change()方法时,它只将原始数据A的副本传递给方法中的参数。第一次,原始数据和副本A的值都是10。在a=20之后,副本A的值变成20。
所以运行结果是:
请参考下图。
2. 引用数据类型
先看代码
公共类演示02 {
char[] ch={a , b , c };
公共无效更改(char ch[]) {
system . out . println(ch[0]in method: ch[0]的初始值);
ch[0]= g ;
System.out.println(在 method: ch[0]中执行ch[0]后的新值);
}
公共静态void main(String[] args) {
demo 02d=new demo 02();
system . out . println( object d 中数组的初始值为: d . ch );
d . change(d . ch);
System.out.println(对象D中数组的最终值为: D . ch );
}
}分析:
当引用类型作为参数传递时,也属于值传递。在这种情况下,传递的是地址值的副本,但是两个地址指向同一个位置。当复制地址不变时,对复制地址指向的数据的操作会影响原始数据值。在方法中,ch[]数组和原来的ch[]数组指向相同的数据,所以初始阶段的ch[0]都指向‘a’;然后对副本中的ch[0]进行新的赋值,它变成‘g’。
所以运行结果是:
请参考下图。
3. 字符串的参数传递
先看代码
公共类演示03 {
公共无效更改(字符串str2) {
System.out.println(方法 str2中str2的初始值);
system . out . println(‘方法’str2 . hashcode()中str 2的初始hashcode值);
str2= bbb
System.out.println(在 method: str2 中赋值str2后);
System.out.println(在 method: str2.hashCode()中str2赋值后hashcode的值);
}
公共静态void main(String[] args) {
String str1=新字符串( AAA );
System.out.println(原字符串str1的hashcode值: str 1 . hashcode());
demo 03d=new demo 03();
d .变革(str 1);
System.out.println(方法调用 str1 后str1的值);
}
}分析:
字符串是一种特殊的数据类型,它的底层是一个final char[]数组,是不可更改的。因此,当字符串作为参数传递时,它可以作为特殊数组来操作。同样,它指的是原始对象的副本。此时,复制对象的引用和原始对象的引用都指向原始字符串的位置。即初始化开始时,str2指向的地址与原对象str1指向的位置一致,即str2的初始hashcode值与原对象str1的值相同。str2被str2="bbb "操作后,str2会指向一个新的对象引用,即此时str2会指向" bbb "的位置。str2的hashcode值会变,但是str1原来的对象引用没有变,“aaa”也没有变,所以str1仍然指向“aaa”。运行结果如下:
接下来,看一个更具体的字符串示例:
公共类演示04 {
公共静态void main(String[] args) {
string buffer s=new string buffer( hello );
string buffer S2=new string buffer( hi );
测试(s,S2);
System.out.println(方法调用后s的值: s );
System.out.println(方法调用后s2的值: S2 );
}
静态空隙测试(StringBuffer s3,StringBuffer s4) {
System.out.println(方法初始化时s3的值 S3);
System.out.println(方法初始化时s4的值 S4);
s4=s3
S3=new string buffer( new );
System.out.println(第一步变化后s3的值 S3);
System.out.println(第一步变化后s4的值 S4);
S3 . append( boy );
S4 . append(“gril”);
System.out.println(第二步改变后s3的值 S3);
System.out.println(第二步变化后s4的值 S4);
}
}这次先看结果:
然后分析:
在方法执行之前,字符串s1和s2指向的位置分别是“hello”和“hi”,这是毋庸置疑的。
(1)然后进入里面的方法。该方法中的参数s3和s4的初始化与上述示例相同。此时,它们指向与s1s2相同的位置,或者s1s2将对象的引用副本给s3s4。此时,s3s4的值为“hello”和“hi”
(2)接下来,执行s4=s3。此操作引用s3到s4的对象,其中s4为“hello”;S3=new string buffer(" new ");注意,这个操作相当于给s3一个新的对象引用,s3用一串“new”指向一个位置,所以此时S3=“new”和S4=“hello”
然后是S3。Append("男孩");S4 . append(" gril ");在StringBuffer中的append方法中,需要注意的是,它的操作不会指向s3s4的一个新的对象引用,而是在原有的基础上进行操作,所以在操作之后,S3=“new boy”和S4=“Hello Gril”
(4)此时,方法被调用后,回头看看这个过程中,s3s4对s1s2的影响。
3354-A .首先s3只是像s1一样指向“hello”,然后为s3创建一个新的对象引用“new”。此时,s3和s1之间没有关系。s3后追加(boy),S3=" newboy ";
3354b . s4和s2一开始都指向“hi”,然后s3将其初始值(即s1的副本)给s4,此时s4指向“hello”(这会使S4和s1产生关系)。S4执行append(grill)操作,因为和s1指向同一个位置,所以他们共同指向的对象会发生变化,S4=S1 s4=s1="hellogrill "
3354-C .然后就清楚了,s2指向的对象“hi”没有变化,s1指向的“hello”在append(“grill”)操作下变成了“hellogril”。
4. 总结
当基本数据类型用作方法的参数时,方法体中参数的修改不会影响实际参数的值。
当引用的数据类型作为方法参数时,如果在方法体中修改了参数所指向的数据内容,那么实参变量的值就会受到影响,因为实参变量和实参变量共享同一个堆区;
当引用数据类型作为方法的参数时,如果在方法体中改变了参数变量的方向,此时参数变量的值不会受到影响,所以参数变量和参数变量分别指向不同的堆区;最后一个例子是最生动的解释。
把String当成参数,还要看它的参数变量point有没有变化。因为string的底层是final类型char[],所以当你在String s="aaa "或者String s=new String("aaa ")的时候,会为s创建一个新的对象引用,但是当append()方法被调用的时候,它不会指向新的对象,而是在原来所指向的对象上发生变化,与之共享的对象引用也会发生变化。
最后,java中没有引用传递,只有值传递,引用类型属于特殊值传递(它的地址副本给了参数,但和基本数据类型不同。如果地址指向的对象改变了,原来的对象也会因为共享而改变)。
推荐:《java教程》以上是讲JAVA中字符串和数组作为参数传递的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。