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类型不可变的原因和好处...相关推荐

  1. java怎么重载运算符_运算符在Java中重载

    不,Java不支持用户定义的运算符重载. 接近"自定义"运算符重载的Java的唯一方面就是处理string的+,这或者导致了常量的编译时间连接,或者使用StringBuilder ...

  2. 【Java基础系列教程】第三章 Java变量与运算符

    一.Java程序基本结构 1.1 基本结构 Java程序基本结构示例代码: /** * 这里是文档注释 * 这是一个HelloWorld程序 */ public class HelloWorld {p ...

  3. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

    建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; ...

  4. java重载运算符_流形:Java的运算符重载

    java重载运算符 .tg {border-collapse:collapse;border-spacing:0;} .tg td{font-family:Arial, sans-serif;font ...

  5. java 两个运算符重载_Java中的操作符重载

    0.Java操作符重载 Java中我们可以执行如下语句: String fullName = "hongliang "+"cao"; System.out.pr ...

  6. 为什么 Java 不支持运算符重载?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Yujiaao 来源 | https://se ...

  7. java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型

    java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型 参考文章: (1)java ...

  8. java运算符重载_为什么Java不支持运算符重载?

    Java不支持运算符重载 = 小白也能学编程 Java之所以不支持运算符重载,并不是如下原因: 会使JVM变得复杂.性能下降:君不见C++内置运算符重载的能力?C++的性能在任何时代秒杀Java相信没 ...

  9. Java学习(4)—— 布尔类型、基本数据类型转换、基本数据类型和String类型的转换

    布尔类型 也叫Boolean类型,boolean只允许取true和false. boolean占一个字节. 适用于逻辑运算,流程控制语句. 有默认类型,是false.但是应该声明为成员变量或是静态变量 ...

最新文章

  1. Python 判断类型
  2. Windows和Linux组成双系统的最简单办法
  3. 创建线程池的四种方式_创建线程到底有几种方式?
  4. HaoZip(好压) 去广告纯净版 4.4
  5. PHP易混淆函数的区分
  6. 从系列去雨论文看如何创新
  7. 教你如何区分描述统计学与推断统计学
  8. c语言小项目-使用mysql数据库的图书管理系统
  9. python时间复杂度和空间复杂度是指_时间复杂度和空间复杂度
  10. 面试题解(4):求排列、组合
  11. Linux分区空间不足了怎么办??
  12. php中文字怎么上下居中,CSS怎么设置垂直居中?
  13. android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
  14. 《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
  15. 苹果自助维修服务上线:维修工具租赁价约为321元
  16. 计算机毕业设计 SSM车辆挂牌管理系统 电动车实名挂牌管理系统 车辆挂牌办理系统Java Vue MySQL数据库 远程调试 代码讲解
  17. 黑客们的往事(连载十) 凯文·米特尼克
  18. 给小白的论文写作方法!实用率99%!
  19. 56 道高频 JavaScript 与 ES6+ 的面试题及答案
  20. im即时通讯开发之后台应用保活、消息推送的噩梦

热门文章

  1. UINavigationController 基本用法
  2. php中GD库的简单使用
  3. SQL SERVER事务处理
  4. LVS负载均衡DR模式部署
  5. Myeclipse7.X和8.X汉化
  6. 创建完美SDK的10个技巧
  7. Qt之进程间通信(共享内存)
  8. ORA-07445 ERROR on auto execute of job 8913
  9. flash player 10 音频新API使用:调节音高(pitch)
  10. 解决base64通过http传输后+变空格的问题