首页编程java编程java字符串是什么传递?java string是值传递还是引用传递

java字符串是什么传递?java string是值传递还是引用传递

编程之家2023-10-11103次浏览

大家好,今天来为大家分享java字符串是什么传递的一些知识点,和java string是值传递还是引用传递的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

java字符串是什么传递?java string是值传递还是引用传递

java string是引用传递还是值传递

String是引用类型,不过java有字符串常量池机制,声明字符串常量或者字符串常量连接都要用到字符串常量池。如果常量池中有该字符串序列则返回,所以str创建了一个字符串并放入常量池中,str2内的字符序列已在常量池中所以str2直接指向str指向的对象。

而new String()一定会在堆上新创建对象,所以肯定false

例子:

java字符串是什么传递?java string是值传递还是引用传递

String str="scce";//创建了一个对象

String str2="scce";//指向一个对象,不是新建

str==str2返回true//同一个内存地址

java字符串是什么传递?java string是值传递还是引用传递

String str2=new String("scce"); str==str2返回false//新建了一个对象,内存地址不一样!

JAVA中字符串和数组作为函数参数 分别是如何传递的

public class Test01{//新建一个类

String s= new String("good");//创建一个对象名字为s内容为good

String[] ss={"aaa"};//创建一个名为ss的数组只有1个数量内容为aaa

public void m_method(String str,String[] sa){//设置一个公共的无返回值的名为m_method的函数()里面是参数

str="bad";//把bad赋值给str

sa[0]="bbb";把bbb赋值给sa的第一个数组对象

}

public static void main(String[] args){//程序入口

Test01 t1= new Test01();//在Test01里创建一个名为t1的对象

t1.m_method(t1.s,t1.ss);//对象t1调用test01的m_method函数,t1.s也就是test01类的s也就是good作为第一个参数,t1.ss也就是test01类里面的ss也就是aaa作为第二个参数进行运行

System.out.println(t1.s+t1.ss[0]);//输出t1.s的值和t1.ss[0]的值;

}

java string是值传递还是引用传递

你是C/C++或是VB转过来的吗?在Java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是Java的设计者极力避免你考虑的问题。

你需要明白的是:

1、Java中所有方法的参数的传递都是“值传递”;

2、Java中所有对象类型的变量的“值”,本质上说,包含了Java堆中的实际对象的地址,你可以大体认为Java的变量对应了C/C++中的指针(其实这里面有更复杂的机制)。事实上,Java并不像C/C++一样明确的区分“值语义”与“引用语义”,Java栈中也不会存放任何对象的实体(这点与C/C++不同,C/C++栈中可以存放对象实体),所有的Java对象都是在堆中。

概念上的区别在于,我这里提到的“变量”是指Java栈中的内容,对应你说的“引用”;我提到的“对象”是指Java堆中的实体,对应你说的“值”。而一般Java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是Java堆中的对象实体的传递。

你用字符串来做实验,并推广为所有Java对象的做法,并不是特别合适。Java的String类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:

a="s";

b="s";

a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:

a= new String("s");

b= new String("s");

是分别在Java堆中创建了2个对象,此时a!=b。

本质上说,对于基本数据类型(整数、字符等),Java的符号==,用于判断二者的值是否相等;对于对象类型,Java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等。

你希望实现的swap逻辑,在Java中通常认为是无法实现的。拿你这个例子来说,swapValue()中的tmpValue无论怎么更改,只是改变tmpValue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么Java最初说自己永远是值传递。你只有改变tmpValue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。

为了弥补这个缺陷,C#才加入了ref关键字,允许传入变量的引用(如果参考C/C++,C#传递的实际是二级指针,它的内容是栈中的变量的地址)。

java实时数据字符串对象怎么在线程间传递

实际上并不是那么简单的用管道流实现的,当然如果你能保证同步的话可以直接用管道

线程这个东西本来就是共享进程资源的,所以没有特殊的传送机制,直接使用就行了。在java中就是直接使用对象里的字段。

你这个就是一个生产者消费者模型,可以用一个队列实现,接受socket作为生产者往一个队列中存字符串,然后唤醒发送socket(也就是消费者了),消费者在一个无限循环中读取队列中的字符串,并且以其作为信号量实现同步

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

听闻远方有你原唱 听闻远方有你原唱完整版java为什么要使用集合(Java中的集合有哪些 在什么情况下使用)