熟悉而又神奇的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中起着不可忽视的作用。就像一个调皮的小孩,皮的时候让人闹足了心;安静的时候,能让人看醉了。尽管这样的矛盾,但还是忍不住的喜欢。
相关推荐
由于.NET对String类型变量的独特管理方式,使用不当,会严重影响程序的性能。本文分几个方面来说:了解String数据的内存分配方式、尽量少使用字串加法运算符、避免使用加法运算符连接不同类型的数据、在循环中使用...
Go函数具有独特的命名风格。 具有其他语言经验但在Go中是新手的人可能很难找出要使用的字符串函数。 这是和中函数的列表,包含有关如何将这些函数映射到其他语言的朋友的足够的额外信息。 希望此列表对新鲜的地鼠有...
3) 你知道 java 语言在面向对象编程方面有何独特的特点吗? 1.1.1 面向对象技术基础 1、面向对象(OO)的基本概念 (1)面向对象的基本思想 面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范...
它直接转换为Mp3或wma格式,不创建其它临时文件,这是Active TTS独特的特点。您可以通过设置内码参量完全控制文件的质量。 <br> Active TTS ActiveX控件的特点: 直接纪录wav、MP3 、 wma 、ogg 、vox 、au 、...
通用和多种语言的标记器。 它会在所有语言中提供一致的用法,并与该语言独特的常见用法类型相关联。
KMV的MATLAB的代码ANiq-可扩展的独特价值估计系统。 获得一个集合,多个集合的并集和交集的基数! 警告! 高度实验性。 使用风险自负! 介绍 要了解ANiq解决的问题,请阅读 要求 Node.js v6 + Redis v4 + 安装 npm ...
加密字符串归功于 Jason Van Zanten 的原始代码,这是基于此处包含的 Bash 和 Python 脚本包含使用“openssl”生成具有解码所需的独特哈希和密码的加密字符串的函数,以及使用这些值解密字符串的函数。 最明显的用例...
Parameters----------message : string String contains punctuation marks. Returns-------message : string String no longer contains punctuation marks."""punctuations = ['.',',','?','!','@','#','$','%','...
理解 java 语言中独特的异常处理机制; 掌握异常处理方法; 正确地使用捕获异常和声明抛弃异常的两种异常处理的方法; 了解自定义异常类的使用; 理解抛出异常和声明抛出异常的区别与联系; 二、实验内容: 1. 从...
一个用于React的独特的打字机(或“ windup”)效果库。 这个效果可以应用到字符串或漂亮任何你可以把作出React的children道具。 看起来像什么? 对于字符串: import { useWindup } from "windups" ; function ...
对于一些有独特的行情分析方法并且现有的股票分析软件又不能满足的人士,可以考虑采用该数据接口进行二次开发。 组件方法和属性说明: (1)方法GetData 语法: public string[,] GetData(string dataType, ...
1,switch语句可以用来测试string型的对象 这在c,c++,java等其他各主流语言中都是不可以的,唯独c#可以。 例如string a=”haha”; 代码如下: switch(a) { case “dfj”: … break; case “djkfdjkf”: …....
主要介绍了C#语法相比其它语言比较独特的地方(二),本文讲解了internal与protected、private、enum、string的==、传引用等内容,需要的朋友可以参考下
帮助从 KeyChain 插入、更新、检索和删除项目的简单类初始化 Helper,给它一些独特的东西,比如你的 bundle id [KeyChainHelper initWithServiceName:@"com.tomjay.test"]; 保存一些数据(保存和更新是同一个调用)...
独特的键值对模型 134 内存储存,速度极快 135 丰富的附加功能 136 完善的文档 137 良好的支持 137 广泛的使用 138 【Nginx】Nginx如何配置防止DDOS攻击? 139 限制每秒请求数 139 限制IP连接数 139 白名单设置 139 ...
向您的 ActiveRecord 模型添加随机的、独特的“漂亮”ID。 用法 1.安装gem gem 'pretty_id' 2. 向您的模型添加一个pretty_id列(和索引!) add_column :books , :pretty_id , :string add_index :books , ...
该库的独特之处在于您不必手动编写任何类型或模型。 它们都是根据您的数据库结构生成的,并提供100%的类型安全性! 示例(草稿语法) Gostek根据您的数据库架构生成类型和模型,例如: const User = { name : '...
领域是一个独特的全局环境,其自身的全局对象包含其自身的内在函数和内置函数(未绑定到全局变量的标准对象,例如Object.prototype的初始值)。 在解释器文档中查看更多信息。 API(TypeScript格式) declare class...