一、基本数据类型
共有8种基本类型:整型(byte、shot、int、long)浮点型(float、double)字符型(char)布尔型(boolean)
整型之中byte的数据范围为(-128~127) short(-32768~32767)int(-2^31
~2^31-1)
什么是浮点型?单精度和双精度?为什么不能用浮点型表示金额?
浮点型保存的是十进制小数的近似值,所以不准确不能保存金额,单精度是float
float是1位符号位,8位阶码,其余23位计数,
double是1位符号位,11位阶码,52位计数。
二、自动拆装箱
什么是包装类型?什么是基本类型?什么是自动拆装箱
包装类型出现的原因主要是集合类无法存储基本类型,为了让基本类型有对象的特征,所以有了包装类型,基本类型就是最简单的数据类型,自动拆箱就是将包装类拆解成基本数据类型,反之就是自动装箱。
integer的缓存机制
如果integer中的val的大小大于127或者小于-128的话就会创建新的对象,否则缓存在一个名为cache的数组织中,会在第一次使用的时候初始化出来,在-128~127范围内返回的是缓存对象,而不是新建对象。
三、String
-
字符串的不可变性
String类是不可继承的final类,字符串对象是不可变对象
String类有两个主要的成员变量,其中一个是被final修饰的char数组value用于存储字符串,而另一个则是hash存储的是地址,
value赋值之后地址不可变,而String类没有提供相应方法更改value指向的数组元素所以String字符串不可变。
它涉及的目的就是为了字符串常量池的需要,安全性,以及为hashmap,hashtable提供key -
jdk6和jdk7之间关于subString的原理以及区别
subString的作用是获得字符串子串,字符串不可变,在后端是以字符串数组的形式进行存储的,jdk6之中方法包含三个参数,分别为字符串数组,offset ,count该函数仍指向一个数组但是偏移量发生了变化
x=x.subString(x,y)+"";一般用这种方式形成一个新的数组,而在jdk7之中则直接指向新的数组, -
replaceFirst,replaceAll和replace的区别,
replaceFirst是将第一个匹配到正则的进行替换,而replaceAll则是将符合正则的全部替换,replace是将第一个字符串的全部替换成第二个字符串
-
String对“+”的重载,字符串拼接的几种方式和区别。
String的+是相当于Str=new StringBuilder(Str).append("").toString();
1、直接使用“+”号
2、使用String方法的concat
3、使用StringBuilder的append
4.使用StringBuffer的append方法
当两个字符串的值都不为null的时候,可以使用cancat方式进行拼接
三个以上字符串拼接的时候使用append方法,当然Stringbuffer没有StringBuilder速度快,因为StringBuffer是考虑线程安全的,所以速度较之Stringbuilder慢了一些,而且“+”号在两个字符串拼接的时候速度比append速度要快
cancat则是创建两个对象,首先创建一个新的对象给后面的对象,然后连接,生成一个新的字符串对象 -
String.valueof()和Integer.toString()的区别
String.valueOf()是将其他类型的数据直接转换成字符串,而Integer.toString()则是将其中的参数先转换成int然后转换成字符串
-
switch 对于String的支持
在jdk1.7之前switch都是将后面的参数转换成int值,然后进行比对,而String不能转换成int值
在1.7之中switch可以支持String,比较的是字符串的hash值,当然hash值是有可能发生冲突的,这时候就需要使用equal函数进行比较了 -
字符串池,常量池(运行时常量池,class常量池)intern
字符串池:就是在创建字符串对象或者是字符串赋值的时候,如果字符串池之中没有该字符串,那么就在字符串池之中创建该对象。如果有的话,在赋值(=)的时候,就直接将该字符串的引用传递给String对象。
优缺点:字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低。
常量池
常量池之中主要包含代码之中定义的基本类型常量以及引用类型之中的常量,还有一些文本形式的符号引用。常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。本文只从java使用者的角度来探讨java常量池技术,并不涉及常量池的原理及实现方法。个人认为,如果是真的专注java,就必须对这些细节方面有一定的了解。但知道它的原理和具体的实现方法则不是必须的。
intern
intern方法就是返回当前字符串对象,如果字符串常量池之中没有改字符串的时候就在字符串常量池之中插入该字符串,如果有则直接返回字符串对象。
jdk1.6中只能查询或创建在字符串常量池;
jdk1.7中会先查询字符串常量池,若没有又会到堆中再去查询并存储堆的引用,然后返回。
1.7之后,字符串又被移入到了堆中。