Java 中的基本类型与引用以及字符串的不变性
在 Java 中,我们有两种类型的数据(或变量):基元和非基元(也称为引用)。
基本类型将其文字值存储在堆栈、临时和短期存储内存中,由 Java 虚拟机 (JVM) 管理。 [在此处阅读有关内存类型的更多信息]
原始变量分为四组:
1。整数类型: 用于存储整数(不含小数部分)。它们是:byte、short、int、long。长数在数字末尾带有字母“L”或“l”,用于区分。
2。浮点类型::用于存储带小数部分的数字(实数)。它们是:浮动、双精度。浮点数的数字末尾带有字母“F”或“f”,用于区分。
3。字符类型: 用于存储单个字符(如字母、数字或符号):char。它们用单引号 '' 初始化,而不是双引号 ""。
4。布尔类型: 用于存储逻辑值(true 或 false):bool
请参阅下表,了解每种类型的值范围以及“默认”值:
在科学格式中,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 < 10){ j = 5; } System.out.println(j); }
在这个例子中,即使我们知道“2 < 10”返回“true”,编译器在其过程中从不执行它翻译的代码,不知道条件为真,也不知道原始变量“j”将始终被初始化。这样,当尝试运行代码时,就会出现编译错误:“错误:变量 j 可能尚未初始化”。
内存地址
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 + " é menor que " + num2); } else if (resultadoComparacao > 0) { System.out.println(num1 + " é maior que " + num2); } else { System.out.println(num1 + " é igual a " + num2); } } }
在此示例代码中,int 包装器用于将字符串转换为数字 (Integer.parse),然后将其与另一个数字进行比较 (Integer.compare)。
然而,String 有一个其他类所没有的特殊性。她是一成不变的。
让我们通过这个基本示例来反思一下:
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”中。
Hé, mais les variables de référence ne stockent-elles pas les adresses mémoire, au lieu des valeurs littérales ? Oui. Ils le stockent. Ce qui se passe, c'est que les développeurs du langage Java ont pris la décision de laisser les variables String immuables. Cela signifie que, une fois définie, la valeur d'un objet String ne peut pas être modifiée indirectement par un autre objet.
Par conséquent, dans l'exemple, nous ne modifions pas la valeur de l'objet précédemment référencé par text1 (puisque String est immuable). Au lieu de cela, nous créons un nouvel objet String avec la valeur "Weird" et faisons pointer text1 vers ce nouvel objet. Text2 pointera toujours vers l'objet "Hello" d'origine et c'est pourquoi il conservera la valeur "Hello".
En bref, attribuer une nouvelle valeur à une chaîne ne modifie pas la valeur de l'objet existant, cela change simplement la référence à un nouvel objet.
Les objets des classes personnalisées, telles que TestClass, sont mutables. Les références test1 et test2 pointent vers le même objet, donc changer l'état de l'une d'elles se reflète sur l'autre.
以上是Java 中的基本类型与引用以及字符串的不变性的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

使用java.time包中的类替代旧的Date和Calendar类;2.通过LocalDate、LocalDateTime和LocalTime获取当前日期时间;3.使用of()方法创建特定日期时间;4.利用plus/minus方法不可变地增减时间;5.使用ZonedDateTime和ZoneId处理时区;6.通过DateTimeFormatter格式化和解析日期字符串;7.必要时通过Instant与旧日期类型兼容;现代Java中日期处理应优先使用java.timeAPI,它提供了清晰、不可变且线

要正确处理JDBC事务,必须先关闭自动提交模式,再执行多个操作,最后根据结果提交或回滚;1.调用conn.setAutoCommit(false)以开始事务;2.执行多个SQL操作,如INSERT和UPDATE;3.若所有操作成功则调用conn.commit(),若发生异常则调用conn.rollback()确保数据一致性;同时应使用try-with-resources管理资源,妥善处理异常并关闭连接,避免连接泄漏;此外建议使用连接池、设置保存点实现部分回滚,并保持事务尽可能短以提升性能。

依赖性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推广looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

前形式摄取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

SetupaMaven/GradleprojectwithJAX-RSdependencieslikeJersey;2.CreateaRESTresourceusingannotationssuchas@Pathand@GET;3.ConfiguretheapplicationviaApplicationsubclassorweb.xml;4.AddJacksonforJSONbindingbyincludingjersey-media-json-jackson;5.DeploytoaJakar

使用性能分析工具定位瓶颈,开发测试阶段用VisualVM或JProfiler,生产环境优先Async-Profiler;2.减少对象创建,复用对象、用StringBuilder替代字符串拼接、选择合适GC策略;3.优化集合使用,根据场景选型并预设初始容量;4.优化并发,使用并发集合、减少锁粒度、合理设置线程池;5.调优JVM参数,设置合理堆大小和低延迟垃圾回收器并启用GC日志;6.代码层面避免反射、用基本类型替代包装类、延迟初始化、使用final和static;7.持续性能测试与监控,结合JMH

Maven是Java项目管理和构建的标准工具,答案在于它通过pom.xml实现项目结构标准化、依赖管理、构建生命周期自动化和插件扩展;1.使用pom.xml定义groupId、artifactId、version和dependencies;2.掌握核心命令如mvnclean、compile、test、package、install和deploy;3.利用dependencyManagement和exclusions管理依赖版本与冲突;4.通过多模块项目结构组织大型应用并由父POM统一管理;5.配

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa
