java string作为参数传递,java 字符串转数组

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: