日期:2014-05-20  浏览次数:20680 次

Java面试之数据类型

Java中类型大体分为两类,一类是原始类型,一类是引用类型。另外,java为每个原始类型提供了封装类。它们之间有很多的不同。
如下:

1. 声明时存储的内容不同。
声明一个原始类型时,就为类型本身声明了存储。而声明一个引用变量时,在堆栈中存放不是对象本身,而是对对象的引用。也就是存储的是指向对象存储所在的堆的某个区域的指针。

2. 实例化数据时缺省值不同。
对象引用实例变量缺省值为null; 而原始类型的缺省值是与具体类型相关的“似零值”

3. 调用方式不同。
原始数据类型不需要调用new,也不要创建对象。而引用类型需要调用new创建对象。
当然为了,程序员操作方便,java中为所有的原始数据类型提供了相对应的封装类。这些封装类使得这些我们可以像一般对象那样使用原始类型。
下面延伸几个知识点:

1. Int 和 integer的区别

2. ==与equals的区别
这两个都都是用于判断是否相等用的。
判断是否相等在java中分为原始数据类型的比较,和引用类型的比较。
原始数据类型比较使用==就是直接比较他的值。这个没有多大问题。
问题在于,引用对象之间的比较。==和object对象中equals都是比较两个对象的引用对象是否相等。而不是对象本身。不同的是,equals方法可以覆盖,其他类继承object类时可以覆盖equals方法。使他比较的是对象本身。
(可以结合看看jdk的源代码!)


public class Test{      
public static void main(String[] args){      
//s1,s2分别位于堆中不同空间      
String s1=new String("hello");      
String s2=new String("hello");      
System.out.println(s1==s2)//输出false//s3,s4位于池中同一空间      
String s3="hello";      
String s4="hello";      
System.out.println(s3==s4);//输出true      
}      
}



这里有添加一个比较怪异的现象!
这里主要是因为使用的对象池技术! 详情请参考 博文:  http://minijack.iteye.com/blog/976355
从一道诡异的程序说起!

3.String和stringbuffer和stringbuild的区别
Java提供了两个字符串类:String和StringBuffer。它们可以储存和操作字符串,即包含多个字符的字符串数据。String提供了不可改变的字符串,而stringbuffer提供的字符串对象可以进行修改。当知道要修改的时候可以使用StringBuffer类创建。

String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。

StringBuffer 线程安全JDK 1.0 StringBuilder 线程不安全JDK 1.5
为了达到线程安全的目的在一定程度上会降低程序的性能。所以在单线程中,StringBuilder的性能要比StringBuffer高。多线程为了线程安全需要采用StingBuffer。其实在线程不考虑的情况下,要是程序对性能的要求不高,太在意这两者的区别就没有什么意义

                                                      5.11 补充!