值 规则 ID CA1830 类别 “性能” 修复是中断修复还是非中断修复 非中断 原因 调用 StringBuilder Append 或 Insert 方法时,使用的是对 Append 或 Insert...方法有专用重载的类型调用 ToString 生成的参数。...using System.Text; class C { int _value; // Violation public void Log(StringBuilder destination...) { destination.Append("Value: ").Append(_value.ToString()).AppendLine(); } // Fixed...public void Log(StringBuilder destination) { destination.Append("Value: ").Append(_value
发现Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc...} * * @since 21 */ @Override public StringBuilder repeat(int codePoint, int count...throws IllegalArgumentException {@inheritDoc} * * @since 21 */ @Override public StringBuilder...试试下面的代码: var sb = new StringBuilder().repeat("*", 10); System.out.println(sb); 最后会输出: ********** 另一个...repeat方法第一个参数是codePoint,指得应该是UniCode字符集中的codePoint,所以这个方法的repeat是针对UniCode字符的。
常用方法 StringBuilder常用的方法有2个: public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。...// append方法返回的是this,调用方法的对象builder,this==builder StringBuilder builder2 = builder.append("hello...); // 在我们开发中,会遇到调用一个方法后,返回一个对象的情况。...然后使用返回的对象继续调用方法。 ...// 这种时候,我们就可以把代码现在一起,如append方法一样,代码如下 //链式编程:方法返回值是一个对象,可以继续调用方法 builder.append("hello
StringBuilder是非线程安全的。 四、String为什么是不可变的?...所以”abc” 无法变成 “abcd” 五、StringBuilder和StringBuffer为什么是可变的呢?...StringBuffer/StringBuilder是完成字符串拼接操作的,方法名:append StringBuffer是线程安全的。StringBuilder是非线程安全的。...); StringBuffer s3 = new StringBuffer(100);//创建一个容量为100的StringBuffer对象 } } 七、方法 方法名 作用 StringBuilder...append(char c) 在字符串尾巴追加字符 int capacity() 当前StringBuffer/StringBuilder的容量 char charAt(int index) 返回指定位置的字符
对象作为参数,设置了value数组的初始容量为String对象的长度+16,并把String对象中的字符添加到value数组中 public StringBuilder(String str)...public StringBuilder append(String str) { super.append(str);//父类append方法,父类中设计到扩容的问题,后面说明 ...return this; } 接收一个CharSequence对象作为参数,设置了value数组的初始容量为CharSequence对象的长度+16,并把CharSequence对象中的字符添加到...StringBuilder append(String str) { super.append(str);//调用父类的append方法 return this;//?...(index);//调用父类的方法 return this;//返回当前对象 } public AbstractStringBuilder deleteCharAt(int
StringBuilder概述 StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器。 作用:提高字符串的操作效率。...通过append添加:并返回对象本身 StringBuilder sb = new StringBuilder(); sb.append(123); sb.append...("asf"); sb.append(true); System.out.println(sb); // 123asftrue // 因为返回的是对象本身所以上边的也可以写成...所以要先将StringBuildr类型转换成String类型才能将ab给s2,这也是为什么StringBuilder比String快的原因....String s = sb.toString(); 2.String转换为StringBuilder 通过构造方法就可以实现把String转换为StringBuilder。
执行intern()方法时,若常量池中不存在等值的字符串,JVM就会在常量池中 创建一个等值的字符串,然后返回该字符串的引用。 2. “”(引号)引起来的内容(字面量)。 ...通过调用intern()方法,会在常量池中生成一个相同字符串的对象 “”内的字符串都会添加到常量池中,相当于引用的方法区中的字符串对象。...(s1.intern() == s1); s1生成的对象在堆中,此时常量池中没有跟s1内容相同的字符串,所以在调用intern方法时,会在常量池中添加此对象的引用,所以返回为true。...() == s2); s2生成的对象在堆中,而此时常量池中已经有一个跟s2内容相同的字符串常量,当s2调用intern方法时,返回常量池中已经存在的实例(相当于堆中有两个相同内容的实例:一个是...new 出来的,一个是常量池中的)所以返回的结果为false。
大意是:原生类型会被自动初始化为 0,但是对象引用会被初始化为 null,如果你尝试调用该对象的方法,就会抛出空指针异常。通常,你可以打印一个 null 对象而不会抛出异常。...第一句相信大家都会容易理解,这是类型初始化的基础知识,但是第二句就让我很疑惑:为什么打印一个 null 对象不会抛出异常?带着这个疑问,我开始了解惑之旅。...第一个问题 直接打印 null 的 String 对象,会得到什么结果?...非 String 对象:通过调用String.valueOf方法,如果是 null 对象,就返回”null”,否则调用对象的toString方法。...编译器对字符串相加会进行优化,首先实例化一个StringBuilder,然后把相加的字符串按顺序append,最后调用toString返回一个String对象。
中有个字符串常量池,当创建一个字面量字符串时,JVM首先检查字符串常量池中是否已经存在该字符串,如果存在 则直接返回字符串对象的引用,否则就创建一个新的字符串对象并放入字符串常量池中,最终将该对象的引用赋值给变量...如果字符串常量池中没有"abc",则在字符串常量池和堆内存中各创建一个对象,返回堆地址(2个,一个是堆中new的对象,另一个是char[]对应的常量池中数据"abc");如果常量池中有"abc",则只在堆中创建对象并返回地址值给...,内存布局图如下查看源码 StringBuilder构造方法、append方法、//StringBuilder构造方法public StringBuilder() { super(16);}//追溯到父类...append使用arraycopy的复制方法,也没有产生新的对象,而StringBuilder的toString()方法通过前面数组new了一个新String@Overridepublic String...变量拼接的原理 是StringBuilder 【只要有变量参与 地址就指向堆中数据】如果拼接的结果调用 intern() 方法,则主动将常量池中 还没有的字符串对象放入池中,并返回地址。
那么为什么这样呢,明明append可以放入空指针对象呀? 深入源码查看,进入StringBuilder.java的带参构造器 /** * 构造初始化为指定字符串内容的字符串生成器。...解决方案 基于以上问题,基本解决方案就是,避免传入NULL对象,或者使用append()。...方法一: 对于使用StringBuilder构造器的对象,进行非空判断,例如: public static void main(String[] args) { String obj = null...(obj); } 由于append在添加字符串时,会先进行判空并 替代塞入"null",所以这个方法不提倡。...* 参数:str – 一个字符串。 * 返回:对此对象的引用。
“哥,你让我看的《Java 开发手册》上有这么一段内容:循环体内,拼接字符串最好使用 StringBuilder 的 append() 方法,而不是 + 号操作符。这是为什么呀?”三妹疑惑地问。...“然后看标号为 17 的这行,是一个 invokevirtual 指令,用于调用对象的方法,也就是 StringBuilder 对象的 append() 方法。”...,所谓的应用级的代码其实是一个方法——被称为引导方法(Bootstrap Method),简称 BSM,BSM 会返回一个 CallSite(调用点) 对象,这个对象就和 invokedynamic 指令链接在一起...更好的写法就是在循环的外部新建一个 StringBuilder 对象,然后使用 append() 方法将循环体内的字符串添加进来: class Demo { public static void...StringJoiner 的对象,然后通过 for-each 循环把可变参数添加了进来,最后调用 toString() 方法返回 String。
大意是:原生类型会被自动初始化为 0,但是对象引用会被初始化为 null,如果你尝试调用该对象的方法,就会抛出空指针异常。通常,你可以打印一个 null 对象而不会抛出异常。...第一句相信大家都会容易理解,这是类型初始化的基础知识,但是第二句就让我很疑惑:为什么打印一个 null 对象不会抛出异常?带着这个疑问,我开始了解惑之旅。...非 String 对象:通过调用String.valueOf方法,如果是 null 对象,就返回"null",否则调用对象的toString方法。...编译器对字符串相加会进行优化,首先实例化一个StringBuilder,然后把相加的字符串按顺序append,最后调用toString返回一个String对象。...String s = "a" + "b"; //等价于 StringBuilder sb = new StringBuilder(); sb.append("a"); sb.append("b"); String
()等返回字符串的方法也都是在最后返回了一个新对象。...String对象,然后再在堆中创建一个一模一样的对象,然后返回堆中对象的地址。...,实际上这仍然还是依赖于StringBuilder的append()方法。...(String.valueOf(s))).append("a").toString(); } 我们可以看见每一次循环都会生成一个新的StringBuilder对象,这样无疑是很低效的,也是为什么网上很多文章会说循环中拼接字符串不要使用...这也就不难理解为什么一般情况下StringBuffer效率不如StringBuilder了,因为StringBuffer的所有方法都加了锁。
如果找到,则返回池中字符串对象的引用。否则,它将在字符串池中创建字符串对象并返回引用。JVM通过在不同线程中使用相同的字符串来节省大量内存。 如果使用新运算符创建字符串,则会在堆内存中创建该字符串。...它们为字符串操作提供了append()、insert()、delete()和substring()方法。...这就是为什么这些方法从未在StringBuilder类中实现。...StringBuilder vs StringBuffer Performance 我试图检查对性能的影响,因为与一个示例程序同步,该程序多次对StringBuffer和StringBuilder对象执行...StringBuffer是线程安全和同步的,而StringBuilder不是。这就是为什么StringBuilder比StringBuffer快。
) 方法返回地址(Return Address)(或方法正常退出或者异常退出的定义) 一些附加信息 # 局部变量表 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型...比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。 ? 为什么需要运行时常量池?...因为在不同的方法,都可能调用常量或者方法,所以只需要存储一份即可,节省了空间 常量池的作用:就是为了提供一些符号和常量,便于指令的识别 # 方法返回地址 存放调用该方法的PC寄存器的值,如果有返回值,则将返回值压入调用者栈帧的操作数栈...s1 = new StringBuilder(); s1.append("a"); s1.append("b"); } // 这个也是线程不安全的,因为有返回值...为什么要把Java堆分代?不分代就不能正常工作了吗?
StringBuilder与StringBuffer StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢...其实前面我们已经说到了,这我我们再解释一下 因为String本身不可变,我们对String的任何操作都会返回一个新的对象,然后当前String变量指向新的对象,而原来的String对象就会被GC回收,那么在循环中就会大量快速的创建新的对象...但是我们从输出结果看到另外一个问题,那就是StringBuffer与StringBuilder的允许时间基本一致,那为什么需要定义两个功能相似的类呢?...append()方法基本原理 源码剖析 这里我们以StringBuilder为例, 1....StringBuilder的append()方法 每次调用append(str)方法时,会首先判断数组长度是否足以添加传递来的字符串 /** * Appends the specified string
大意是:原生类型会被自动初始化为 0,但是对象引用会被初始化为 null,如果你尝试调用该对象的方法,就会抛出空指针异常。通常,你可以打印一个 null 对象而不会抛出异常。...第一句相信大家都会容易理解,这是类型初始化的基础知识,但是第二句就让我很疑惑:为什么打印一个 null 对象不会抛出异常?带着这个疑问,我开始了解惑之旅。...非 String 对象:通过调用String.valueOf方法,如果是 null 对象,就返回"null",否则调用对象的toString方法。...编译器对字符串相加会进行优化,首先实例化一个StringBuilder,然后把相加的字符串按顺序append,最后调用toString返回一个String对象。...String s = "a" + "b";//等价于StringBuilder sb = new StringBuilder();sb.append("a");sb.append("b");String
()); } } 我们能看到这段代码创建了10个线程,每个线程循环1000次往StringBuilder对象里面append字符。...()方法: @Override public StringBuilder append(String str) { super.append(str); return this; } StringBuilder...我们看回AbstractStringBuilder的append()方法源码的第五行,ensureCapacityInternal()方法是检查StringBuilder对象的原char数组的容量能不能盛下新的字符串...()方法源码的第六行,是将String对象里面char数组里面的内容拷贝到StringBuilder对象的char数组里面,代码如下: str.getChars(0, len, value, count...至此,StringBuilder为什么不安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? ? 当然是输出10000啦!
我们可以看到,s3 执行 + 操作会创建一个 StringBuilder 对象然后执行初始化。执行 + 号相当于是执行 new StringBuilder.append() 操作。...String 对象底层是使用了 StringBuilder 对象的 append 方法进行字符串拼接的,不由得对 StringBuilder 心生敬意。 ?...这样由于大量 StringBuilder 创建在堆内存中,肯定会造成效率的损失,所以在这种情况下建议在循环体外创建一个 StringBuilder 对象调用 append()方法手动拼接。...为什么会这样呢?我们先来看一下 intern 方法的官方解释 ? 这里你需要知道 JVM 的内存模型 ?...如果字符串常量池中已经包含一个等于此 String 对象的字符串,则返回常量池中这个字符串的 String 对象;否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用
()); } } 我们能看到这段代码创建了10个线程,每个线程循环1000次往StringBuilder对象里面append字符。...()方法: @Override public StringBuilder append(String str) { super.append(str); return this; } StringBuilder...我们看回AbstractStringBuilder的append()方法源码的第五行,ensureCapacityInternal()方法是检查StringBuilder对象的原char数组的容量能不能盛下新的字符串...()方法源码的第六行,是将String对象里面char数组里面的内容拷贝到StringBuilder对象的char数组里面,代码如下: str.getChars(0, len, value, count...至此,StringBuilder为什么不安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? 当然是输出10000啦!
领取专属 10元无门槛券
手把手带您无忧上云