1 hashCode()和equals()
euqals()和hashCode()是Obiect類的兩個方法,Object類是所有類的父類,所有的對象都實現了Object()類中的方法。
1.1 equals()
Object的原生equals()方法定義是:
public boolean equals(Object obj){
return (this == obj)
}
就是對對象的地址值進行比較,即比較引用是否相同。而String ,Integer等自行封裝了equals()方法,這些方法比較的是內容。
hashCode()與equals():當重寫equals()方法的時候,hashCode()也要被重寫。相同的對象,他們的hashCode()一定相同。
1.2 hashCode()
該方法是給對象返回一個hashcode值。
Object類中的,hashCode()的定義是:
public native int hashCode();
說明hashCode()方法是一個本地方法,實現與本地機器相關,
String 封裝的hashCode()方法:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31 * h + val[off++];
}
hash = h;
}
return h;
}
對於hashCode:在一個Java應用的執行期間,如果一個對象提供給equals做比較的信息沒有被修改的話,該對象多次調用hashCode()方法,該方法必須始終如一返回同一個integer,如果兩個對象的equals()相等,hashCode也相同
關於hashCode()與equals()方法有如下規定:
1.兩個對象相同,這兩個對象的hashCode一定也相同。
2.如果兩個對象的hashCode相同,這兩個對象並不一定相同。
**爲什麼重寫equals()方法:這在實際開發的過程中在hashmap或者hashset裏如果不重寫的hashcode和equals方法的話會導致我們存對象的時候,把對象存進去了,取的時候卻取不到想要的對象。
1.重寫equals()方法是爲了保證在發生衝突的shi’hou 取得entry對象。
2.重寫ha’shCode是爲了保證相同的對象有相同的hashCode
2 final
final修飾的類不能被繼承,沒有子類,final類中的方法默認是final的。
final修飾的方法不能被子類的方法覆蓋,但可以被繼承。
final修飾的成員變量表示常量,只能被賦值一次,賦值後值不再改變。
final關鍵字不能用於修飾構造方法
所有基本類型(包括void)的包裝類都使用了final修飾,因此我們無法繼承它們擴展新的類,也無法重寫它們的任何方法。
父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。
3 Math.round(-1.5)
Java中math的round()方法就是四捨五入,最簡單來說round的值+0.5以後向下取整。
public static void main(String[] args){
System.out.println(Math.round(-1.5));//-1
System.out.println(Math.round(-1.51));//-2
System.out.println(Math.round(1.51));//2
System.out.println(Math.round(1.5));//2
System.out.println(Math.round(1.49));//1
}
4 java 中操作字符串都有哪些類?它們之間有什麼區別?
String、StringBuffer、StringBuilder
String : final修飾,String類的方法都是返回new String。即對String對象的任何改變都不影響到原對象,對字符串的修改操作都會生成新的對象。
StringBuffer : 對字符串的操作的方法都加了synchronized,保證線程安全。
StringBuilder : 不保證線程安全,在方法體內需要進行字符串的修改操作,可以new StringBuilder對象,調用StringBuilder對象的append、replace、delete等方法修改字符串。
String 是不可變的,每次改變都是生成心得String 對象,生成過多無用的對象會造成jvm GC,降低系統性能。
String buffer是可變自字符串,每次結果都會對 StringBuffer 對象本身進行操作,特別是字符串對象經常改變的情況下,使用String buffer
Java.lang.StringBuffer線程安全的可變字符序列。一個類似於 String 的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。可將字符串緩衝區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而 insert 方法則在指定的點添加字符。
java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。
5 String直接賦值和new String的區別
public static void main(String[] args){
String str1 = "11";
String str2 = "11";
String str3 = new String("11");
System.out.println("testOne.equals(testOne): "+ Boolean.valueOf(str1==str2));//true
System.out.println("testOne.equals(testOne): "+ Boolean.valueOf(str1==str3));//false
}
簡單來說: String str1 = “11”; 直接放入常量池
String str3 = new String(“11”); 創建新的對象,有新的地址
6 Files的常用方法
方法聲明 | 描述 |
---|---|
File(String pathname) | 通過指定的一個字符串類型的文件路徑來創建一個新的File對象 |
File(String parent , String child) | 根據指定的一個字符串類型的父路徑和一個字符串類型的子路徑(包括文件名稱)創建一個File對象 |
File(File parent , String child) | 根據指定的 File 類的父路徑和字符串類型的子路徑(包括文件名稱)創建一個File對象 |
boolean exists() | 判斷File對象對應的文件或者目錄是否存在若存在則返回true,否則返回false |
boolean delete() | 刪除File對象對應的文件或者目錄若成功則返回true,否則返回false |
boolean createNewFile() | 當File對象對應的文件不存在時,該方法將新建一個此File象所指定的新文件若創建成功則返回true,否則返回false |
String getName() | 返回File對象表示的文件或文件夾的名稱 |
String getPath() | 返回File對象對應的路徑 |
String getAbsolutePath() | 返回File對象對應的絕對路徑(在UNIX/Linux等系統上,如果路徑是以正斜線 / 開始的,則這個路徑是絕對路徑;在Windows等系統上,如果路徑是從盤符開始的,則這個路徑是絕對路徑) |
String getParent() | 返回File對象對應目錄的父目錄,(即返回的目錄不包含最後一級子目錄) |
boolean canRead() | 判斷File對象對應的文件或者目錄是否可讀若可讀則返回true,反之返回false |
boolean canWrite() | 判斷File對象對應的文件或者目錄是否可寫。若可寫則返回true,反之返回false |
boolean isFile() | 判斷File對象對應的是否是文件(不是目錄)若是文件則返回true,反之返回false |
boolean isDirectory() | 判斷File對象對應的是否是目錄(不是文件)若是目錄則返回true,反之返回false |
boolean isAbsolute() | 判斷File對象對應的文件或者目錄是否是絕對路徑 |
long lastModified() | 返回1970 年1 月1 日 0 時0 分 0 秒到文件最好修改時間的毫秒值 |
long length() | 返回文件內容長度 |
String [ ]list() | 返回指定目錄的全部內容,只列出名稱 |
File[ ] listFiles() | 返回一個包含了File對象所有子文件和子目錄的File數組 |