ui設(shè)計(jì)界面效果圖長沙搜索排名優(yōu)化公司
1、Java API簡介
????????Java API(Java Application Programming Interface)是Java應(yīng)用程序編程接口的縮寫。Java中的API,就是JDK提供的具有各種功能的Java類,靈活使用Java API能夠大大提高使用Java語言編寫程序的效率。
????????Java API的幫助文檔可到 http://docs.oracle.com/javase/8/docs/api/ 下載,靈活使用Java API能夠提高使用Java語言編寫程序的效率,下面對Java中提供的最常用的包進(jìn)行介紹,對這些包中的常用類先有一個(gè)總體了解,后文將對重要的、常見的方法進(jìn)行介紹。
- java.lang:Java語言包, 該包中提供了利用Java語言進(jìn)行程序設(shè)計(jì)的基礎(chǔ)類,比如String、Math、System類,該包中的類不需要使用import語句進(jìn)行導(dǎo)入,都會被自動(dòng)導(dǎo)入。
- java.util:該包中主要包含一些實(shí)用的工具類,比如集合框架類、日期處理類、字符串解析類、隨機(jī)數(shù)生成類等。
- java.awt:該包中主要包含處理用戶界面和繪制圖形圖像的各種類。
- java.io:該包中主要包含處理輸入、輸出編程的各種類。
- java.net:該包中主要包含處理網(wǎng)絡(luò)編程的各種類。
- java.sql:該包中主要包含處理數(shù)據(jù)庫編程的各種類。
1.?Java.lang包中常用的類
java.lang包中的常用類
Boolean | Object | Error |
Byte | String | Throwable |
Character | StringBuffer | Exception |
Double | StringBuilder | ClassNotFoundException |
Float | System | NullPointerException |
Integer | Math | NumberFormatException |
Long | Runnable(接口) | RuntimeException |
Short | Thread | ArithmeticException |
2.?java.util包中常用的類
java.util包中的常用類
Collection(接口) | Arrays | Calendar |
Iterator(接口) | Set(接口) | Date |
ListIterator(接口) | HashSet | Random |
List(接口) | TreeSet | Scanner |
ArrayList | Map(接口) | Collections |
LinkedList | HashMap | |
Vector | Hashtable | |
Stack | TreeMap |
3.?java.io包中的常用的類
java.io包中的常用類
BufferedInputStream | FileReader | PrintWriter |
BufferedOutputStream | FileWriter | Reader |
BufferedReader | InputStream | Writer |
BufferedWriter | InputStreamReader | Serializable(接口) |
DataInputStream | OutputStream | Externalizable接口) |
DataOutputStream | OutputStreamWriter | IOException |
File | ObjectInputStream | FileNotFoundException |
FileInputStream | ObjectOutputStream | InvalidClassException |
FileOutputStream | PrintStream |
4. java.net包中常用的類
java.net包中的常用類
ServerSocket |
Socket |
UnknownHostException |
2、Object類
????????在Java中,有這樣一個(gè)類,它是所有類的祖先類,也就是說,任何類都是其子孫類,它就是java.lang.Object。如果一個(gè)類沒有顯式地指明其父類,那么它的父類就是Object,也就是說,下面兩條語句的作用是一樣的:
public class ClassName{…}
等價(jià)于
public class ClassName extends Object{…}
????????如同我們稱自己為炎黃子孫一樣,所有的類都是Object類的子類,Object類中定義的方法被遺傳到所有其它類中。同時(shí),Object類也是Java語言中唯一一個(gè)沒有父類的類。
????????做為一個(gè)超級祖先類,Object類為子類提供了一些public修飾的方法,便于子類覆蓋來實(shí)現(xiàn)子類自己特定的功能,下面我們要詳細(xì)介紹其中的equals()方法、hashCode()方法和toString()方法。
1. public boolean equals(Object obj)
????????該方法在Object類中的作用是:比較兩個(gè)引用所指向的對象是否是同一個(gè)對象,即兩個(gè)引用所指向?qū)ο蟮?strong>地址是否相等。
????????注意,通常情況下,所有的類中equals()方法默認(rèn)是比較地址,但是,Object的任何子類均可以按照自己的需要對equals()方法進(jìn)行覆蓋,以改變此方法的操作細(xì)節(jié),實(shí)現(xiàn)使用自定義的方法判斷兩個(gè)對象是否為同一個(gè)對象或者兩個(gè)對象是否具有可互相替代性。
????????【例】 定義公民類Citizen,覆蓋該類的equals()方法,該方法的定義為:如果兩個(gè)公民的身份id相同,則為同一個(gè)公民,但是不用考慮這兩個(gè)對象是否具有相同的地址。
public class Citizen{private int id;private String name;public Citizen(int id, String name) {this.id = id;this.name = name;}//覆蓋父類的equals()方法public boolean equals(Object o) {Citizen c = (Citizen) o;if (c.id == this.id) {return true;} else {return false;}}//主方法,測試equals()方法public static void main(String args[]) {Citizen xiaoming = new Citizen(21000, "xiaoming");Citizen mingming = new Citizen(21000, "mingming");System.out.println(xiaoming.equals(mingming));}
}
//程序運(yùn)行結(jié)果:true
????????程序分析:上例定義了一個(gè)Citizen類,此類包含了公民的兩個(gè)屬性id和name,同時(shí)覆蓋了equals()方法,該方法實(shí)現(xiàn)為:當(dāng)傳入對象的id和當(dāng)前對象的id相等時(shí),返回true,否則返回false。所以在main()方法最后一行調(diào)用equals()方法時(shí),調(diào)用的實(shí)際上是Citizen類的equals()方法,xiaoming和mingming對象的id都為21000,所以程序運(yùn)行結(jié)果為true。而假設(shè)如果Citizen類沒有覆蓋equals()方法,則在最后一行調(diào)用equals()方法時(shí),實(shí)際調(diào)用的Object類的equals()方法,該方法比較兩個(gè)對象是否指向同一塊地址,所以肯定返回false,讀者可自行驗(yàn)證。
????????"=="運(yùn)算符和equals()方法的區(qū)別:"=="是比較運(yùn)算符,既能用于比較兩個(gè)基本數(shù)據(jù)類型,也能用于比較兩個(gè)引用數(shù)據(jù)類型,當(dāng)比較基本數(shù)據(jù)類型時(shí),判斷兩個(gè)基本數(shù)據(jù)類型的字面量是否相等,當(dāng)比較兩個(gè)引用數(shù)據(jù)類型時(shí),判斷兩個(gè)"地址"的值是否相等,也就是兩個(gè)"引用"是否指向同一個(gè)對象。而equals()方法只能用于比較引用數(shù)據(jù)類型(也就是所有以O(shè)bject類為父類的類型),Object類的equals()方法默認(rèn)比較兩個(gè)對象引用的值是否相等,但equals()方法通常都會被子類覆蓋,所以子類中equals()方法的含義,就要看子類中的具體實(shí)現(xiàn)了。
????????【例】 == 和 equals()方法在String類中的區(qū)別
String str1 = "hello"; String str2 = new String("hello"); System.out.println(str1==str2); System.out.println(str1.equals(str2));
程序運(yùn)行結(jié)果:
false
true
????????程序分析:因?yàn)镾tring是引用數(shù)據(jù)類型,使用"=="運(yùn)算符比較兩個(gè)引用地址是否相同,第二行使用關(guān)鍵字new重新生成了一個(gè)String對象,所以第三行輸出為false。在String類中,覆蓋了Object的equals()方法,該方法判斷兩個(gè)String對象的內(nèi)容是否相等,所以第4行輸出為true。
2. public int hashCode()
????????該方法返回對象的哈希碼。任何一個(gè)對象的默認(rèn)的哈希碼是將對象的內(nèi)存地址通過某種轉(zhuǎn)換得到的,所以不同對象會有不同的哈希碼。
????????哈希碼是一個(gè)代表對象的十六進(jìn)制整數(shù),好比對象的身份證號。在程序運(yùn)行期間,每次調(diào)用同一個(gè)對象的hashCode()方法,返回的哈希碼必定相同。但是Java應(yīng)用程序需要的內(nèi)存由操作系統(tǒng)提供,所以多次執(zhí)行同一個(gè)程序,因操作系統(tǒng)的運(yùn)行情況不一樣,內(nèi)存使用情況也不一樣,程序所獲得的內(nèi)存不同,這就導(dǎo)致同一個(gè)對象的哈希碼也不一定相同。
????????在Java中有個(gè)規(guī)定:如果equals()方法返回兩個(gè)對象是相等的,那這兩個(gè)對象上調(diào)用hashCode()返回的整數(shù)必須相等,否則在使用Hash類型集合時(shí)就會產(chǎn)生錯(cuò)誤,所以在我們覆蓋equals()方法同時(shí),建議覆蓋hashCode()方法。需要說明,如果equals()返回兩個(gè)對象不等,它們的hashCode()也可以返回相同的整數(shù),但是最好讓它們的hashCode()返回不同的整數(shù),這有利于提高Hash類型集合的性能。那么重寫equals()方法時(shí),一定要重寫hashcode()方法嗎?先說說hashcode()方法調(diào)用的條件,如果你想往map里面放一個(gè)類作為map的鍵值,這個(gè)類又是你自己設(shè)計(jì)的,或者這個(gè)類不是你寫的但是你修改了這個(gè)類的equals()方法,這個(gè)時(shí)候,你就要重寫hashcode()方法,這樣當(dāng)你往map里放值的時(shí)候,系統(tǒng)會調(diào)用這個(gè)對象的hashcode()方法來生成相應(yīng)的hash值,來映射相應(yīng)的對象。
????????如果同一個(gè)類的兩個(gè)對象的屬性值相等,那么他們的hashcode()一定相等嗎?這個(gè)要看你具體如何實(shí)現(xiàn)你的hashcode()方法,如果你希望他們的值一樣hashcode()也一樣,你就可以這樣實(shí)現(xiàn)。但是hashcode的實(shí)現(xiàn),一般要滿足幾個(gè)特征:
自反性:即對任意一個(gè)非空的指引值x,x.equals(x)永遠(yuǎn)返回true。
對稱性:即對任意兩個(gè)非空的指引值x,y,如果x.equals(y)返回true,那么y.equals(x)也返回true。
傳遞性:當(dāng)x.equals(y)返回true并且y.equals(z)返回true時(shí),x.equals(z)也返回true。
3. public String toString()
????????該方法返回對象的字符串表示,形如:java.lang.Object@1db9742,也就是 類名@hashcode。toString()方法是一個(gè)從字面上就容易理解的方法,它的功能是得到一個(gè)能夠代表該對象的一個(gè)字符串:類名+"@"+代表該對象的一個(gè)唯一的16進(jìn)制數(shù),例如下面這個(gè)例子:
????????【例】 查看Object類和String類的toString()方法返回值。
public class ObjectSample {public static void main(String args[]){Object o = new Object();System.out.println(o);System.out.println(o.toString());String s = new String("hello");System.out.println(s); }
}
程序運(yùn)行結(jié)果:
java.lang.Object@1db9742
java.lang.Object@1db9742
hello
????????程序分析:前兩個(gè)輸出結(jié)果表示對象o在內(nèi)存中的地址,事實(shí)上返回這樣的字符串沒有什么實(shí)際的意義。一般子類都會覆蓋該方法,讓它返回有意義的文本。例如上例中的對象s的輸出為"hello",這是因?yàn)樽址甋tring類對toString()進(jìn)行了覆蓋,讓它返回此String的本身內(nèi)容。
????????下面通過實(shí)例來看一下如何在自己編寫的類中覆蓋equals()方法和toString()方法。
????????【例】 equals()方法和toString()的覆蓋
//圓類public class MyCircle {private int radius;//半徑public MyCircle(int r) {radius = r;}public int getRadius() {return radius;}public void setRadius(int r) {radius = r;}//覆蓋Object中的equals()方法public boolean equals(Object obj) {MyCircle o = (MyCircle) obj;if (o.getRadius() == this.radius)return true;elsereturn false;}//覆蓋Object中toString方法public String toString() {return "radius = " + radius;}}
//測試類
public class Test {public static void main(String[] args) {MyCircle obj1 = new MyCircle(3);System.out.println("obj1:" + obj1.toString());MyCircle obj2 = new MyCircle(3);System.out.println("obj2:" + obj2.toString());if (obj1.equals(obj2))System.out.println("the two objects are equal");elseSystem.out.println("the two objects are not equal");}
}
程序運(yùn)行結(jié)果:
obj1:radius = 3
obj2:radius = 3
the two objects are equal
????????程序分析:從程序的運(yùn)行結(jié)果來看,我們創(chuàng)建的兩個(gè)MyCircle對象是相等的,因?yàn)镸yCircle類中覆蓋的equals()方法規(guī)定,當(dāng)兩個(gè)MyCircle對象的半徑相等時(shí),認(rèn)為這兩個(gè)對象相等。而我們在調(diào)用MyCircle類的構(gòu)造方法創(chuàng)建對象時(shí)設(shè)定這兩個(gè)MyCircle對象的半徑均為3,所以obj1.equals(obj2)返回true。
?