1、数据类型
* byte: 8-bit, -128 - 127.
* short: 16-bit, -32,768 - 32,767.
* int: 32-bit, -2,147,483,648 - 2,147,483,647.
* long: 64-bit, -9,223,372,036,854,775,808 - 9,223,372,036,854,775,807.
* float: 32-bit.
* double: 64-bit.
* boolean: true/false.
* char: 16-bit, '\u0000' (or 0) -'\uffff' (or 65,535).
2、String问题汇总
a、比较
String str1 = new String("abc");
String str2 = "abc";
String str3 = "abc";
System.out.println("str1 == str2:"+(str1 == str2));
System.out.println("str1.equals(str2):"+str1.equals(str2));
System.out.println("str2 == str3:"+(str2 == str3));
System.out.println("str2.equals(str3):"+str2.equals(str3));
//str1 = str1.intern();//(1)注释掉(2)不注释
String str4 = new String("abc");
System.out.println("str1 == str4:"+(str1 == str4));
System.out.println("str1.equals(str4):"+str1.equals(str4));
System.out.println("str1 == str2:"+(str1 == str2));
System.out.println("str1.equals(str2):"+str1.equals(str2));
System.out.println("str1 == str3:"+(str1 == str3));
System.out.println("str1.equals(str3):"+str1.equals(str3));
result:
(1)
str1 == str2:false
str1.equals(str2):true
str2 == str3:true
str2.equals(str3):true
str1 == str4:false
str1.equals(str4):true
str1 == str2:false
str1.equals(str2):true
str1 == str3:false
str1.equals(str3):true
(2)
str1 == str2:false
str1.equals(str2):true
str2 == str3:true
str2.equals(str3):true
str1 == str4:false
str1.equals(str4):true
str1 == str2:true
str1.equals(str2):true
str1 == str3:true
str1.equals(str3):true
原因如下:Java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。
非可变类:简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。
因此
1. String str1 = new String("abc");
2. Stirng str2 = "abc";
3. str1 = str1.intern();
对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。
对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。
对于第三:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。而调用intern方法不管是在Stirng str2 = "abc"之前还是之后,均为相同的引用。
如此上面的问题就得到解决。
b、String 与 StringBuffer
String在做串接的话,要增长字符串,也就是要改变String的内部状态,这样会影响性能。
StringBuffer是可变的配套类,如果经常做串接的话,应该采用StringBuffer,它仅仅时改变了内部数据结构,而不会创建新的对象,因此性能上有很大的提高。