Java中String特性

简介: 记一次逗比的操作

Java的String的传递


写一篇记录前几天遇到的个小问题,这个问题说起来很尴尬,还挺基础的。公司的Java项目的代码都要严格按照checkStyle约定的规范编写,不符合规范就会打包报错。


所以遇到复杂的逻辑只能拆分成数个子函数进行处理,拆分成子函数就会有一些参数割裂开,比如主函数逻辑里的一些字符串了,Map了,List了诸如此类的子函数要想用必须用参数传递的方式传到子函数里。这里就要注意String字符串的传递。


先看一段代码,stackoverflow上说很多人会回答错程序的输出。

publicstaticvoidmain(String[] args) {
Stringx=newString("ab");
change(x);
System.out.println(x);
}
publicstaticvoidchange(Stringx) {
x="cd";
}

如果你觉得是cd那这篇没白看,答案是ab。


那么这这段程序到底执行了什么,首先当"ab"创建后,Jvm在堆中分配对象所需内存空间。然后栈中的变量x指向了"ab"。


x保存了一个指向String对象的地址。x只是保存一个内存地址。在Java中只有值传递。当x通过参数传递给change()方法后,x被拷贝了一份,此时指向的内存地址还是跟主方法是一致的。接着change()创建了另一个对象"cd",并且将x指向了不同的地址空间。这时change()方法里的x就指向了"cd"。与主方法的对象就不是一个对象了。


image.png

上面的问题跟String的不可变没有关系。即使是StringBuilder,结果也一样。关键是变量存储的是引用,意思是在方法里改变了变量的引用地址,后续无论做什么改变都不会影响最初进来引用对象。


所以对于String字符串传递的情况只要保证进来的参数指向不发生变化即可,比如可以把change函数改成StringBuilder参数。


publicstaticvoidchange(StringBuilderx) {
x.delete(0, 2).append("cd");
}


String原理

首先String本质上是一个字符串数组,用final修饰所以String有以下特性


String的特性

  1. 不变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,保证字符串堆不可变,可以保证线程之间的数据一致性。
  2. 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
  3. final:使用 final关键字来定义 String 类,表示 String 类不能被继承,提高了系统的安全性

String为什么用final修饰

  1. 为了安全和性能
  2. 字符串共享是解决内存消耗以及庞大性能消耗的必然选择。共享就会出现线程安全性。为了保证线程安全性,让String不可修改


String与StringBuilder与StringBuffer

  1. String内部用final修饰,不可变
  2. StringBuilder效率较高与StringBuffer,毕竟线程不安全
  3. StringBuffer线程安全、内部用Synchrinzed修饰







相关文章
|
3天前
|
Java 编译器 API
带你了解“Java新特性——模块化”
带你了解“Java新特性——模块化”
33 11
|
8天前
|
安全 Java 开发者
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
14 1
|
16天前
|
算法 Java 编译器
Java基础之lambda表达式(JDK1.8新特性)
Java基础之lambda表达式(JDK1.8新特性)
20 1
|
17天前
|
安全 Java
Java基础之StringBuffer
【7月更文挑战第1天】 Java中的`StringBuffer`是线程安全的字符串操作类,适合多线程环境,而`StringBuilder`非线程安全,速度更快,适用于单线程。两者提供`append()`、`insert()`、`delete()`等方法修改字符串,避免了频繁创建新对象的性能问题。在不需要线程安全时,推荐使用`StringBuilder`以提高效率。
14 1
|
18天前
|
安全 Java 索引
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
|
21天前
|
Java API 开发者
Java 8的新特性简单分享(后续有系列篇~敬请期待)
Java 8的新特性简单分享(后续有系列篇~敬请期待)
9 1
|
21天前
|
JavaScript 前端开发 Java
Java11 新特性深度解析
Java11 新特性深度解析
|
7天前
|
Java 大数据 API
Java语言的核心知识点与特性
Java 是一种广泛使用的编程语言,自 1995 年发布以来,它已经成为了企业级应用开发、移动应用开发、大数据处理和云计算等领域的主流技术。
17 0
|
9天前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
13 0
|
9天前
|
XML Oracle Java
Java18新特性有哪些
Java18新特性有哪些