`

String类的独特之处

阅读更多

熟悉而又神奇的String

      看到String,自然而然会想到字符串及其各种操作方法,这些都是String为了展现它的魅力,给我们看到的它的各种神奇功效。殊不知,在这些变来变去的招式后面,String还有个特别之处。

      String 字符串是常量,不能进行修改。 String对象是不可变的,同时它也是很大方,虽然不能改变,但是可以共享内存。

      现在还是来说说它的特别的地方,平时我们在new一个类的对象时,给不同的值,内容发生改变,但是其地址是没有变的<!--StartFragment -->

例如:Student stu = new Student();
 	stu.setAge(1);
	stu.setAge(2);
       而String不是,String在new的时候,会在堆内存中开辟一块新的内存,String 再次赋值时,不是将原有的内容进行修改,而是开辟一个新的内存空间,将新的值放入进去
String str = "abc";
String str2 = new String(data);
System.out.println("str.equals(str2):"+str.equals(str2));
System.out.println(str==str2);
结果:
str.equals(str2):true
false
 所以一般String 一般不采用new的方式,而是直接进行赋值操作,不然很容易造成内存空间的浪费。
      String类在给变量赋值一个字符串时,变量的值是放在静态共享池里,所以在产生新的变量时,JVM会检查共享池是否有”123“这个字符串,有的话就直接指向这个内存,没有就新建一个内存来存放这个新的字符串。但是这样不也是浪费了内存了吗?其实也不一定,如果有大量的String类型的变量,它们值都相同,都指向同一个内存,而当其中一个的值改变了,那么就只要为这个改变的变量重新开辟内存,其它的变量可以不发生变,这样相对于new的方式不是节约很多的内存么。
      这样说可能有点拗口,举个例子(不是很恰当哈):现在有N个人没地方住   ,所以就为他们新建了一栋公寓,容纳了这些人。然后有一天,其中的一个人,挣了很多钱,不满意那个环境了,自己就搬进了新建的一栋别墅。其他人没有那么多钱还是只能住在公寓里面,这群人就只占了一栋公寓和一栋别墅的面积,而要是像new String那样,每个人一栋房子,就需要N栋房子的面积了,估计这地球也容纳不了那么多人了。

      所以没必要的时候不要去new一个String对象,同时,不要频繁的修改String类型的变量的内容,这两种情况都会导致内存空间的浪费
 当需要对大量字符串进行拼接时,又要发愁了,想啊,String类怎么这么霸道呀,不用着急,这不有了一个StringBuffer类(线程安全的可变字符序列)为String弥补了这个不足
String str3="123";
StringBuilder sb = new StringBuilder(str3);
	for(int i=0;i<5;i++){
		sb.append("n"+i);
	}
        //将拼接完全的内容交换给Str3
	str3 = sb.toString();
	System.out.println("sb:"+sb);
	System.out.println(str3);
结果:
sb:12345n0n1n2n3n4
12345n0n1n2n3n4
       在拼接大量字符串时,使用StringBuffer 保证了只有一个对象在进行操作,这些改变发生在一个类似于 String 的字符串缓冲区,不能修改,但可以通过append()等方法来改变该序列的长度和内容
      除了StringBuffer类,有相同功能的还有StringBuilder类(线程不安全),该类被用作 StringBuffer 的一个简易替换,其效率比StringBuffer高,一般都会选择用StringBuilder类
      看到这里应该已经知道了String的特别了吧,String类是一个又小气又大方的类,就是这样一个类在java中起着不可忽视的作用。就像一个调皮的小孩,皮的时候让人闹足了心;安静的时候,能让人看醉了。尽管这样的矛盾,但还是忍不住的喜欢。
 
 
 
 
 
 

 

0
0
分享到:
评论

相关推荐

    String类创建对象问题

    尽管如此,`String` 类拥有其独特之处,比如它是不可变的(final),这保证了字符串一旦创建便不能更改其内容。 **常量池(Constant Pool)**:在 Java 编译阶段确定的数据集合,存储在 `.class` 文件中。它包含了类...

    String容量大小区分

    通过对“String容量大小区分”的分析,我们了解到Java中String对象的独特行为及其对内存管理的影响。为了提高代码效率并避免不必要的资源浪费,开发者应该合理选择字符串创建方式,尤其是在涉及大量字符串操作的场景...

    小心String的陷阱——深入剖析Java中String的处理机制

    文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。下面我们将详细探讨这些陷阱及其背后的原理。 ### String的不可变性 `String`在Java中被设计为不可变对象,...

    深入了解java 中的String

    综上所述,`String` 类在Java中具有非常独特的地位。它不仅提供了丰富的操作字符串的方法,而且通过不可变性和字符串池等机制,极大地提高了程序的效率和安全性。了解这些特性对于编写高质量的Java程序至关重要。

    java面试笔试题String 和StringBuffer的区别

    在Java编程语言中,`String`与`StringBuffer`是两个重要的字符串处理类,它们各自具有独特的特性和用途,尤其在面试或笔试中常被提及作为考察应聘者对Java基础知识掌握程度的重要知识点。 ### `String`类:不可变性...

    dotnet-FastString提供了两种使用字符串的方法可以比NET快得多

    总的来说,`FastString`是一种针对.NET平台的字符串性能优化工具,通过其独特的设计和实现,能够在特定场景下提供显著的性能提升。然而,选择是否使用它,需要根据具体项目需求和性能测试结果来决定。

    NoSQL数据库之Redis数据库管理三(string类型和hash类型)

    然而,Redis并不仅限于String和Hash,它还支持List、Set和Sorted Set等其他数据类型,每种都有其独特的应用场景。例如,List可以用于实现消息队列,通过LPUSH和RPOP命令添加和取出元素;Set适合存储不重复的元素,如...

    Synthetic_Chinese_String_Dataset 中文识别数据集 37

    这种结构便于算法学习和理解每个字符的独特特征,进而实现准确的字符分割和识别。 3. 应用场景: - OCR系统开发:对于构建OCR系统来说,该数据集是不可或缺的组成部分。它可以帮助优化模型,使其能够准确识别不同...

    java String源码和String常量池的全面解析

    当我们使用字面量创建 String 对象时,JVM 会在内存中创建一个独特的对象,并将其存储在 String 常量池中。如果我们使用 new 关键字创建 String 对象,那么 JVM 就会在堆中创建一个新的对象,而不是从 String 常量池...

    Heres a werid string. Its basicly just a poem I wrote that f

    通过`LSD_LostSideDead`这一系列文件名,我们猜测项目可能是一个名为“Lost Side Dead”的小项目,具有独特的视觉表现,例如文本动画。开发者可能使用了Visual Studio作为集成开发环境,并利用.NET或旧版VC++框架来...

    匿名类/内部类/本地类 解读

    在Java编程语言中,匿名类、内部类和本地类是三种特殊的类定义方式,它们各自具有独特的特性和用途。下面将详细解读这三者之间的差异,并通过实例来帮助理解。 首先,**匿名类**是在没有类名的情况下创建的类,通常...

    Java接口和内部类教程

    每种类型的内部类都有其独特的用途和特点。 ##### 3.2.1 成员内部类 成员内部类是最常见的内部类形式,它作为外部类的一个成员出现。它可以是静态的也可以是非静态的。成员内部类可以直接访问外部类的所有成员,...

    char bytearray string的区别.docx

    在编程领域,`char`、`bytearray` 和 `string` 是三种常见的数据类型,它们在不同的场景下有着各自独特的用途。特别是在机器视觉、Qt 和 C++ 这样的上下文中,理解它们的区别至关重要。 首先,`char` 在C++中通常...

    java 内部类 局部内部类 匿名类 实例代码

    Java内部类是Java语言特性中一个独特而强大的部分,它允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的...

    string函数内核

    总之,`std::string`函数内核在C++编程中扮演着重要角色,提供了强大的字符串操作功能,而`strcpy`和`strcmp`则是C语言中的经典字符串操作函数,它们在某些场景下仍然有其独特价值。理解这些函数的用法和原理对于...

    c++继承类(StudentAndTeacher继承至Person

    这个设计模式常见于模拟现实世界中的关系,比如在学校环境中,学生和教师都是人,但各自具有独特的属性和行为。 首先,让我们定义基类Person。Person类可能包含一些通用的属性,如姓名、年龄等,以及与人相关的通用...

    String.inf Editor_darkedentools_

    Dark Eden是一款经典的在线角色扮演游戏,它具有丰富的背景故事和独特的游戏机制,吸引了大量玩家。这款编辑器的出现,旨在帮助游戏服务器管理员更加便捷地管理和定制游戏内容。 在Dark Eden的运营中,`String.inf`...

    String 第二版

    在各种编程语言中,字符串的处理都有其独特的方式和技巧。本篇文章将基于《String第二版》的内容,深入探讨字符串相关的知识,特别是新增的Format和Find函数,帮助开发者更高效地进行文本操作。 1. **字符串基础** ...

    change-string-to-binary.zip_egg3u4_labview binary_string labview

    LabVIEW是一种图形化编程语言,它的独特之处在于使用图标和连线来代替传统的文本代码,这使得编程过程更加直观。 首先,我们要理解“字符串”和“二进制”的概念。字符串是包含一系列字符的数据类型,通常用于表示...

    内部类的相关知识-静态内部类,匿名内部类……

    ### 内部类的相关知识-静态内部类,匿名内部类…… #### 一、内部类概述 内部类(Inner Class)是 Java 中一...每种类型的内部类都有其独特的特性和应用场景,理解这些差异对于更高效地利用 Java 语言特性至关重要。

Global site tag (gtag.js) - Google Analytics