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

为什么 StringBuilder 不是线程安全的?

我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。...分析 在分析这个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟String类一样,都是通过一个char数组存储字符串的,不同的是String类里面的char数组是final...都继承了AbstractStringBuilder) //存储字符串的具体内容 char[] value; //已经使用的字符数组的数量 int count; 再看StringBuilder的append...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。

59620

为什么 StringBuilder 不是线程安全的?

我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。...分析 在分析这个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟String类一样,都是通过一个char数组存储字符串的,不同的是String类里面的char数组是final...都继承了AbstractStringBuilder) //存储字符串的具体内容 char[] value; //已经使用的字符数组的数量 int count; 再看StringBuilder的append...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。

58020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么 StringBuilder 不是线程安全的?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿?我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。...分析 在分析设个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟String类一样,都是通过一个char数组存储字符串的,不同的是String类里面的char数组是final...都继承了AbstractStringBuilder) //存储字符串的具体内容 char[] value; //已经使用的字符数组的数量 int count; 再看StringBuilder的append...StringBuilder的append()方法调用的父类AbstractStringBuilder的append()方法 1.public AbstractStringBuilder append(String

    53030

    为什么 StringBuilder 不是线程安全的?

    引言 你是不是遇到过这种问题: ❝ 面试官:StringBuilder 和 StringBuffer 的区别在哪?...我:StringBuilder 不是线程安全的,StringBuffer 是线程安全的 面试官:那 StringBuilder 不安全的点在哪儿? 我:。。。...(哑巴了) ❞ 在这之前我只记住了 StringBuilder 不是线程安全的,StringBuffer 是线程安全的这个结论,至于 StringBuilder 为什么不安全从来没有去想过。...分析 在分析设个问题之前我们要知道 StringBuilder 和 StringBuffer 的内部实现跟 String 类一样,都是通过一个 char 数组存储字符串的,不同的是 String 类里面的...StringBuffer 都继承了 AbstractStringBuilder) //存储字符串的具体内容 char[] value; //已经使用的字符数组的数量 int count; 再看 StringBuilder

    37220

    Java中的String类能否被继承?为什么?

    不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。...{ // 省略...  } final修饰符的用法: 1.修饰类   当用final修饰一个类时,表明这个类不能被继承。...final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。 ? 2.修饰方法   使用final修饰方法的原因有两个。...第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。...注:一个类中的private方法会隐式地被指定为final方法。

    2K60

    Hibernate的实体类中为什么要继承Serializable?

    java中常见的几个类(如:Interger、String等),都实现了java.io.Serializable接口。 实现 java.io.Serializable 接口的类是可序列化的。...没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。...为了对象的序列化而需要继承的接口也只是一个象征性的接口而已,也就是说继承这个接口说明这个对象可以 被序列化了,没有其他的目的。...之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取 出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。...Hibernate并不要求持久化类必须实现java.io.Serializable接口,但是对于采用分布式结构的Java应用,当Java对象在不同的进程节点之间传输时,这个对象所属的类必须实现Serializable

    1.2K30

    从Java继承类的重名static函数浅谈解析调用与分派

    ,当我们用父类的实例引用(实际上该实例是一个子类)调用static函数时,调用的是父类的static函数。...原因在于方法被加载的顺序。 当一个方法被调用时,JVM首先检查其是不是类方法。如果是,则直接从调用该方法引用变量所属类中找到该方法并执行,而不再确定它是否被重写(覆盖)。...如果不是,才会去进行其它操作(例如动态方法查询) 可能有的人一拍大腿,这不就是java的静态/动态分派么! 有点像,但还真不是,静态分派与动态分派是用来确定重载和重写逻辑的。...在重载过程中,编译器根据方法参数的静态类型(比如tc1的静态类型是class1,tc2的是class2,但本文这里不是重载!)来确定使用方法的版本,这叫做静态分派。...动态分派是用于方法重写的,比如我调用一个类A的方法f,如果该类有子类a,那么我以a来调用f的时候,调用的实际是a.f而非A.f。 看起来还真的像动态分派是不是?但是结果不符合啊!

    1.2K30

    在 VS IDE 的属性窗口中为什么不是显示类的所有属性?

    在我使用 X# 来编写代码时,有这样一个经历,当我试图为某个类的某个属性赋值时(当然,我是通过搜索来获得需要如此操作),在对应的类实例所对应的属性窗口中,我想为之赋值的属性并没有显示出来。...由此,我学到了如何在 X#/C# 中为自定义类实现类似的效果。...在VFP中,如果想实现这样的设计目的,通常情况下,是模仿想象的设计效果,使用仅在设计时执行的代码在设计时予以达成,或者,在属性说明里予以说明,并在使用时,自觉的遵循属性说明使用。...但是在X#中,已经可以和C#一样,优雅的予以解决。...虽然其中的 VFP 方言的类定义语法还不能实现这样的目的,但是,X# 的所谓“新”语法实现它应该不是问题,也许在下一个版本(Ver:3.0)的 X# 中,使用 VFP 方言的实现就会准备就绪 Follow

    7110

    穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

    一:为什么要继承 ①代码重用:继承允许我们重用、扩展或修改父类的属性和方法,而无需重新编写相同的代码。这有助于减少代码冗余,提高代码的可维护性和可扩展性。...二:什么是继承以及继承的方式 继承是面向对象编程(OOP)中的一个核心概念,它提供了一种机制,允许我们基于已有的类来创建新的类,新创建的类被称为子类(或派生类),而原有的类被称为父类(或基类、超类)。...从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态。 继承又分单继承、多层继承、不同类继承同一个类。...关键字 // super是获取到子类对象中从基类继承下来的部分 super.a = 200; super.b = 201; // 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法...2.继承不是万能的,过度使用继承会导致代码结构复杂、难以维护。在设计类时,应优先考虑组合(composition)而不是继承(inheritance)。

    8610

    Java的日期类的时间从为什么是从1970年1月1日开始?

    ----------------------------------------------------------------------------- 但这依然没很好的解释"为什么",出于好奇,继续...另外1年365天的总秒数是31536000秒, 2147483647/31536000 = 68.1年 也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间...位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),而java自然也遵循了这一约束。...至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了...8点而非0点,原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区设置为东8区,故打印的结果是8点。

    4.7K20

    为什么从复杂的机器学习模型开始并不是一个好主意

    有时,简单的模型可以取得良好的成绩。 在这篇文章中,我将指导您以初学者的经验来应对我的第一个数据科学挑战,以及它如何帮助我成长为一名学生。我永远不会忘记简单的线性回归模型的强大功能!...挑战 Condenation是一个有时会组织挑战的网站,作为在不同领域加速发展的第一步,其中之一是关于数据科学。数据科学领域的最后一项挑战是如何预测ENEM(进入公立大学的巴西考试)学生的数学成绩。...正如您在下面阅读的,我将展示一种应对挑战的新方法,以及如何甚至不使用简单模型就将其判断为弱模型。这是一个很大的错误,也是一个很好的学习经验。...但是,也许您会感到奇怪:“您只是使用了数据库的一部分吗?为了全面理解,需要使用交叉验证!”。好吧好吧..你是对的!正如您在下面看到的,我也是这样做的。...重要的是要注意,即使使用随机森林和神经网络模型,我也可以进行更好的预处理或选择其他功能并获得良好的成绩。是的,它是正确的!但是这种经历对我很重要,因为我可以学习并成为一名更好的数据科学家。

    54120

    干掉 “重复代码”,这三种方式绝了!

    在我看来,可维护性是大型项目成熟度的一个重要指标,而提升可维护性非常重要的一个手段就是减少代码重复。那为什么这样说呢?...我们就只能不断增加更多的购物车类,一遍一遍地写重复的购物车逻辑、写更多的 if 逻辑吗? 当然不是,相同的代码应该只在一处出现!...、新的用户逻辑,是不是完全不用对代码做任何修改,只要新增一个 XXXUserCart 类继承 AbstractCart,实现特殊的优惠和运费处理逻辑就可以了?...接下来,我们再看看反射如何配合注解实现动态的接口参数组装: 第 3 行代码中,我们从类上获得了 BankAPI 注解,然后拿到其 URL 属性,后续进行远程调用。...反射给予了我们在不知晓类结构的时候,按照固定的逻辑处理类的成员;而注解给了我们为这些成员补充元数据的能力,使得我们利用反射实现通用逻辑的时候,可以从外部获得更多我们关心的数据。 3.

    1.1K20

    代码写的烂,我被开除了!

    在我看来,可维护性是大型项目成熟度的一个重要指标,而提升可维护性非常重要的一个手段就是减少代码重复。那为什么这样说呢?...我们就只能不断增加更多的购物车类,一遍一遍地写重复的购物车逻辑、写更多的 if 逻辑吗? 在线刷题神器 当然不是,相同的代码应该只在一处出现!...、新的用户逻辑,是不是完全不用对代码做任何修改,只要新增一个 XXXUserCart 类继承 AbstractCart,实现特殊的优惠和运费处理逻辑就可以了?...接下来,我们再看看反射如何配合注解实现动态的接口参数组装: 第 3 行代码中,我们从类上获得了 BankAPI 注解,然后拿到其 URL 属性,后续进行远程调用。...反射给予了我们在不知晓类结构的时候,按照固定的逻辑处理类的成员;而注解给了我们为这些成员补充元数据的能力,使得我们利用反射实现通用逻辑的时候,可以从外部获得更多我们关心的数据。 3.

    19910

    3 个绝招 轻松解决 代码重复

    在我看来,可维护性是大型项目成熟度的一个重要指标,而提升可维护性非常重要的一个手段就是减少代码重复。那为什么这样说呢?...我们就只能不断增加更多的购物车类,一遍一遍地写重复的购物车逻辑、写更多的 if 逻辑吗? 当然不是,相同的代码应该只在一处出现!...、新的用户逻辑,是不是完全不用对代码做任何修改,只要新增一个 XXXUserCart 类继承 AbstractCart,实现特殊的优惠和运费处理逻辑就可以了?...接下来,我们再看看反射如何配合注解实现动态的接口参数组装: 第 3 行代码中,我们从类上获得了 BankAPI 注解,然后拿到其 URL 属性,后续进行远程调用。...反射给予了我们在不知晓类结构的时候,按照固定的逻辑处理类的成员;而注解给了我们为这些成员补充元数据的能力,使得我们利用反射实现通用逻辑的时候,可以从外部获得更多我们关心的数据。 3.

    31810

    面渣逆袭:Java基础五十三问,快来看看有没有你不会的!

    继承 继承是使⽤已存在的类的定义作为基础创建新的类,新类的定义可以增加新的属性或新的方法,也可以继承父类的属性和方法。通过继承可以很方便地进行代码复用。...常用类 String 31.String 是 Java 基本数据类型吗?可以被继承吗? String是Java基本数据类型吗? 不是。...String是一个比较特殊的引用数据类型。 String 类可以继承吗? 不行。String 类使用 final 修饰,是所谓的不可变类,无法被继承。...当然,循环里拼接还是建议用StringBuilder,为什么,因为循环一次就会创建一个新的StringBuilder对象,大家可以自行实验。 35.intern方法有什么作用?...I0流的40多个类都是从如下4个抽象类基类中派生出来的。

    76431

    一文读懂字符串String

    final关键字的作⽤有如下⼏种: final修饰类时,表明这个类不能被继承 final修饰⽅法,表明⽅法不能被重写 final修饰变量,如果是基本数据类型的变量,则其数值⼀旦在初始化之后便不能改变;如果是对象...所以我们说String类是不可变的。⽽很多⽅法,如substring并不是在原来的String类上进⾏操作,⽽是⽣成了新的String类。...为什么String要设计成不可变 在知道了"String是不可变"的之后,大家是不是一定都很疑惑:为什么要把String设计成不可变的呢?有什么好处呢?...,我们知道StringBuffer和StringBuilder都继承⾃AbstractStringBuilder类。...String、 StringBuffer 、StringBuilder的区别 1.都是final类,不允许被继承 2.

    53220

    【Java】Best coding practices every java developer should

    Interface Segregation Principle 接口隔离:实现接口替代类继承。 Dependency Inversion Principle 依赖倒转原则:依赖抽象而不是依赖实现。...尽可能使用增强for循环或者foreach 建议使用增强for循环(JDK5)和JDK8的foreach,当然最好的建议是活学活用stream的API。为什么会有这样的建议?...避免创建不必要对象 对象创建是最消耗内存的操作之一,这就是为什么最好的 Java 实践是避免创建任何不必要的对象,并且只应在需要时创建它们。 9....这是因为接口的目的是用于继承和多态性,而不是用于类似的静态东西。所以最佳实践建议我们使用枚举来代替。...最好的做法是按其作用域从最严格到最不严格来组织一个类的成员变量。

    37130

    你真的了解Java中的String吗(也太菜了)?

    带着这个疑问我们看一下源码 源码阅读 我们先看一下String类 //从类上看,他使用了final关键字,说明这个类是不可以改变的,且继承了Serializable,他是可以被序列化的 public final...String b = new StringBuilder().append("a").append(bb).toString(); 是不是很惊喜,好的那我们来解释一下为什么呢?...而我们直接使用StringBuilder进行apend的话是在原有的基础上进行添加的。所以说是这个原因。 那说到这里了,那它为什么不使用StringBuffer而使用StringBuilder呢?...// 看到这个类也是不能被继承的且继承了AbstractStringBuilder的抽象类 public final class StringBuffer extends AbstractStringBuilder...那么也就是说为什么StringBuilder了呢?从性能的角度来看StringBUilder虽然不是线程3安全的,但是他的性能是优秀的。

    35820
    领券