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

为什么我们不在初始化字符串时使用new运算符?

在Java中,字符串是一个不可变的对象,这意味着它们在创建后不能被修改。因此,当我们使用new运算符创建一个字符串时,我们实际上是在创建一个新的字符串对象,而不是修改已有的字符串。这可能会导致内存浪费和性能下降。

为了避免这些问题,我们应该使用字符串字面量或StringBuilder/StringBuffer类来创建字符串。字符串字面量是通过双引号括起来的字符序列,例如"Hello, world!"。这些字符串在编译时就已经创建好了,因此在运行时不需要额外的内存分配。

如果我们需要修改字符串或者进行复杂的字符串操作,我们可以使用StringBuilder/StringBuffer类。这些类是可变的,可以在创建后修改其内容。使用StringBuilder/StringBuffer的好处是它们在执行字符串操作时具有更好的性能,因为它们不会创建新的字符串对象,而是在原有对象上进行修改。

总之,我们不应该使用new运算符来初始化字符串,因为这可能导致内存浪费和性能下降。相反,我们应该使用字符串字面量或StringBuilder/StringBuffer类来创建和操作字符串。

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

相关·内容

String s=a+b+c,到底创建了几个对象?

估计大家会有疑问了,为什么源代码中字符串拼接的操作,在编译完成后会消失,直接呈现为一个拼接后的完整字符串呢?...再看一下编译后的字节码文件中的常量池区域: 可以看到常量池中只有一个String类型的常量hello Hydra,而s2对应的字符串常量则不在此区域。...等一元运算符(不包括++和--)进行计算 使用加减运算符+、-,乘除运算符*、 / 、% 进行计算 使用移位运算符 >>、 >>进行位移操作 …… 字面量(literals)是用于表达源代码中一个固定值的表示法...,在Java中创建一个对象时需要使用new关键字,但是给一个基本类型变量赋值时不需要使用new关键字,这种方式就可以被称为字面量。...通过之前的分析,我们知道s3会进行常量折叠,引用的是常量池中的ab,所以相等。而字符串s2在进行拼接时,表达式中引用了其他对象,不属于编译期常量,因此不能进行折叠。

95820

String s=a+b+c,到底创建了几个对象?

估计大家会有疑问了,为什么源代码中字符串拼接的操作,在编译完成后会消失,直接呈现为一个拼接后的完整字符串呢?...再看一下编译后的字节码文件中的常量池区域: 可以看到常量池中只有一个String类型的常量hello Hydra,而s2对应的字符串常量则不在此区域。...等一元运算符(不包括++和--)进行计算 使用加减运算符+、-,乘除运算符*、 / 、% 进行计算 使用移位运算符 >>、 >>进行位移操作 …… 字面量(literals)是用于表达源代码中一个固定值的表示法...,在Java中创建一个对象时需要使用new关键字,但是给一个基本类型变量赋值时不需要使用new关键字,这种方式就可以被称为字面量。...通过之前的分析,我们知道s3会进行常量折叠,引用的是常量池中的ab,所以相等。而字符串s2在进行拼接时,表达式中引用了其他对象,不属于编译期常量,因此不能进行折叠。

97510
  • C++ 中 mallocfree与 newdelete区别

    由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free 。...2. new能够自动返回正确的指针类型。 3. 必须时,new能将单个变量初始化。...对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new 的语句也可以有多种形式。 如果用new 创建对象数组,那么只能使用对象的无参数构造函数。...由于,malloc/free是库函数而不是运算符,不在编译器控制权限之内,也就不能执行构造函数和析构函数,不能够把执行构造函数和析构函数的任务强加于malloc/free。...因此,C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。new/delete不是库函数,而是运算符。

    95420

    【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路

    在最初的实现中,我们将模拟 C++ 标准库 string 类的基本行为,让其能够存储字符串,并在析构时正确释放内存。...3.1 为什么需要重载赋值运算符?...在C++中,当我们将一个对象赋值给另一个对象时,默认情况下,编译器会为我们生成一个浅拷贝的赋值运算符。...在这种情况下,如果我们没有进行检查,就会先删除对象的内存,然后再试图复制同一个对象的内容,这样会导致程序崩溃。因此,重载赋值运算符时,自我赋值检查是非常必要的。...5.1.2.4 复杂类型为什么不能在类内初始化? 对于复杂类型(如 double、float 或自定义类等),这些类型的初始化可能涉及到运行时的计算或需要分配更多的内存。

    29720

    C++: 06---构造函数析构函数

    思考: 当对象中存在指针成员时,为什么需要自己实现拷贝构造函数?如果不,会出现怎样的问题?...mname指针被分配一次内存,但是程序结束时该内存却被释放了两次,会造成内存泄漏问题,这是一个不容忽视的问题。我们不得不自己写一个拷贝构造函数。...(浅拷贝) 默认赋值运算符的重载函数: 赋值运算符重载函数用于类对象的赋值操作,当我们未实现该函数时,编译器会自动为我们实现该函数。...}; 各个解析分别完成下上面String类声明的函数: 1、构造函数 /*    1、构造函数在构造对象时使用;   2、传入参数的判断;   3、对象的初始化问题。...]; strcpy(m_data,str); } } 2、拷贝构造函数 /*   1、拷贝构造函数必须在构造对象时使用,即定义对象时;   2、对象初始化问题。

    67620

    Python编程思想(3):数字及其相关运算

    (2)比较运算符 比较无处不在,大于、小于、等于、不等于……和 C/C++、Java 等编程语言一样,Python 也提供了6种比较运算符:>(大于),运算符: &:按位与,参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0; |:按位或,只要对应的2个二进位有一个为1时,结果位就为1; ^:按位异或,当两对应的二进位相异时...介绍成员运算符之前,我们需要提前了解一个概念:数据结构,如字符串、列表、元组、字典。在接下来的文章中我们将详细介绍这些基础的数据结构。...字符串、列表、字典,它们就像一个集合,其中包含若干元素,这些元素就是集合的成员;对于一个给定的元素,它有可能在一个给定的集合中,也可能不在,Python 中采用成员运算符来判断元素是否属于成员,成员运算的结果为布尔值...看下面的代码: #初始化字符串和列表 temp1 = "abcdefg" temp2 = [4,2,3,5,8,9] a = "cdf" b = 5 c = "cde" print("a in temp1

    91520

    C++ 赋值运算符=的重载(浅拷贝、深拷贝)

    需要注意的是:赋值运算符 = 只能重载为成员函数。 ---- — 2 — 举个栗子 下面我们以自定义一个自己的字符串类代码的例子,讲解赋值运算符的重载函数。...; 语句实际上是初始化语句,而不是赋值语句,因为是初始化语句,所以需要调用构造函数进行初始化,那么这时就需要有 char* 参数的构造函数,由于我们没有定义此构造函数,所以就会编译出错。...这时当一个对象释放了指针成员变量时,那么另外一个对象的指针成员变量指向的地址就是空的了,再次使用这个对象时,程序就会奔溃了,因为该对象的指针成员函数已经是个不合法的指针了! ?...我们再加个判断,当左右两边是相同对象时,就直接返回该对象就好: MyString & operator=(const MyString & s) { // 当左右两边是相同对象时,就直接返回该对象就...为什么是MyString &? 当我们重载一个运算符的时候,好的风格应该是尽量保留运算符原本的特性。

    2.3K41

    【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类的私有指针成员 | 为指针分配指定大小内存并初始化 0 )

    一、重载 左移 运算符 1、左移 运算符作用 左移运算符重载 , 可参考 【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 类对象 使用 左移运算符...) 博客 ; 左移运算符 用于 cout << s1 << endl 语句中 , 将 s1 对象输出到 cout 标准输出流中 , 这是 2、重载 左移 运算符 使用 全局函数 实现 左移运算符..., 不包括 '\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中的字符串 char* m_p; }; 2、为指针分配指定大小内存并初始化...// 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向的内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用 new 关键字为..., 使用 String 对象初始化 对象值 String::String(const String& s) { // 拷贝字符串长度 // 注意 : 字符串指针 指向的内存空间大小需要 +1 ,

    27210

    JavaScript ES12新特性抢先体验

    在JavaScript中,replace方法只能是替换字符串中匹配到的第一个实例字符,而不能进行全局多项匹配替换,唯一的办法是通过正则表达式进行相关规则匹配替换 而replaceAll则是返回一个全新的字符串...WeakRefs 使用WeakRefs的Class类创建对对象的弱引用(对对象的弱引用是指当该对象应该被GC回收时不会阻止GC的回收行为) 当我们通过(const、let、var)创建一个变量时,垃圾收集器...,但是会发生内存溢出,因为传递给doSomething函数的每个对象都永久保存在map中,并且不会被GC回收,因此我们可以使用WeakMap let wmap = new WeakMap() function...在这种情况下,最好使用LRU之类的缓存。 逻辑运算符和赋值表达式 逻辑运算符和赋值表达式,新特性结合了逻辑运算符(&&,||,??)...(a = b) 为什么不再是跟以前的运算公式a = a op b一样呢,而是采用a = a op (a = b)。

    34630

    【C++篇】手撕string类:从初级到高级入门

    3.赋值运算符重载与深拷贝 3.1 为什么需要重载赋值运算符? 在C++中,当我们将一个对象赋值给另一个对象时,默认情况下,编译器会为我们生成一个浅拷贝的赋值运算符。...在这种情况下,如果我们没有进行检查,就会先删除对象的内存,然后再试图复制同一个对象的内容,这样会导致程序崩溃。因此,重载赋值运算符时,自我赋值检查是非常必要的。...11 6 5.1.1 为什么 static const size_t npos = -1 可以在类内初始化?...因此,npos 的初始化类似于前面提到的整型静态成员变量。由于 -1 可以表示为 size_t 的最大值,这个值在编译时就可以确定,因此它符合类内初始化的条件。...,(只要是在编译时可以确定为常量就可以在类内初始化,无任何限制)符合在类内部初始化的条件。

    10700

    JavaScript ES12新特性抢先体验

    在JavaScript中,replace方法只能是替换字符串中匹配到的第一个实例字符,而不能进行全局多项匹配替换,唯一的办法是通过正则表达式进行相关规则匹配替换 而replaceAll则是返回一个全新的字符串...WeakRefs 使用WeakRefs的Class类创建对对象的弱引用(对对象的弱引用是指当该对象应该被GC回收时不会阻止GC的回收行为) 当我们通过(const、let、var)创建一个变量时,垃圾收集器...,但是会发生内存溢出,因为传递给doSomething函数的每个对象都永久保存在map中,并且不会被GC回收,因此我们可以使用WeakMap let wmap = new WeakMap() function...在这种情况下,最好使用LRU之类的缓存。 逻辑运算符和赋值表达式 逻辑运算符和赋值表达式,新特性结合了逻辑运算符(&&,||,??)...(a = b) 为什么不再是跟以前的运算公式a = a op b一样呢,而是采用a = a op (a = b)。

    59131

    今天你学C++了吗?——string(下)

    ~ 常量字符串进行初始化 1、使用常量字符串进行初始化~ 像以前,我们初始化会建议在初始化列表进行初始化,这一次为了代码更加简便,我们首先使用初始化列表初始化string的长度~剩下的就可以使用已经初始化的长度在函数体里面进行初始化...:_size(strlen(str))//使用strlen求有效长度来初始化 { //使用已经初始化的_size来初始化剩下的 _capacity = _size; _str = new...} 运算符重载 为了后面更好的使用,我们这里先进行运算符重载~ 前面我们就知道这个运算符在类外进行定义才更加符合我们平时的使用习惯~这里我们可以让它输出我们想输出的内容~这里为了后面好观察,我们先让它把成员都进行输出...当使用赋值运算符(=)将一个对象的值赋给另一个同类型的已存在对象时,会调用重载的赋值运算符。 避免自赋值: 在实现赋值运算符重载时,必须考虑自赋值问题,即对象赋值给自己的情况。...,它们达到了相同的效果,显然代码复用代码量大大减少,所以我们更加推荐使用代码复用~ erase 插入我们都会了,相信删除更是不在话下~ //erase void my_string::erase(size_t

    3600

    -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义

    标识符 程序中自定义的一些名称,变量名,类名,方法名等 字符/数字/下划线/$/  组成  不可以使用关键字 不允许以数字开头    严格区分大小写 $为了规范不要使用 规范的形式: 包名:多单词组成时所有字母都小写...•用来不断的存放同一类型的常量,并可以重复使用 使用变量注意: •变量的作用范围(一对{}之间有效) •初始化值 定义变量的格式: •数据类型    变量名 =  初始化值; •注:格式是固定的,记住格式...换句话说是符号跟%前面的一致 整数之间除号“/” 是取整 “+”除字符串相加功能外,还能把非字符串转换成字符串,如果与字符串+ 可以当做是连接符 赋值运算符 = , +=, -=, *=, /=, %=...或只要有一个为真则为真 与两个都为真才为真 单个的不会短路,也就是无论如何两侧都会计算 双个的会短路 一旦结果可以推断出来,不在继续计算 异或是两个不同才为真 位运算符 直接对二进制进行运算 << 左移...表达式1:表达式2; 如果条件为true,运算后的结果是表达式1; 如果条件为false,运算后的结果是表达式2; 运算符的优先级(从高到低) 如果在程序中,要改变运算顺序,可以使用()。

    91520

    分享丨CC++内存管理详解--堆、栈

    作为忠告,保守的使用内存分配是嵌入式环境中的第一原则。   但当你必须要使用new和delete时,你不得不控制C++中的内存分配。...有了malloc/free为什么还要new/delete malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。...由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。...new/delete的使用要点 运算符new使用起来要比函数malloc简单得多,例如: int *p1 = (int *)malloc(sizeof(int) * length); int *p2

    1.1K21

    C++ Primer Plus 第四章 复合类型 学习笔记

    C++使用索引的方括号表示法来指定数组元素。 1.4 数组的初始化规则 1.只有在定义数组时才能初始化,此后不能使用,也不能将一个数值赋给另一个数组。 2.初始化数组时,提供的值少于数组的元素数目。...在C++中列表初始化就增加了一些功能: 初始化数组时,可省略等号(=) double earnings[4] {1.2e4,1.6e4,1.1e4,1.7e4}; 可不在大括号内包含任何东西,这会将所元素都设置为零...int tacos[10] // 静态联编 使用new[]运算符创建数组时,将采用动态联编(动态数组),即将在运行时为数组分配空间,其长度为运行时设置。... 在字符串读入程序时,应使用已分配的内存地址。该地址不是数组名,也可以使用new初始化过的指针。 strcpy()接受两个参数,第一个:目标地址,第二个:要复制的字符串的地址。...8.3 使用new创建动态结构 对于在指定结构成员时,句点运算符和箭头运算符的选择时: 如果结构标识符是结构名,则使用句点运算符(.)。 如果标识符是指向结构的指针,则使用箭头运算符(->)。

    1.8K00

    Java基础第一阶段知识点,招实习的面试官都在问这些

    a) 当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换。 b) 当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转换运算。 7. &&和&区别,||和|区别?...a) 使用new 运算符和类的构造方法为对象分配内存,如果类中没有构造方法,系统 会调用默认的构造方法。 20. 系统什么情况下会为类提供构造方法,提供什么样的构造方法?...a) 使用运算符” . ”来调用自己的成员变量和方法。 22. 为什么可以直接用类名来访问类成员变量和类方法?...a) 假设,A 类是B 类的父类,当我们用子类创建一个对象,并把这个对象的引用放 到父类的对象中时,我们称这个父类对象是子类对象的上转型对象。 34. 上转型对象可以操作什么?不可以操作什么?...^是位运算符,异或运算的规则是什么? a) 相同0,不同1 70. ~是位运算符,非运算的规则是什么? a) 遇1则0,遇0则1 71. if语句后边有个括号,该括号里表达式为什么类型?

    51510

    疯狂Java笔记之表达式中的陷阱

    在一般情况下,字符串池的字符串对象不会被垃圾回收,当程序再次需要使用该字符串时,无需重新创建一个新的字符串,而是直接让引用变量指向字符串池中已有的字符串。...但如果程序使用了变量,或者调用的方法,那么只能等到运行时才能确定该字符串连接表达式的值,也就无法再编译时确定该字符串变量的值,因此无法利用JVM的字符串池。...但是改为如下就没有问题了: short sValue=5; sValue-=2; 上面程序使用复合赋值运算符,就不会导致编译错误。...慎用字符Unicode转义形式 理论上,Unicode转义字符可以代表任何字符(不考虑那些不在Unicode码表内的字符),因此很容易想到:所有字符都应该可以使用Unicode转义字符的形式。...而当我们String in=intList.get(i)时是会报编译错误的。 为此总结如下: 当程序把一个原始类型的变量赋给一个带泛型信息的变量时,总是可以通过编译---只是会提示一些警告信息。

    50010

    C++之指针使用

    大家好,又见面了,我是全栈君 C++指针使用的好坏直接反映了编程人员水平的高低,下面从指针和数组的区别、指针参数是如何传递内存、野指针、malloc/free、new/delete和内存耗尽怎么办方面进行总结...“野指针”的成因主要有三种:   (1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。   .../delete   malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。...由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。   ...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

    65210

    Java基础第一阶段知识点,招实习的面试官都在问这些

    a) 当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换。 b) 当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转换运算。 7. &&和&区别,||和|区别?...a) 使用new 运算符和类的构造方法为对象分配内存,如果类中没有构造方法,系统 会调用默认的构造方法。 20. 系统什么情况下会为类提供构造方法,提供什么样的构造方法?...a) 使用运算符” . ”来调用自己的成员变量和方法。 22. 为什么可以直接用类名来访问类成员变量和类方法?...a) 假设,A 类是B 类的父类,当我们用子类创建一个对象,并把这个对象的引用放 到父类的对象中时,我们称这个父类对象是子类对象的上转型对象。 34. 上转型对象可以操作什么?不可以操作什么?...^是位运算符,异或运算的规则是什么? a) 相同0,不同1 70. ~是位运算符,非运算的规则是什么? a) 遇1则0,遇0则1 71. if语句后边有个括号,该括号里表达式为什么类型?

    58790
    领券