Java基本数据类型
基本数据类型
8种基本数据类型?
整型:byte、short、int、long
浮点型:float、double
布尔型:boolean
字符型:char
整型中 byte、short、int、long 的取值范围?
- byte:8位,最大存储量255,存放的数值范围-128~127之间
- short:16位,最大数据存储65536,存放的数据范围-32768~32767之间
- int:32位,最多数据存储2的32次方减1, 范围负的2的31次方~正的2的31次方减1
- long:64位,最多数据存储2的64次方减1,范围负的2的63次方~正的2的63次方减1
什么是浮点型?
- 简单讲,浮点型就是表示带有小数的数据,相对于定点数而言,浮点数利用指数使小数点的位子可以根据需要上下浮动,从而可以灵活得表达更大范围的实数。
什么是单精度和双精度?
- 单精度浮点数在机内占4个字节、有效数字8位、表示范围:-3.40E+38 ~ +3.40E+38
- 双精度浮点数在机内占8个字节、有效数字16位、表示范围:-1.79E+308 ~ +1.79E+308
- Java中,所有的浮点型字面值,默认当做double类型来处理,如果要想当做float类型来处理,则强制转换或者在字面后面加f
为什么不能用浮点型表示金额?
- double的精度太低,不适合,一般采用bigdicimal这个引用类型
自动拆装箱
什么是包装类型
- 对基本数据类型对应的类型,这些类的对象可以和基本数据类型的变量直接互相赋值,并且这些类比对基本数据类型而言具有更多的功能。
什么是基本类型 - 又称为内置类型,是Java中不同于类的特殊类型。
什么是自动拆装箱 - 自动装箱:将基本数据类型自动转换为对应的包装类
- 自动拆箱:将包装类自动转换为对应的基本数据类型
Integer i=10;//自动装箱
int b=i; //自动拆箱
Integer 的缓存机制
- int装箱用到的一个方法是valueOf()方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
- 传入的i,先和IntegerCache比较,如果其返回不存在,再new一个Integer对象
String
字符串的不可变性
- 当给一个字符串重新赋值后,老值并没有在内存中销毁,而是重新开辟一块空间存储新值。
- 如果在开发中对含有大量字符的字符串进行遍历赋值修改是,会对内存中产生很多无法释放的字符串对象,造成内存垃圾
- 堆内存中字符串对象可以用于(指向)多个字符串变量
JDK 6 和 JDK 7 中 substring 的原理及区别?
- JDK6中,String是通过字符数组实现的,Sring类包含三个成员变量:char value[],int offset ,int count。他们分别用来存储真正的字符数组,数组的第一个位置索引以及字符串中包含的字符个数。
- 调用substring的时候,会创建一个新的string对象,当时这个string的值仍然指向堆中的同一个字符数组
- 如果字符串很长,当时如果只要切割很短的一段。这可能会导致性能问题,因为只需要的是一小段字符序列,却引用了整个字符串,这长字符串一直被引用,可能导致内存泄漏。一般采用加一个空字符解决。x=x.substring(x,y)+""
//JDK 6
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
public String substring(int beginIndex, int endIndex) {
//check boundary
return new String(offset + beginIndex, endIndex - beginIndex, value);
}
- 上述问题,在JDK7中得到解决,其会在堆内存中创建一个新的数组。
//JDK 7
public String(char value[], int offset, int count) {
//check boundary
this.value = Arrays.copyOfRange(value, offset, offset + count);
}
public String substring(int beginIndex, int endIndex) {
//check boundary
int subLen = endIndex - beginIndex;
return new String(value, beginIndex, subLen);
}
replaceFirst、replaceAll、replace 区别?
- replace:参数为target和replacement,也就是替换的目标对象和新对象
- replaceAll:参数为regex和replacement,第一个参数表示正则表达式
- replaceFirst:参数和replaceAll一样,他执行匹配的第一个结果
String 对“+”的重载?
- String对“+”的支持其实是使用了StringBuilder以及他的append、toString两个方法。
字符串拼接的几种方式和区别?
- 加号“+”:可以用字符串和任意类型加号拼接。时间空间成本高
- String contact()方法:调用和传入都必须是字符串,而且调用方法不能为null。时间空间成本高
- StringUtils join()方法:适用于将ArrayList转换为字符串。
- StringBuffer append()方法:线程安全
- StringBuilder append()方法:线程不安全
String.valueOf 和 Integer.toString 的区别?
- 不同于Integer.toString(int),valueof有大量的重载方法
public static String valueOf(int i) {
return Integer.toString(i);
}
- String的valueof方法是将各种类型转换成String,内部重载了不同类型转String的处理,所以推荐使用valueof方法。
switch 对 String 的支持?
- jdk7中,switch的参数可以是string类型。目前已经支持 byte short int char string
- 利用String的hash值,本质上是switch-int结构。并且利用到了equals方法来防止hash冲突的问题。最后利用switch-byte结构,精确匹配
字符串池、常量池(运行时常量池、Class 常量池)、intern