”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中的原始类型与引用以及字符串的不变性

Java 中的原始类型与引用以及字符串的不变性

发布于2024-11-03
浏览:746

在 Java 中,我们有两种类型的数据(或变量):基元和非基元(也称为引用)。

原始类型的文字值存储在堆栈、临时和短期存储内存中,由Java虚拟机(JVM)管理。 [在此处阅读有关内存类型的更多信息]

原始变量分为四组:

1。整数类型:用于存储整数(不含小数部分)。它们是:byte、short、int、long。长数在数字末尾带有字母“L”或“l”,用于区分。

2.浮点类型: :用于存储带小数部分的数字(实数)。它们是:浮动、双精度。浮点数在数字末尾带有字母“F”或“f”,用于区分。

3.字符类型: 用于存储单个字符(如字母、数字或符号):char。它们用单引号 '' 初始化,而不是双引号 ""。

4。布尔类型: 用于存储逻辑值(true或false):bool

参见下表,了解每种类型支持的值范围,以及它们的“默认”值:

Tipos primitivos vs referências em Java e a imutabilidade das Strings
在科学格式中,E 代表指数。例如,1.23E 10 等于 1.23 x 10^10

什么是默认值?这是变量在未初始化的情况下将采用的值。然而,要采用该值,它需要是全局的或常量(最终的)。

public final boolean isTrue;

在这行代码中,变量“isTrue”未初始化,但编译器不会报错,因为它会考虑布尔变量的默认值“false”。

这里,一个重要的警告:如果变量的作用域是局部的,也就是说,如果它已经在函数内声明,我们程序员将被迫为其赋值。否则会出现编译错误。

public void teste(){
        int i = 2;
        int j;

        if (i 



在这个例子中,即使我们知道“2

内存地址

Java中的第二种数据类型称为引用。这些变量存储引用,即对象的内存地址,而不是像原始类型那样直接存储其值。此存储发生在堆内存中。

一般而言,引用类型是类、接口、枚举和对象。

这里是一个附录。我们在代码中广泛使用的 String 是一个类,而不是原始类型。请注意,即使名称也是大写的,这也是 Java 中类的命名约定。

String 甚至还有一些方法,例如 length(),它返回存储在其中的文本的大小,charAt(int index),它返回文本中字符的索引,或者 substring(int beginIndex, int endIndex),它返回一段字符串。

但是,如果您希望更轻松地操作原始数据,Java 也允许这样做。为此,它具有 Wrapper 类,该类已经附带了一系列用于处理基本类型的内置方法。

包装器基本上与原始变量具有相同的名称,但是第一个字母大写:

  • 字节到字节
  • 简称
  • 整数转int
  • 长到长
  • 浮动到浮动
  • 双对双
  • 字符到字符
  • 布尔值到布尔值
public class WrapperExample {
    public static void main(String[] args) {
        String numeroStr = "123";
        Integer num1 = Integer.parseInt(numeroStr);
        Integer num2 = 200;

        int resultadoComparacao = Integer.compare(num1, num2);

        if (resultadoComparacao  0) {
            System.out.println(num1   " é maior que "   num2);
        } else {
            System.out.println(num1   " é igual a "   num2);
        }
    }
}

在此示例代码中,int 包装器用于将字符串转换为数字 (Integer.parse),然后将其与另一个数字进行比较 (Integer.compare)。

然而,字符串具有其他类所没有的特殊性。它是不可变的。

让我们通过这个基本示例来反思一下:

public class Main {
  public static void main(String[] args) {

    String text1 = "Hello";
    String text2 = text1;

    System.out.println(text1); //output: Hello
    System.out.println(text2); //output: Hello

    text1 = "Weird";
    System.out.println(text1); //output: Weird
    System.out.println(text2); //output: Hello

    text2 = "World";
    System.out.println(text1); //output: Weird
    System.out.println(text2); //output: World

    TestClass test1 = new TestClass("propertyValue");
    TestClass test2 = test1;

    System.out.println(test1.getProperty()); //output: propertyValue
    System.out.println(test2.getProperty()); //output: propertyValue

    test2.setProperty("newValue");

    System.out.println(test1.getProperty()); //output: newValue
    System.out.println(test2.getProperty()); //output: newValue   
  }

}

在这种情况下,请注意,即使字符串“text2”指向“text1”,“text2”中的更改也不会反映“text1”中的更改。现在,当指向“test1”的对象“test2”的属性发生更改时,此更改也会反映在“test1”中。

嘿,但是引用变量不是存储内存地址,而不是文字值吗?是的,他们存储它。 Java 语言开发人员决定让 String 变量保持不可变。这意味着一旦设置,String 对象的值就不能被另一个对象间接更改。

因此,在示例中,我们不会更改 text1 先前引用的对象的值(因为 String 是不可变的)。相反,我们创建一个值为“Weird”的新 String 对象,并使 text1 指向这个新对象。而 text2 仍将指向原始的“Hello”对象,这就是它保留值“Hello”的原因。

简而言之,为字符串分配新值不会修改现有对象的值,它只是更改对新对象的引用。

自定义类的对象(例如 TestClass)是可变的。 test1 和 test2 引用都指向同一个对象,因此更改其中一个对象的状态会影响另一个对象。

版本声明 本文转载于:https://dev.to/anaccortez/tipos-primitivos-vs-referencias-em-java-e-a-imutabilidade-das-strings-2n0j?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-03
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-05-03
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-05-03
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-05-03
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-05-03
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的if (str != null && !str.isEmpty())Option 2: str.length() == 0For Java versions prior to 1.6, str.length() == 0 can be二手: if(str!= n...
    编程 发布于2025-05-03
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-05-03
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-05-03
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-05-03
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-03
  • 在Go语言中如何简洁定义10的幂常量
    在Go语言中如何简洁定义10的幂常量
    在GO 利用浮点线文字一种简洁的方式是使用浮点文字,该方法是使用floingpoint protals。写作1E3比写作1000更有效。这是一个示例(67个没有空间的字符):的文字用于未构图的整数常数,我们可以将1000用于KB,并用KB将随后的常量乘以KB,如下所示(77个没有空格的字符):,作...
    编程 发布于2025-05-03
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-05-03
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确...
    编程 发布于2025-05-03
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-05-03
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-05-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3