final
用final修饰数组,数组不可以改变,用final修饰class,类不可以继承。
存储
char byte
char数据类型是16位无符号Java基元数据类型.
byte字节数据类型是8位有符号Java原语整数数据类型
jdk 不同版本存储数组改变
jdk8 以前
jdk9 byte
jdk17 byte
Latin1
ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
jdk9 新增
coder
coder变量代表编码的格式,目前String支持两种编码格式Latin-1和UTF-16。Latin-1需要用一个字节来存储,而UTF-16需要使用2个字节或者4个字节来存储。
据说这一改进方案是JDK的开发人员用大数据和人工能智能,调研了成千上万的应用程序的heapdump信息后,得出:大部分的String都是以Latin-1字符编码来表示的,只需要一个字节存储就够了,两个字节完全是浪费。
COMPACT_STRINGS
COMPACT_STRINGS属性则是用来控制是否开启String的compact功能。默认情况下是开启的。可以使用-XX:-CompactStrings参数来对此功能进行关闭。
字符串拼接
相同点1:concat方法 和直接用“+”连接符拼接都可以对两个字符串进行拼接。
相同点2:两种拼接方法都会重新形成一个新的字符串,这是因为字符串的内容永远不可变,所以拼接一定会形成一个新的字符串。
不同点:concat只能连接两个字符串;但是"+“连接符可以将字符串与非字符串类型拼接到一起(注意:只要两个当中有一个是字符串类型,用”+"连接符就会拼接成一个新的字符串)。
除此之外,当我们生成一个class文件,再进行反编译的时候,通过concat源码可以发现,用连接符进行连接,StringBuilder创建了更多的对象,而concat却没有,它使用的String类的内部实现。
参考链接:
https://blog.csdn.net/wtt15100/article/details/108014448
https://blog.csdn.net/sufu1065/article/details/114650633#:~:text=String%E7%B1%BB%E5%8F%AF%E4%BB%A5%E8%AF%B4%E6%98%AFJava%E7%BC%96%E7%A8%8B%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%9C%80%E5%A4%9A%E7%9A%84%E7%B1%BB%E4%BA%86%EF%BC%8C%E5%A6%82%E6%9E%9C%E8%83%BD%E5%AF%B9String%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%80%A7%E8%83%BD%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%EF%BC%8C%E9%82%A3%E4%B9%88%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%80%A7%E8%83%BD%E5%BF%85%E7%84%B6%E8%83%BD%E5%A4%A7%E5%B9%85%E6%8F%90%E5%8D%87%E3%80%82,%E8%BF%99%E4%B8%8DJDK9%E5%B0%B1%E5%AF%B9String%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%9B%E8%A1%8C%E4%BA%86%E6%94%B9%E8%BF%9B%E5%8D%87%E7%BA%A7%EF%BC%8C%E5%9C%A8%E6%9F%90%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8B%E5%8F%AF%E4%BB%A5%E8%AE%A9String%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%86%85%E5%AD%98%E5%87%8F%E5%B0%91%E4%B8%80%E5%8D%8A%EF%BC%8C%E8%BF%9B%E8%80%8C%E5%87%8F%E5%B0%91JVM%E7%9A%84GC%E6%AC%A1%E6%95%B0%E3%80%82