首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么concat和<<要更改字符串变量,而赋值不能

concat和<<是字符串拼接的两种常见方式,而赋值是将一个值赋给一个变量。

  1. concat是字符串的方法,它将两个字符串连接起来并返回一个新的字符串。例如,对于两个字符串变量str1和str2,可以使用str1.concat(str2)来将它们拼接在一起。这是因为字符串是不可变的,即一旦创建就不能修改,所以concat方法会创建一个新的字符串来存储拼接后的结果。
  2. <<是C++中的位运算符,用于将一个字符串追加到另一个字符串的末尾。例如,对于两个字符串变量str1和str2,可以使用str1 << str2来将str2追加到str1的末尾。这是因为C++中的字符串是以字符数组的形式存储的,可以通过修改数组中的元素来实现字符串的拼接。
  3. 赋值是将一个值赋给一个变量,用于更新变量的值。例如,对于一个字符串变量str,可以使用str = "new value"来将新的值赋给str。赋值操作不会改变字符串本身,而是更新变量的引用。

总结起来,concat和<<是用于字符串拼接的操作,而赋值是用于更新变量的值。由于字符串是不可变的,所以拼接操作会创建一个新的字符串来存储拼接后的结果。而赋值操作只是更新变量的引用,不会改变字符串本身。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

灵魂拷问:为什么 Java 字符串是不可变的?

String alita = "阿丽塔"; 这行代码在字符串常量池中创建了一个内容为“阿丽塔”的对象,并将其赋值给了字符串变量 alita(存储的是字符串对象"阿丽塔"的引用)。如下图所示。 ?...String wanger = alita; 这行代码将字符串变量 alita 赋值给了字符串变量 wanger。这时候,wanger alita 存储的是同一个字符串对象的引用。如下图所示。...alita = "战斗天使".concat(alita); 这行代码将字符串“战斗天使”拼接在字符串变量 alita 的前面,并重新赋值给 alita。这个过程就比之前的复杂了。...(alita) 这行代码会先在字符串常量池中创建一个新的字符串对象,内容为“战斗天使”,然后 concat() 方法会将其对应的字符数组“阿丽塔”对应的字符数组复制到一个新的字符数组 buf 中,最后...05、最后 总结一下,字符串一旦在内存中被创建,就无法被更改。String 类的所有方法都不会改变字符串本身,而是返回一个新的字符串对象。

61220

灵魂拷问:为什么 Java 字符串是不可变的?

String alita = "阿丽塔"; 这行代码在字符串常量池中创建了一个内容为“阿丽塔”的对象,并将其赋值给了字符串变量 alita(存储的是字符串对象"阿丽塔"的引用)。如下图所示。 ?...String wanger = alita; 这行代码将字符串变量 alita 赋值给了字符串变量 wanger。这时候,wanger alita 存储的是同一个字符串对象的引用。如下图所示。...alita = "战斗天使".concat(alita); 这行代码将字符串“战斗天使”拼接在字符串变量 alita 的前面,并重新赋值给 alita。这个过程就比之前的复杂了。...(alita) 这行代码会先在字符串常量池中创建一个新的字符串对象,内容为“战斗天使”,然后 concat() 方法会将其对应的字符数组“阿丽塔”对应的字符数组复制到一个新的字符数组 buf 中,最后...最后 总结一下,字符串一旦在内存中被创建,就无法被更改。String 类的所有方法都不会改变字符串本身,而是返回一个新的字符串对象。

42010

JavaScript Types (类型)

或者说,JavaScript 不做“类型强制”;也就是说,语言引擎不要求变量 总是持有与其初始值同类型 的值。一个变量可以现在被赋值字符串类型值,随后又被赋值为数字类型值。...null 是一个特殊关键字,不是标识符,不能将其当作变量来使用赋值 undefined 是一个标识符,可以被当作变量来使用赋值 特殊的数字 NaN 不是数字的数字,即 NaN 如果数学运算的操作数不是数字类型...复合值(compound value)——对象(包括数组封装对象)函数,则总是 通过引用复制的方式来赋值 / 传递。 由于引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向。...[4, 5, 6, 7] 不能通过引用 x 来更改引用 a 的指向,只能更改 a x共同指向的值。...如果要将 a 的值变为 [4,5,6,7] ,必须更改 x 指向的数组,不是为 x 赋值一个新的数组。 我们无法自行决定使用值复制还是引用复制,一切由值的类型来决定。

38120

Java基础查漏补缺:String为什么不可修改

比较String与StringBuilder时我们都知道: String是不可修改的 StringBuilder可以修改 所以当字符串需要频繁更改时推荐使用StringBuilder....但是为什么呢? 原来String对象只是一个引用,每次新建一个String对象s,编译器都会去堆中的字符串常量池中寻找有没有匹配的字符串,有就s指向它;没有就新建一个字符串,然后s指向它。...用几个图辅助解释一下: 1.声明String对象 String s = “abcd”; 2.将一个字符串变量赋值给另一个String变量 String s2 = s; 可以看到,每次新建一个字符串变量时...3.字符串连接 s = s.concat(“ef”); // s = s + “ef”; // 等价 s+”ef” 这一步创建了一个新的常量abcdef,由于常量池中没有,所以就新建了一个常量...这就解释了为什么String是不可修改的,因为修改的只是String的引用指向的地址,字符串常量本身是不会变的。 存在即合理。String内容不可修改有什么好处呢?

41920

JavaScript

JavaScript语言基础 变量的声明 变量名可以使用数字,字母,下划线,$组成,不能以数字开头。 声明变量使用var 变量名; let 变量名;的格式来进行声明。...且不可更改        变量不能用保留字 例: var a=123 a 123 let b=123 b 123 var b=123 VM267:1 Uncaught SyntaxError...: Identifier 'b' has already been declared #提示不能更改,已经被定义 var a=2 #但是a能被更改 a 2 JavaScript数据类型 数值(...null表示变量的值是空,undefined则表示只声明了变量,但还没有赋值。 对象(Object) 对象只是带有属性方法的特殊数据类型。...局部变量会在函数运行以后被删除。       全局变量会在页面关闭后被删除。 创建对象 创建对象时,命名的首字母大写,实例化的时候使用new关键字进行实例化。

1.2K10

一文读懂字符串String

为什么字符串是不可变的 在工作中,我们经常要在代码中对字符串进行赋值改变它的值,但是,为什么我们说字符串是不可变的呢?...final关键字的作⽤有如下⼏种: final修饰类时,表明这个类不能被继承 final修饰⽅法,表明⽅法不能被重写 final修饰变量,如果是基本数据类型的变量,则其数值⼀旦在初始化之后便不能改变;如果是对象...这意味着,一旦对象被赋值变量,我们既不能更新引用,也不能通过任何方式改变内部状态。...为什么String设计成不可变 在知道了"String是不可变"的之后,大家是不是一定都很疑惑:为什么要把String设计成不可变的呢?有什么好处呢?...它们也是线程安全的,因为如果线程更改了值,那么将在字符串池中创建一个新的字符串不是修改相同的值,不会发生竞争条件,也不需要进行额外的同步操作。因此,字符串对于多线程来说是安全的。

49520

深入理解React的组件状态

状态的类型是不可变类型(数字,字符串,布尔值,null, undefined) 这种情况最简单,因为状态是不可变类型,直接给修改的状态赋一个新值即可。...// 方法一:将state先赋值给另外的变量,然后使用concat创建新数组 var books = this.state.books; this.setState({ books: books.concat...= 'React'; }); })) 注意:不要使用push、pop、shift、unshift、splice等方法修改数组类型的状态,因为这些方法都是在原数组的基础上修改,concat、slice...// 方法一:将state先赋值给另外的变量,然后使用Object.assign创建新对象 var owner = this.state.owner; this.setState({ owner:...那么,为什么React推荐组件的状态是不可变对象呢?

2.3K30

JS基础知识总结(二):浅拷贝与深拷贝

上一篇JS基础知识总结(一)主要了介绍变量类型相关的基础知识,本文将介绍JS的深拷贝浅拷贝的有关内容。 1.基本概念 (1)深拷贝浅拷贝针对的是引用类型。...此方法不会更改现有数组,而是返回一个新数组。注意这里分两种情况: (1)对象引用(不是实际对象):concat将对象引用复制到新数组中。原始数组新数组都引用相同的对象。...也就是说,如果引用的对象被修改,则更改对于新数组原始数组都是可见的。这包括也是数组的数组参数的元素。...(2)数据类型如字符串,数字布尔(不是String,Number Boolean 对象):concat字符串和数字的值复制到新数组中。...console.log('iniObj', iniObj); console.log('newObj', newObj) 结果: setTo.png 说明把一个对象赋值给另一个变量

2.8K361

define与const关键字的多种用法

1.5 连接宏 #define CONCAT(x, y) x##y 这将创建名为 CONCAT 的宏,可将两个标识符连接在一起。例如CONCAT(a, b) 将被替换为 ab。...} }; 在类中,成员函数声明中的const关键字表示该函数是一个常量成员函数,它不能修改类的成员变量(除非它们声明为mutable)。...易错 1. constdefine的区别 #define PI 3.14 //符号常量 const float PI=3.14; //常变量 const用于定义常量;...define用于定义宏,宏也可以用于定义常量。...都用于常量定义时,它们的区别有: const定义的常变量具有变量的基本属性,包括数据类型存储单元,#define无 有些编译器可以对const常变量进行调试,不能对宏调试 符号常量采用

7510

C#基础知识系列三(类结构体、StringStringBuilder、equals==)

结构体是可以New的,结构体构造函数要求必须要为所有的字段赋值.即使是无参的构造函数,也会给值类型赋初值为0,引用类型赋初值为null 同:   1.都有属性方法   2.类一样可以继承自接口 String...在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果修改字符串不创建新的对象,则可以使用 System.Text.StringBuilder 类。...Console.WriteLine(p3.Equals(p4)); Console.ReadLine(); } } 结果输出: 因为值类型是存储在内存中的堆栈(以后简称栈),引用类型的变量在栈中仅仅是存储引用类型变量的地址...因此在上面的例子中,字符串a字符串b的两个比较是相等的。 g.equals(h)用的是sting的equals()方法故相等(多态)。...这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以ab指向的是同一个字符串字符串在这种赋值的情况下做了内存的优化)。

49340

聊聊并发编程:final关键字

扩展思考,为什么String类为什么是final的?先看下源码 final修饰的String,代表了String的不可继承性,final修饰的char[]代表了被存储的数据不可更改性。...那么为什么保证String不可变呢,因为只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。...但如果字符串是可变的,那么字符串池将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。...这就是HashMap中的键往往都使用字符串。 四、final的重排序规则 对于final域,编译器处理器遵守两个重排序规则。...对于引用类型,写final域的重排序规则对编译器处理器增加了如下约束:在构造函数内对一个final引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序

14130

TypeScript 4.0 RC发布,带来诸多更新

这意味着即使我们不知道操作的实际类型,也可以表示对元组和数组的高阶操作。在这些元组类型中实例化泛型 spread(或用真实类型替换)时,它们可以产生其他数组元组类型集。...值得注意的是,标记在解构时不需要用不同的名称命名变量。它们纯粹是为文档工具链服务的。...JavaScript 许多语言都支持一组称为"复合赋值运算符"的运算符。...但是有三个值得注意的例外:逻辑(&&),逻辑或(||)空值合并(??)。TypeScript 4.0 添加了三个新的赋值运算符:&&=,||= ??=。...为什么自动导入适用于 @types 软件包,不适用于使用自己类型的包呢?其实自动导入是通过检查项目中已经包含的软件包来实现的。

2.7K20

js对象的直接赋值、浅拷贝与深拷贝

直接将this.ruleForm赋值给一个变量object,然后每次再push进this.tableData里,这样看上去逻辑似乎也没啥毛病,但是,这样就会产生一个神奇的现象:每次填写表单中的数据的时候...,表格中的每一行数据都会随着你表单的填写的改变改变。   ...以图1直接赋值的例子,person对象中有两个属性,一个是name,一个是对象属性ageAndSex;为什么弄一个对象属性,这个会涉及到后面的浅拷贝深拷贝问题,这也是他们之间的区别。...有一种非常简单的方法就是序列化成为一个JSON字符串,将对象的内容转换成字符串的形式,再用JSON.parse()反序列化将JSON字符串变成一个新的对象,这样原对象就与复制后的新对象没了必然的关系。...但是由于用到了JSON.stringify(),这也会导致一系列的问题,因为严格遵守JSON序列化规则:原对象中如果含有Date对象,JSON.stringify()会将其变为字符串,之后并不会将其还原为日期对象

4.3K20

27 个问题,告诉你Python为什么这么设计

为什么 join()是一个字符串方法不是列表或元组方法? 异常有多快? 为什么Python中没有switch或case语句? 难道不能在解释器中模拟线程,而非得依赖特定于操作系统的线程实现吗?...为什么 list.sort() 没有返回排序列表? 如何在Python中指定实施接口规范? 为什么没有goto? 为什么原始字符串(r-strings)不能以反斜杠结尾?...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 为什么必须在方法定义调用中显式使用“self”? 这个想法借鉴了 Modula-3 语言。...在函数体中赋值的那些变量(并且没有明确声明为全局)赋值,就必须以某种方式告诉解释器一个赋值是为了分配一个实例变量不是一个局部变量,它最好是通过语法实现的(出于效率原因)。...换句话说,局部变量实例变量存在于两个不同的命名空间中,您需要告诉 Python 使用哪个命名空间。 为什么不能在表达式中赋值

6.6K11

java常见面试题之String

StringBuilderStringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两 者的对象是变量,是可以更改的。...的值“de”加起来再赋值给新的str,原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。...2.StringBuilderStringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改不进行创建和回收的操作,所以速度要比String快很多。...的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。...2.上面这个例子中,编译器会创建一个 StringBuilder 对象,用来构造最终生成的 String,并为每一个字符串调用一次 StringBuilder 中的 append() 方法,因此上述代码一共执行了

41020

基础面试,为什么面试官总喜欢问String?

或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间 到这里还没完,你有没有想过为什么 String 会被设置/...当创建一个字符串时,如果该字符串已经存在于池中,那么返回现有字符串的引用,不是创建一个新对象。...如果字符串不是不可变的,连接或文件将被更改,这可能导致严重的安全威胁。该方法认为它连接到一台机器上,但实际上并没有。可变字符串也可能导致反射中的安全问题,因为参数是字符串。...不可变对象天生是线程安全的 由于不可变对象不能更改,所以它们可以在多个线程之间自由共享。这消除了同步的需求。 总之,出于效率安全性的考虑,String 被设计为不可变的。...附加说明 关于不可变对象不可变引用总是有同学搞不清楚 final User user = new User(); 上面的代码指的是 user 引用不能更改指向内存的其他地址,但是由于 User 是可变对象

46110
领券