JAVA 没有重载运算符,那么 String 类型的加法是怎么实现的,以及String类型不可变的原因和好处...
1, JAVA 不具备 C++ 和 C# 一样的重载运算符 来实现类与类之间相互计算 的功能
这其实一定程度上让编程失去了代码的灵活性, 但是个人认为,这在一定程度上减少了代码异常的概率
如果可以重载运算符,当你没看见一个运算的时候,你都会怀疑这是不是调用了某个方法(个人意见)
2,String 类型加法的实现方式,其实是一个语法糖,正确的执行方式为 括号内的内容
String a = 'a';
String b = 'b';
String c = a + b; ( String c = (new StringBuilder(String.valueOf(a))).append(b).toString(); )
3,由于 String 类型的不可变性,每一次字符串的拼接都会实例化一个 StringBuilder 类,相当消耗性能
推荐字符串拼接在单线程的时候,使用 StringBuilder 多线程使用 Stringbuffer 来提高字符串拼接的性能
4,String 类型不可变的原因
4.1,设计上的考虑:JAVA 常量池的需要
4.2,性能上的考虑: java中String对象的哈希码被频繁的使用,比如在HashMap的容器中,字符串不变性保证了hash码的唯一性,
因此可以放心的进行缓存,这也是一种性能优化手段,意味着不必每次都取计算新的哈希码
4.3,安全性的考虑:String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,
还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。
5、String类不可变的好处
5.1,只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字 符串。
但如果字符串是可变的,那么String interning 将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),
因为这样的话,如果变量改变了它的值,那么,其它指向这个值的变量 的值也会一起改变。
5.2,如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连 接,或者在socket编程中,
主机名和端口都是以字,符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符 串指向的对象的值,造成安全漏洞。
5.3,因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
5.4,类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,
那么会对你的数据库造成,不可知的破坏。
5.5,因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。
这就是 HashMap 中的键往往都使用字符串。
JAVA 没有重载运算符,那么 String 类型的加法是怎么实现的,以及String类型不可变的原因和好处...相关推荐
- java怎么重载运算符_运算符在Java中重载
不,Java不支持用户定义的运算符重载. 接近"自定义"运算符重载的Java的唯一方面就是处理string的+,这或者导致了常量的编译时间连接,或者使用StringBuilder ...
- 【Java基础系列教程】第三章 Java变量与运算符
一.Java程序基本结构 1.1 基本结构 Java程序基本结构示例代码: /** * 这里是文档注释 * 这是一个HelloWorld程序 */ public class HelloWorld {p ...
- 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; ...
- java重载运算符_流形:Java的运算符重载
java重载运算符 .tg {border-collapse:collapse;border-spacing:0;} .tg td{font-family:Arial, sans-serif;font ...
- java 两个运算符重载_Java中的操作符重载
0.Java操作符重载 Java中我们可以执行如下语句: String fullName = "hongliang "+"cao"; System.out.pr ...
- 为什么 Java 不支持运算符重载?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Yujiaao 来源 | https://se ...
- java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型
java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型 参考文章: (1)java ...
- java运算符重载_为什么Java不支持运算符重载?
Java不支持运算符重载 = 小白也能学编程 Java之所以不支持运算符重载,并不是如下原因: 会使JVM变得复杂.性能下降:君不见C++内置运算符重载的能力?C++的性能在任何时代秒杀Java相信没 ...
- Java学习(4)—— 布尔类型、基本数据类型转换、基本数据类型和String类型的转换
布尔类型 也叫Boolean类型,boolean只允许取true和false. boolean占一个字节. 适用于逻辑运算,流程控制语句. 有默认类型,是false.但是应该声明为成员变量或是静态变量 ...
最新文章
- Python 判断类型
- Windows和Linux组成双系统的最简单办法
- 创建线程池的四种方式_创建线程到底有几种方式?
- HaoZip(好压) 去广告纯净版 4.4
- PHP易混淆函数的区分
- 从系列去雨论文看如何创新
- 教你如何区分描述统计学与推断统计学
- c语言小项目-使用mysql数据库的图书管理系统
- python时间复杂度和空间复杂度是指_时间复杂度和空间复杂度
- 面试题解(4):求排列、组合
- Linux分区空间不足了怎么办??
- php中文字怎么上下居中,CSS怎么设置垂直居中?
- android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
- 《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
- 苹果自助维修服务上线:维修工具租赁价约为321元
- 计算机毕业设计 SSM车辆挂牌管理系统 电动车实名挂牌管理系统 车辆挂牌办理系统Java Vue MySQL数据库 远程调试 代码讲解
- 黑客们的往事(连载十) 凯文·米特尼克
- 给小白的论文写作方法!实用率99%!
- 56 道高频 JavaScript 与 ES6+ 的面试题及答案
- im即时通讯开发之后台应用保活、消息推送的噩梦