所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

java string怎么传引用传递?

发布时间:2020-04-12 08:41:54

资讯分类:string  java  引用  传递  对象  都是  传递
java string怎么传引用传递?

传实体和字符串传递不存在的,只有值传递和引用传递。java中只有基本类型和对象类型,所有基本类型都是值传递,对象类型是引用传递。字符串也是对象类型,是个正儿八经的类。小写的int,long之类的就是基本类型。它们有对象的对象类型,就是大写的版本。r 值传递或是引用传递来源c语言。引用类似c语言中的指针。c中指针其实是一个数字,对应于一个内存地址。更准确的说是一段连续内存的首地址。真正的数据位于内存中一段连续内存上,而其指针就是这段连续内存的首地址。引用传递相当于你将指针,也就是内存地址交给别人,别人通过内存地址找到这整个内存世界中独一无二的数据,然后该干啥干啥。而值传递,则是将整个数据拷贝一份新的给别人,别人操作的都是新数据,并不会影响原有数据。r 在c中你是可以用代码控制值传递还是引用传递的。但java中除了基本类型,都是对象,都是new出来的东西,都是类似c中的指针。当然java帮你封装好了,你是得不到内存中真正的地址的,但效果是一样的。r 在c中传递指针的好处一方面在于对于比较大的对象,拷贝整体很没效率,另一方面可以操作实际对象,提高数据的共享。但是引用传递的数据也有个缺点,那就是对于不需要线程共享的数据维护线程安全非常费力。你很难保证这个对象在你操作的同时没被别的线程改变内部状态。如果使用值传递,每次都是一份全新的拷贝,老对象变没变根本无所谓。r 这里还有提及另外一个概念:可变对象和不可变对象。如果一个对象不允许写操作,换句话说这个对象被new出来后,内部所有状态就再也不会变化,并且禁止外部对内部的写入操作,这个就是不可变对象,反之则是可变对象。不可变对象有个非常巨大的好处~ 那就是绝对的线程安全。因为不存在并发写。你可能会觉得不可变对象毫无卵用。但这是错觉。java中最重要的类String就是不可变对象。它的任何方法都不会改变自身。对于需要修改字符串的场合,String往往会new出一个新String对象,复制自身状态到新对象,并对新对象做一定修改然后返回给调用者。这样就可以在不改变自身状态的前提下完成可变对象的一些功能。r 然后对于不可变对象,值传递和引用传递,其实作用上没任何区别~ 因为对象的内部状态是不变的,其完全的拷贝和原版可以保证永远是一模一样的,不会随着时间产生差异。r 对于基本类型,往往数据所占内存很小,以现在普遍64位的情况,所有java基本类型的内存占用大小都小于等于一个指针的大小。另一方面所有基本类型都是不可变对象,使用引用并没有什么好处,所以为了效率考虑,java中基本类型都是值对象,或者说你拿到的是数据本身,而不是一个指针或者说引用。当然为了面向对象,java对所有基本类型提供对象版本。但正如我上面提到的,基本类型都是不可变对象,值传递和引用传递并没有什么区别r

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