Java基礎知識(2)(hashcode/final/round/String)

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數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章