首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java(初学者):返回一个对象?是作为常量引用返回还是什么?

在Java中,返回一个对象可以是作为常量引用返回,也可以是作为变量引用返回。这两种方式的优劣如下:

  1. 常量引用返回:

常量引用返回是指返回一个对象的引用,但是这个引用不能被修改。这样可以保证返回的对象不会被意外地修改,从而保证了数据的安全性。但是,如果返回的对象是可变的,那么即使返回的引用是常量引用,也可以通过其他途径修改对象的内容。

优势:保证数据的安全性,避免意外的数据修改。

应用场景:适用于返回不可变对象,如String、Integer等。

推荐的腾讯云相关产品:腾讯云对象存储(COS),提供安全、高效、低成本的云存储服务。

产品介绍链接地址:腾讯云对象存储(COS)

  1. 变量引用返回:

变量引用返回是指返回一个对象的引用,这个引用可以被修改。这样可以提供更大的灵活性,但也需要更小心地处理数据。

优势:提供更大的灵活性,可以修改返回的对象内容。

应用场景:适用于返回可变对象,如ArrayList、HashMap等。

推荐的腾讯云相关产品:腾讯云数据库(TencentDB),提供高性能、高可用、弹性扩展的数据库服务。

产品介绍链接地址:腾讯云数据库(TencentDB)

总结:在Java中,返回一个对象可以是作为常量引用返回,也可以是作为变量引用返回。常量引用返回保证数据的安全性,适用于返回不可变对象;变量引用返回提供更大的灵活性,适用于返回可变对象。在实际开发中,应根据具体需求选择合适的返回方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入探究JVM之内存结构及字符串常量池

而作为一名Java开发,JVM是我们必须要学习了解的基础,也是通向高级及更高层次的必修课;但JVM的体系非常庞大,且术语非常多,所以初学者对此非常的头疼。...字符串常量池 这个区域不是虚拟机规范中的内容,所有官方的正式文档中也没有明确指出有这一块,所以这里只是根据现象推导出结论。什么现象呢?有一个关于字符串对象的高频面试题:下面的代码究竟会创建几个对象?...s1 == s2:字面量“abc”会首先去字符串常量池找是否有"abc"这个字符串,如果有直接返回引用,如果没有则创建一个新对象并返回引用;s2你可能会觉得会创建"ab"、"c"和“abc”三个对象,但实际上首先会被编译器优化为...上文刚刚说了intern会先去字符串常量池找,找到则返回引用,否则在字符创常量池创建一个对象,所以第一段代码结果等于true正好说明了通过StringBuilder拼接的字符串会存到字符串常量池中;而第二段代码中...,在StringBuilder拼接字符串之前已经优先使用new创建了字符串,也就会在字符串常量里创建“abc”对象,因此s4.intern返回的是该常量的引用,和s4不相等。

46820

基础打的好 源码难不倒

java零基础入门-面向对象篇(六) String 字符串 介绍完类和对象再来说String会轻松很多,因为String比较特殊,它是引用类型,但是又与普通的引用类型有点区别。...API使用方法 我们查到了String有一个方法是charAt方法,他有一个参数是int类型,描述是返回下标所在处的字符。 ? 使用方法 String的构造方法 和 字符串的比较 为什么说字符串特殊?...温故知新是最好的学习方法。 1.String 是类,不管通过那种方式构造出来的字符串都是String类的对象 2.对象是引用类型,对象里面的值是地址 3.== 双等号比较的是对象的地址 4....jvm 堆,常量池 写了这么多文章,发现在座的各位还是对房子最感兴趣,这次我们继续讲jvm这个开发商吧。(传送门 堆栈 jvm 太难懂?买房子总能理解了吧) ?...常量池 我们前面说了,堆是商业区,就是大商场,大商场肯定会有很多层,堆里面也分为很多区域,这次我们先介绍一个区域,就是常量池。堆是用来放各种对象实例的,常量池也是一样,但是他有自己的特点。

37720
  • 别再浪费内存了!这招让字符串存储效率提升百倍!

    String 对象作为 Java 语言中重要的数据类型,是内存中占据空间最大的一个对象。高效地使用字符串,可以提升系统的整体性能。两个对象是否相等?...那么 str 值确实改变了,为什么我还说 String 对象不可变呢?首先,我来解释下什么是对象和对象引用。Java 初学者往往对此存在误区,特别是一些从 PHP 转 Java 的同学。...,默认会将对象放入常量池;在字符串变量中,对象是会创建在堆内存中,同时也会在常量池中创建一个字符串对象,复制到堆内存对象中,并返回堆内存对象引用。...如果调用 intern 方法,会去查看字符串常量池中是否有等于该对象的字符串,如果没有,就在常量池中新增该对象,并返回该对象引用;如果有,就返回常量池中的字符串引用。...在一开始创建 a 变量时,会在堆内存中创建一个对象,同时会在加载类时,在常量池中创建一个字符串对象,在调用 intern 方法之后,会去常量池中查找是否有等于该字符串的对象,有就返回引用。

    16210

    Java知识面试题复习(四)Java常用API

    字符串常量代表一个地址值(该字符串在内存中存放位置) 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志) 什么是字符串常量池?...,则实例化一个字符串放到池中,并返回其引用。...String有哪些特性 不变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。...常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。...; 拆箱:将包装类型转换为基本数据类型; int 和 Integer 有什么区别 Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作

    58350

    C++の自动类型推导和其他

    ,就是整型引用常量(指向常量的引用),而且需要注意一点,const常量只能作为const常量的值(有点拗口!)...举个例子: 这里j是一个指向常量的引用,它也可以作为一个值,初始化另一个常量如下 const int &k = j; 这里k如果是一个引用的话必须为常量,如果不是引用的话,可是是一个变量。...如下: int k = j; 可能有的朋友会有些疑惑,既然表达式 int &k = j; 是错误,为什么去掉&就可以了呢?简单解释一下,其实引用并不是一个实体对象,而是代表了一种绑定关系。...这里先简单说一下引用和指针的区别,虽然很简单,但是我觉得还是有必要略讲一下经常会遇到一些初学者讲引用于指针弄混。...上面说过,指针本身也是一个实体对象,不像引用徒有虚名。所以有一个叫常量指针的(const pointer)家伙。

    66410

    Java常量池详解,秒懂各种对象相等操作

    介绍 为什么要有常量池? 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。...对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。 基本数据类型的包装类和常量池 Java有8种基本数据类型 整数类型:byte,short,int,long。...因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱 自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue...jdk1.7之前的不讨论,从jdk1.7开始,字符串常量池就开始放在堆中 下面这个代码初学者还是经常被问到的 String str1 = "abc"; String str2 = "abc"; String...的话,其中的引用类型常量(例如CONSTANT_String、CONSTANT_Class、CONSTANT_MethodHandle、CONSTANT_MethodType之类)都存的是引用,实际的对象还是存在

    88730

    Java学习笔记(2)——数据类型

    终于要写点干货了,其实思考了很久下面一篇文章要写什么,主要的纠结点在于,既想要分享那些精美的知识,又怕这些知识不太好嚼。后来想想还是对初学者不太好友算了..一来这系列文章叫做学习笔记,我的。...在java里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。...深入了解Integer 来看一个例子: ? 一个例子 第一个返回true很好理解,就像上面讲的,a和b指向相同的地址。 第二个返回false是为什么呢?...java是值传递还是引用传递的呢?毫无疑问,java是值传递的。那么什么又叫值传递和引用传递呢? 我们先来看一个例子: ?...由于是小明这个对象被改变了,所以所有小明的引用调用方法得到的年龄都会改变 所以就变了。 最后简单的总结一下。 java的传值过程,其实传的是副本,不管是变量还是引用。

    62730

    我终于搞清楚了和String有关的那点事儿。

    ; intern()有两个作用,第一个是将字符串字面量放入常量池(如果池没有的话),第二个是返回这个常量的引用。...都是定义一个字符串对象,然后将其字符串字面量保存在常量池中,并把这个字面量的引用返回给定义好的对象引用。如下图: ?...因为就算不用intern,Hollis作为一个字面量也会被加载到Class文件的常量池,进而加入到运行时常量池中,为啥还要多此一举呢?到底什么场景下才会用到intern呢?...也就是说,还是要在堆里面创建对象的。 而intern中说的“如果有的话就直接返回其引用”,指的是会把字面量对象的引用直接返回给定义的对象。这个过程是不会在Java堆中再创建一个String对象的。...的确,以上代码的写法其实是使用intern是没什么意义的。因为字面量Hollis会作为编译期常量被加载到运行时常量池。 之所以能有以上的疑惑,其实是对字符串常量池、字面量等概念没有真正理解导致的。

    55331

    Redis实战12-优惠券实现一人一单功能

    String对象,在创建时候,先去常量池中获取,若存在,则直接返回常量池中相应Strnig的引用;若不存在,则会在常量池中创建一个等值的String,然后返回这个String在常量池中的引用。...当通过语句str.intern()调用intern()方法后,JVM 就会在当前类的常量池中查找是否存在与str等值的String,若存在,则直接返回常量池中相应Strnig的引用;若不存在,则会在常量池中创建一个等值的...String,然后返回这个String在常量池中的引用。...然后返回该字符串的引用;(2)在jdk7/8中,字符串常量池被移到了堆空间中,调用intern()方法时,如果常量池已经存在该字符串,则直接返回字符串引用,否则复制该堆空间中字符串对象到常量池中并返回。...根据上面分析,有了理论知识,我们还是来个小demo,测试下:看到什么了?使用string.intern()方法后,返回的是true.这就保证了,同一个用户id,在多次进入方法后,是同一个锁对象了。

    97540

    难顶,学不动了!

    class 文件 JVM 内存区域 Java 虚拟机栈 这三篇的内容还是非常肝的,读起来也比较轻松,但如果你是初学者,读起来感觉很吃力的话,不要紧,我再来补一篇更全面、更细致、更通俗的,从另外一个视角切入...目光右移,0000 是 Java 的次版本号,0037 转化为十进制是 55,是主版本号,Java 的版本号从 45 开始,每升一个大版本,版本号加 1,大家可以启动福尔摩斯模式,推理一下。...再往后面就是字符串常量池。《class 文件》那一篇我是顺着十六进制内容往下分析的,可能初学者看起来比较头大,这次我们换一种更容易懂的方式。...注: # 号后面跟的是索引,索引没有从 0 开始而是从 1 开始,是因为设计者考虑到,“如果要表达不引用任何一个常量的含义时,可以将索引值设为 0 来表示”(《深入理解 Java 虚拟机》描述的)。...这是因为有一个隐藏的 this 变量,只要不是静态方法,都会有一个当前类的对象 this 悄悄的存在着。这就解释了为什么 locals 和 args_size 的值为 1 的问题。

    53820

    【JAVA-Day38】深入了解Java常用类 String:字符串操作的技巧和方法

    无论您是初学者还是有经验的Java开发者,都将在本文中找到有价值的信息。让我们一起来探索这个有趣的主题! 引言 Java中的String类是一个不可变类,用于表示文本字符串。...以下是一些可能出现的面试题: 4.1 什么是String类的不可变性?为什么String类被设计成不可变的? 答:String类的不可变性指的是一旦创建了一个字符串对象,其内容就不能被修改。...4.4 什么是字符串池(String Pool)?它的作用是什么? 答:字符串池是String对象的缓存区域,它在Java中用于存储字符串常量。...当您创建一个字符串字面量时,Java首先检查字符串池中是否已存在相同内容的字符串,如果存在则返回引用,否则创建新的字符串并将其放入字符串池。...= (str1 == str2); // 返回true,因为引用相同 字符串池的使用可以显著提高Java程序的性能和内存管理效率,特别是在处理大量字符串常量时。

    13910

    从字符串到常量池,一文看懂String类

    在解析#2这个符号引用时,会先到字符串常量池中查找是否存在对应字符串实例的引用,如果有的话,那么直接返回这个字符串实例的引用,如果没有的话,会创建一个字符串实例,那么将其添加到字符串常量池中(实际上是将其引用放入到一个哈希表中...---- 在上文中,我多次提到了字符串常量池,它到底是个什么东西呢?我们还是分为两部分讨论 位置在哪? 用来干什么的? ? 字符串常量池 位置在哪?...所以,请大声跟我念三遍 字符串常量池存储的是字符串实例对象的引用! 字符串常量池存储的是字符串实例对象的引用! 字符串常量池存储的是字符串实例对象的引用!...我们可以将上面整个过程分为两个阶段 解析常量 调用构造函数创建对象并返回引用 在解析常量的过程中,因为该字符串常量是第一次解析,所以会先在永久代中创建一个字符串实例对象,并将其引用添加到字符串常量池中...[2]JVM 常量池中存储的是对象还是引用呢?

    93621

    Java学习笔记-全栈-Java基础-06-面向对象中的重点

    5.2 重写equals 5.2.1 ==与equals ==比较的是两个对象的地址是否相同,即是否是同一个对象。若为数字则比较值 Equals比较的是两个对象的内容是否相同。...直接使用双引号引起来的为字符串常量,被保存在常量池中。 //只要值相同,任意多个引用都指向该常量。 字符串拼接在编译的时候已完成(置于静态区),因此对象“a”+“b”和对象“ab” 相等。...java类没有多继承,接口有多继承。 此外,对于初学者来说,一直不懂接口有什么用。事实上,接口是Java十分神奇的部分,当你逐渐接触框架、设计模式之后,便会感受到接口的魅力。 学会面向接口编程。...加上final之后,局部变量会存在常量池,就可以随时访问。 final:java中的关键字,修饰符。 A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。...finalize:Java中的一个方法名。 Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。

    41720

    Java技术——你真的了解String类的intern()方法吗

    s.intern(),这一行的作用是s对象去常量池中寻找后发现"1"已经存在于常量池中了。 String s2 = "1",这行代码是生成一个s2的引用指向常量池中的“1”对象。...s3.intern(),这一行代码,是将 s3中的“11”字符串放入 String 常量池中,此时常量池中不存在“11”字符串,JDK1.6的做法是直接在常量池中生成一个 "11" 的对象。...但是在JDK1.7中,常量池中不需要再存储一份对象了,可以直接存储堆中的引用。这份引用直接指向 s3 引用的对象,也就是说s3.intern() ==s3会返回true。...String s4 = "11", 这一行代码会直接去常量池中创建,但是发现已经有这个对象了,此时也就是指向 s3 引用对象的一个引用。因此s3 == s4返回了true。...String s2 = "1",这行代码是生成一个s2的引用指向常量池中的“1”对象,但是发现已经存在了,那么就直接指向了它。 s.intern(),这一行在这里就没什么实际作用了。

    78200

    JavaSE 基础知识(常识概念 + 基础语法)问答总结面试题 —— 讲给应届生的 Java 开源知识项目

    方法 4.1 Java 中方法参数传递为值传递还是引用传递 4.2 说一说方法重载和重写的区别 4.2.1 如何理解方法的重载和重写都是实现多态的方式 4.2.1 为什么函数不能根据返回类型来区分重载?...final 修饰的方法不能被重写 final 修饰的变量叫做常量,如果是基本类型,则数值初始化后就不能改变了,如果是引用类型,则对其初始化后则不能再让其指向到另一个对象了。...方法 4.1 Java 中方法参数传递为值传递还是引用传递 Java 中方法参数传递方式是按值传递。 如果参数是基本类型,传递的是基本类型的字面量值的拷贝。...对于引用类型,arr 数组初始化后,指向到了一个具体的地址中,而将其作为方法参数传递,modify 方法中的 arr 也就指向到了同一个地址去,所以方法内的修改,会直接反映在所对应的对象上。...也就是说,不能有两个名字相同、参数类型也相同却返回不同类型值的方法。 同时函数的返回值只是作为函数运行之后的一个“状态”,他是保持方法的调用者与被调用者进行通信的关键。并不能作为某个方法的“标识”。

    71320

    再议String-字符串常量池与String.intern()

    为字符串开辟一个字符串常量池,类似于缓存区 创建字符串常量时,首先查看字符串常量池是否存在该字符串 存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中 实现的基础 实现该优化的基础是因为字符串是不可变的...");创建了两个对象,一个在堆中的StringObject对象,一个是在堆中的“2”对象,并在常量池中保存“2”对象的引用地址。...s.intern();在常量池中寻找与s变量内容相同的对象,发现已经存在内容相同对象“2”,返回对象“2”的引用地址。...new String("3");创建了两个对象,一个在堆中的StringObject对象,一个是在堆中的“3”对象,并在常量池中保存“3”对象的引用地址。...我们可以利用池里String的对象来做锁,实现对资源的控制。比如一个城市的某种资源同一时间只能一个线程访问,那就可以把城市名的String对象作为锁,放到常量池中去,同一时间只能一个线程获得。

    31420

    工作10年后,再看String s = new String(xyz) 创建了几个对象?

    这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的...在jdk1.7版本之前,常量池存在于方法区,方法区是堆的一个逻辑部分,他有一个名字叫做非堆。 ? 1.7版本把字符串常量池放到了堆中。 ?...为什么要说方法区的改变,只是为了文章接下来的内容不会由于JDK的版本而产生分歧,接下来内容都会以jdk1.8版本作为基础来讨论。...从结果来看,ldc命令在常量池中创建了一个"xyz"的对象,然后把他推至操作数栈顶,然后astore保存到局部变量,return返回。...很明显,我们看到new 创建了一个String对象,同时ldc在常量池中创建了"xyz"字符串对象,之后invokespecial执行构造函数,astore_1赋值,return返回。

    41110

    Java 基础常见知识点&面试题总结(中),2022 最新版!

    那什么是引用拷贝呢? 简单来说,引用拷贝就是两个不同的引用指向同一个对象。 我专门画了一张图来描述浅拷贝、深拷贝、引用拷贝: Java 常见类 Object Object 类的常见方法有哪些?...因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。...String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况: 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用...如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。...”Java“对应的引用 String s2 = s1.intern(); // 会在堆中在单独创建一个字符串对象 String s3 = new String("Java"); // 直接返回字符串常量池中字符串对象

    40710
    领券