String知识点
String:字符串,为final类不可继承,在jdk1.8及之前为char[],1.9之后改成byte[],不可变的字符序列,通过字面量的方式(String str = “111”)给一个字符串赋值,此时的字符串值申明在字符串常量池中,字符串常量池中不存在相同的字符串
String 的内存分配
在java 中的八个基本数据类型,六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型
类型 | 默认值 | 最小值 | 最大值 | 备注 |
---|---|---|---|---|
byte | 0 | -128(-2^7) | 127(2^7-1) | byte 数据类型是8位、有符号的,以二进制补码表示的整数,byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一 |
short | 0 | -32768(-2^15) | 32767(2^15 - 1) | short 数据类型是 16 位、有符号的以二进制补码表示的整数,Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一 |
int | 0 | -2,147,483,648(-2^31) | 2,147,483,647(2^31 - 1) | int 数据类型是32位、有符号的以二进制补码表示的整数,一般地整型变量默认为 int 类型; |
long | 0L | -9,223,372,036,854,775,808(-2^63) | 9,223,372,036,854,775,807(2^63 -1) | long 数据类型是 64 位有符号的以二进制补码表示的整数**,这种类型主要使用在需要比较大整数的系统上,"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。 |
float | 0.0f | float 数据类型是单精度、32位、符合IEEE 754标准的浮点数,float 在储存大型浮点数组的时候可节省内存空间,浮点数不能用来表示精确的值,如货币 | ||
double | 0.0d | double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数,浮点数的默认类型为double类型,double类型同样不能表示精确的值,如货币 | ||
boolean | false | boolean数据类型表示一位的信息,只有两个取值:true 和 false,这种类型只作为一种标志来记录 true/false 情况; | ||
char | \u0000(即为 0) | \uffff(即为65、535) | char类型是一个单一的 16 位 Unicode 字符,char 数据类型可以储存任何字符 |
八种基本数据类型与String提供了常量池的概念(静态常量池)(即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间,JAVA系统级别得缓存,由系统协调),jdk6之前字符串常量池放在永久代,jdk7及以后存放在java堆中
常量池,运行时常量池,字符串常量池几个概念说明:常量池,运行时常量池,字符串常量池区别
字符串的拼接操作
- 常量与常量的拼接结果在常量池中,原理是编译期优化
- 常量池中不会存在相同的内容的常量
- 只要其中有一个变量,结果就在堆中,拼接的原理是stringBuilder
- 如果使用了intern()方法,则主动将变量池中的还没有的字符串对象放入池中,并返回对象地址
String 的intern()使用
- jdk1.6如果串池中有,并不会放入串池中,返回已有的串池中的对象的地址,如果没有,会把此对象复制一份放入串池中,并返回串池中的对象地址
- jdk1.7开始如果串池中有,并不会放入串池中,返回已有的串池中的对象的地址,如果没有,会把此对象的引用地址复制一份放入串池中,并返回串池中的引用地址