1.包裝類
1)包裝類為基本數據類型提供了相應的引用數據類型。
(基本數據類型-包裝類)
btye-Byte,char-Character,short-Short,float-Float
int-Integer,double-Double,long-Long,boolean-Boolean
2)通過包裝類的構造器來實現吧基本數據類型包裝成包裝類
3)可以通過使用包裝類的xxxValue()實例方法,可以獲得包裝類對象中包裝的基本數據類型。
package cn.it.lsl;public class Primitive2Wrapper {public static void main(String[] args) {boolean b = true;Boolean b1 = new Boolean(b);int a = 5;Integer a1 = new Integer(a);//把一個字符串包裝成包裝類 (Character類除外)Float f = new Float("2.3");Boolean b2 = new Boolean("false");boolean b3 = b2.booleanValue();System.out.println(b3);int aa = a1.intValue();System.out.println(aa);//當用一個字符串來創建Boolean對象時,如果傳入的是字符串"true",或或次字符串不同字母的大小寫變化形式,如"True",都將創建true對應的Boolean對象//當傳入其他字符串時,都會創建false對應的Boolean對象Boolean b4 = new Boolean("true");boolean b5 = b4.booleanValue();System.out.println(b5);} }
4)以上的轉換比較麻煩,在JDK1.5中提供了自動裝箱和自動拆箱功能實現包裝類跟基本數據類型的轉換。
自動裝箱:把基本數據類型直接賦值給對應的包裝類
自動拆箱:把包裝類直接賦值給對應的基本數據類型
eg:
Integer a = 5; int b = a;
5)包裝類還可以實現基本類型和字符串之間的轉換。
把字符串類型的值轉換為基本類型的值
(1)利用parseXxx(String s)方法(Charcater除外)
(2)利用包轉類提供的構造器
把基本類型轉為字符串
(1)String類的valueOf()
(2)基本類型和""進行連接運算
package cn.it.lsl;public class Primitive2Wrapper {public static void main(String[] args) { String str = "23";int a1 = Integer.parseInt(str);int a2 = new Integer(str);System.out.println(a1);System.out.println(a2);String str2 = String.valueOf(2.34f);System.out.println(str2);System.out.println(23+"");} }
6)包裝類的比較
(1)包裝類可以與基本數據類型比較
(2)因為包裝類是引用數據類型,所以只有兩個包裝類指向用一個對象的時候才會返回true
Integer a = new Integer(6); System.out.println("6的包裝類是否大于5.0:" + (a>5.0)); System.out.println("2個包裝類的比較:" + (new Integer(2) == new Integer(2)));
7)包裝類比較的特殊情況
自動裝箱的結果
package cn.it.lsl;public class Primitive2Wrapper {public static void main(String[] args) {Integer a = 2;Integer b = 2;System.out.println(a == b); //輸出true Integer a1 = 128;Integer b1 = 128;System.out.println(a1 == b1); //輸出false } }
分析:以上程序,當兩個2自動裝箱后,比較相等,但是兩個128自動裝箱后就不相等。
這是因為系統內部提供了一個緩存功能,把-128~127之間的整數自動裝箱成一個Integer時,實際上直接指向對象的數值元素,而-128~127范圍外的整數自動裝箱成Integer時,總是新創建一個Integer實例。
2.toString()方法
toString()是Object類里面的一個實例方法,因為所有的類都是Object的子類,所以所有的Java對象都具有toString()方法。
當打印一個對象的時候,總是會調用toString()方法。在缺省狀態下,其輸出時類名、符號名@、對象的hashCode()值。
package cn.it.lsl;public class ToStringWithout {int x;int y;public ToStringWithout(int x,int y){this.x = x;this.y = y;}public static void main(String[] args) {System.out.println(new ToStringWithout(23,33));} }
輸出:cn.it.lsl.ToStringWithout@bb0d0d
package cn.it.lsl; //覆蓋toString()方法 public class ToStringWith {int x;int y;public ToStringWith(int x, int y){this.x = x;this.y = y;}public String toString(){return "ToStringWith[" + x + "," + y + "]";}public static void main(String[] args) {System.out.println(new ToStringWith(23,33));} }
輸出:ToStringWith[23,33]
3.單例類
有時候,不允許自由創建一個類的實例,而只允許該類創建一個對象,這就是單例類。
1)創建單例類的方法
(1)要把構造器使用private修飾,這樣就能避免其他類自由創建該類的實例。
(2)提供一個public方法作為該類的訪問點,用于創建對象,且該方法應該使用static修飾。(因為調用該方法時候,對象還不存在,所以調用該方法的只能是類)
(3)該類中還要有一個緩存對象,用于判斷該類是否已經創建過對象了,這樣才能保證只創建一個對象,該成員應該也要static修飾。
package cn.it.lsl;class Singleton{//使用一個變量來緩存已經創建的實例private static Singleton instance;private Singleton(){}public static Singleton getInstance(){/* 如果instance為null,則還未創建Singleton對象* 如果instance不為null,則表明已經創建了Singleton對象,將不再創建* */if(instance == null){instance = new Singleton();}return instance;} }public class SingletonTest {public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);} }
4.比較(==和equals方法)
1)若使用==對兩個引用類型變量進行比較,他們必須指向同一個對象時,==判斷才會是true。
2)當比較兩個變量時基本類型時,且都是數值類型時,兩個值相等,就會返回true
例如:
int a = 65; float b = 65.0f; System.out.println(a == b); char c = 'A'; System.out.println(a == c);
3)"hello"直接量和new String("hello")的區別?
(1)常量池的概念:專門用于管理在編譯期被確定并被保存在已編譯的.class文件中的一些數據。
(2)當Java程序直接使用形如"hello"的字符串直接了(包括可以在編譯時就計算出來的字符串值)時,JVM將會使用常量池來管理這些字符串。
(3)當使用new String("hello")時,JVM會先使用常量池來管理"hello"直接量,再調用String類的構造器來創建一個新的String對象,新創建的String對象被保存在堆內存中。也就是new String("hello")一共產生了兩個對象。
package cn.it.lsl;public class EqualDemo {public static void main(String[] args) {String s1 = "你好";String s2 = "你";String s3 = "好";String s4 = "你" + "好"; //s4后面的字符串值可以在編譯期就確定下來String s5 = s2 + s3; //s5后面的字符串值不能再編譯期就確定下來String s6 = new String("你好");System.out.println(s1 == s4);System.out.println(s1 == s5);System.out.println(s1 == s6);} }
JVM常量池保證相同的字符串直接量只有一個,不會產生多個副本。
4)equals方法
(1)equals方法是Object類提供的一個實例方法,因此所有引用變量都能調用該方法,但是該方法判斷該兩個對象相等的標準與使用==運算符沒有區別,同樣是兩個引用變量指向同一個對象時才會返回true。
(2)String已經重寫了Object的equals()方法,String的equals()方法判斷兩個字符串是否相等的標準是:只要兩個字符串的字符序列相同,就返回true。
(3)Object默認提供的equals()只是比較對象的地址,多數情況下,我們需要重寫equals()方法。
package cn.lsl;class Person{private String name;private String id;public Person() {super();// TODO Auto-generated constructor stub }public Person(String name, String id) {super();this.name = name;this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public boolean equals(Object obj){if(this == obj)return true;//obj不為null,并且是Person類實例的時候if(obj != null && obj.getClass() == Person.class){Person personObj = (Person)obj;if(this.getId().equals(personObj.getId())){return true;}}return false;}}public class OverrideEqualsRight{public static void main(String[] args) {Person p1 = new Person("劉小明","1213");Person p2 = new Person("小明","1213");Person p3 = new Person("小劉","1215");System.out.println(p1.equals(p2));System.out.println(p2.equals(p3));} }
?