java基礎(四)經常使用類/算法

這輩子沒辦法作太多事情,因此每一件都要作到精彩絕倫!java

People can't do too many things in my life,so everything will be wonderful   程序員

 

本資料只進行簡單介紹說明以及相關重要問題的解答;關於類的詳細說明及使用請參考java API文檔面試

本文參考的依據是:JDK API 1.6.0 中文版,下載地址:http://down.51cto.com/data/2300228正則表達式

 

1.     API

應用程序編程接口Application Programming Interface算法

就是jdk提供給咱們的一些提升編程效率的java編程

2.     經常使用類

2.1     Object

Object類概述:類層次結構的根類;全部類都直接或間接的繼承自該類設計模式

構造方法:public Object()  子類的構造方法默認訪問的是父類的無參構造方法。數組

2.1.1       Object類的成員方法

查看API文檔和源碼:安全

2.1.1.1 hashCode

public int hashCode();網絡

1,返回該對象的哈希碼值。默認狀況下,該方法會根據對象的地址值經過哈希算法計算出來一個整數值。

2,不一樣對象的,hashCode()通常不會相同;可是同一個對象的hashCode()值確定相同。

  • public final Class getClass();//能夠理解爲:字節碼文件類,編譯後的class

1,返回此Object的運行時類;(該類的對象)

2,能夠經過Class類中的一個方法,獲取對象的真實類的全名稱:

public StringgetName();//String的形式返回此Class對象所表示的實體(類、接口、數組類、基本類型或 void)名稱。

2.1.1.2 toString

public String toString();

1,返回該對象的字符串表示;底層源碼:實際返回的值是:

         public String toString() {

        return getClass().getName() +"@" + Integer.toHexString(hashCode());

}

Integer.toHexString(hashCode())//將一個整數轉化爲16進制的字符串

2,默認狀況下的數據對咱們來講沒有意義,通常重寫該方法:手動重寫或自動重寫

2.1.1.3 equals
  • public boolean equals(Object obj);

源碼:publicboolean equals(Object obj) {

        return (this ==obj);

                      }

1指示其餘某個對象是否與此對象「相等」。

2equals 方法在非空對象引用上實現相等關係: (默認狀況下比較的是對象的引用是否相同,也就是比較地址值)

自反性:對於任何非空引用值 xx.equals(x) 都應返回 true

對稱性:對於任何非空引用值 x y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true

傳遞性:對於任何非空引用值 xy z,若是 x.equals(y) 返回 true,而且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true

一致性:對於任何非空引用值 x y,屢次調用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。

對於任何非空引用值 xx.equals(null) 都應返回 false

Object 類的 equals 方法實現對象上差異可能性最大的相等關係;即,對於任何非空引用值 x y,當且僅當 x y 引用同一個對象時,此方法才返回 truex == y 具備值 true)。

3,因爲比較對象的引用沒有意義,通常重寫該方法:手動或自動重寫(比較類中的成員變量的值是否相同,String類重寫了Objectequals方法,比較數值是否相同

注意:當此方法被重寫時,一般有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具備相等的哈希碼。

  • protected void finalize();

1,當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。子類重寫finalize方法,以配置系統資源或執行其餘清除。

2,垃圾回收器不會立刻回收垃圾,可是咱們能夠建議它儘快回收垃圾(System.gc()方法)

3,主要針對堆內存。

  • protected Object clone();

1,  建立並返回此對象的一個副本,這種克隆機制十分高效,並且兩者之間徹底隔離

2,  自定義實現克隆步驟:

  1. 自定義類實現Cloneable接口,這是一個標記性接口,實現這個接口的類的對象能夠實現自我克隆;

  2. 自定義類中重寫Object類的clone()方法;

  3. 重寫clone()方法時經過super.clone()調用Objectclone()方法獲得該對象的副本,並返回副本。

3,注意:A:克隆和兩個引用指向同一個對象的區別?地址值不同

                    B:Objectclone()方法雖然簡單,易用,但僅僅是一種淺克隆」,它只克隆該對象全部的Field值,不會

                     對引用類型的Field所引用的對象進行克隆。開發中,咱們也能夠實現對象的深度克隆

  • 注意

直接輸出一個對象名稱,其實默認調用了該對象的toString()方法。

2.2     Scannaer

(1)JDK5之後出現的用於鍵盤錄入數據的類。

(2)構造方法:

                   A:講解了System.in這個東西。

                            它實際上是標準的輸入流,對應於鍵盤錄入

                   B:構造方法

                            InputStreamis = System.in;

                           

                            Scanner(InputStreamis)

                   C:經常使用的格式

                            Scannersc = new Scanner(System.in);

(3)基本方法格式:

                   A:hasNextXxx()判斷是不是某種類型的

                   B:nextXxx()       返回某種類型的元素

(4)要掌握的兩個方法

                   A:publicint nextInt()

                   B:publicString nextLine()

(5)須要注意的小問題

                   A:同一個Scanner對象,先獲取數值,再獲取字符串會出現一個小問題。

                   B:解決方案:

                            a:從新定義一個Scanner對象

                            b:把全部的數據都用字符串獲取,而後再進行相應的轉換

2.3     String

String概述及構造方法

概述:字符串是由多個字符組成的一串數據(字符序列),字符串能夠當作是字符數組

構造方法:

public String();

public String(byte[] bytes)

public String(byte[] bytes,int offset,intlength)

public String(char[] value)

public String(char[] value,int offset,intcount)

public String(String original)

String類表明字符串。Java 程序中的全部字符串字面值(如"abc")都做爲此類的實例實現。

例:String s=」abc」 ;   s也是一個對象。

2.3.1       String類特色
  • 字符串是常量,它的值在建立以後不能更改

wKioL1j1cdjSE2kZAABTmHebFTE148.png

  • new字符串和直接複製的區別

         前者建立2個對象,後者建立1個對象。

wKiom1j1ceHzXnR-AABEHWgEANY429.png

注意:字符串中的equals()方法重寫了Object()的方法,比較的是內容。

                   內容相同,引用不一樣。

具體成員方法參考API

2.4     StringBuffer

概述:若是對字符串進行拼接操做,每次拼接,都會構建義一個新的String對象,既耗時,又浪費空間。而StringBuffer能夠解決這個問題。

它是線程安全的可變字符序列。

2.5     數組高級

  • 排序

  • 冒泡排序

  • 相鄰元素兩兩比較,大的日後放,第一次完畢,最大值出如今了最大索引處

public static void bubbleSort(int[] arr) {

                                     for(intx=0; x<arr.length-1; x++) {

                                               for(inty=0; y<arr.length-1-x; y++) {

                                                        if(arr[y]> arr[y+1]) {

                                                                 inttemp = arr[y];

                                                                 arr[y]= arr[y+1];

                                                                 arr[y+1]= temp;

                                                        }

                                               }

                                     }

                   }

wKiom1j1ce3hRyKPAABnAnP3Nu8269.png

  • 選擇排序

  • 0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出如今了最小索引處

public static void selectSort(int[] arr) {

                                     for(intx=0; x<arr.length-1; x++) {

                                               for(inty=x+1; y<arr.length; y++) {

                                                        if(arr[y]< arr[x]) {

                                                                 inttemp = arr[x];

                                                                 arr[x]= arr[y];

                                                                 arr[y]= temp;

                                                        }

                                               }

                                     }

                            }

wKioL1j1cfjRQO2xAABnxiGFUPQ585.png

  • 查找:

基本查找:數組元素無序

public static int getIndex(int[] arr,int value) {

                                     intindex = -1;

                                    

                                     for(intx=0; x<arr.length; x++) {

                                               if(arr[x]== value) {

                                                        index= x;

                                                        break;

                                               }

                                     }

                                    

                                     returnindex;

                            }

 

二分查找:數組元素有序

public static int binarySearch(int[] arr,int value) {

                                     intmin = 0;

                                     intmax = arr.length-1;

                                     intmid = (min+max)/2;

                                    

                                     while(arr[mid]!= value) {

                                               if(arr[mid]> value) {

                                                        max= mid - 1;

                                               }elseif(arr[mid] < value) {

                                                        min= mid + 1;

                                               }

                                             

                                               if(min> max) {

                                                        return-1;

                                               }

                                              

                                               mid= (min+max)/2;

                                     }

                                    

                                     returnmid;

                            }

wKioL1j1cgSSAdr4AABTnPJB3pA425.png

2.6     Arrays

概述:針對數組進行操做的工具類,提供了排序、查找等功能

經常使用方法:

把數組轉成字符串:public static String toString(數組);

排序:public static void sort();底層是快速排序法

二分查找:public static int binarySearch(數組,key);

2.7     基本類型包裝類概述

將基本數據類型封裝成對象的好處在於:能夠在對象中定義更多的功能方法操做該數據。

經常使用的操做之一:用於基本數據類型與字符串之間的轉換;

爲了讓基本類型的數據進行更多的操做,Java就爲每種基本類型提供了對應的包裝類類型

                   byte                 Byte

                   short                  Short

                   int                       Integer

                   long                    Long

                   float                   Float

                   double               Double

                   char                   Character

                   boolean             Boolean

2.7.1       Integer

Integer成員方法:其中一部分能夠進行經常使用的進制轉換;(2~36進制)

JDK5的新特性:

自動拆裝箱:

自動裝箱         基本類型--引用類型

                   自動拆箱         引用類型--基本類型

    Integer x = new Integer(4);能夠直接寫成

    Integer x = 4;//自動裝箱。

    x  = x + 5;//自動拆箱。經過intValue方法。

注意:在使用時,Integer x=null;上面的代碼就會NPE異常。

2.8     正則表達式

  • 是指一個用來描述或匹配一系列符合某個句法規則的字符串的單個字符串。

  • 規則字符在java.util.regexPattern類中

常見規則

                   A:字符

                            x字符 x。舉例:'a'表示字符a

                            \\反斜線字符。

                            \n新行(換行)符 ('\u000A')

                            \r回車符 ('\u000D')

                           

                   B:字符類

                            [abc]ab c(簡單類)

                            [^abc]任何字符,除了 ab c(否認)

                            [a-zA-Z]a z A Z,兩頭的字母包括在內(範圍)

                            [0-9]09的字符都包括

                           

                   C:預約義字符類

                            .任何字符。個人就是.字符自己,怎麼表示呢? \.

                            \d數字:[0-9]

                            \w單詞字符:[a-zA-Z_0-9]

                                     在正則表達式裏面組成單詞的東西必須有這些東西組成

 

                   D:邊界匹配器

                            ^行的開頭

                            $行的結尾

                            \b單詞邊界

                                     就是否是單詞字符的地方。

                                     舉例:helloworld?haha;xixi

                           

                   E:Greedy數量詞

                            X?X,一次或一次也沒有

                            X*X,零次或屢次

                            X+X,一次或屢次

                            X{n}X,剛好 n

                            X{n,}X,至少 n

                            X{n,m}X,至少 n 次,可是不超過 m

 

2.9     Calender

(1)日曆類,封裝了全部的日曆字段值,經過統一的方法根據傳入不一樣的日曆字段能夠獲取值。

(2)如何獲得一個日曆對象呢?

                   CalendarrightNow = Calendar.getInstance();

                   本質返回的是子類對象

(3)成員方法

                   A:根據日曆字段獲得對應的值publicint get(int field)

                   B:根據日曆字段和一個正負數肯定是添加仍是減去對應日曆字段的值public void add(int field,int amount)

                   C:設置日曆對象的年月日publicfinal void set(int year,int month,int date)

2.10對象數組

數組既能夠存儲基本數據類型,也能夠存儲引用類型。它存儲引用類型的時候的數組就叫對象數組。

 

3.     面試題

3.1     1==equals()的區別?

                            A:==

                                     基本類型:比較的是值是否相同

                                     引用類型:比較的是地址值是否相同

                            B:equals()

                                     只能比較引用類型。默認狀況下,比較的是地址值是否相同。

                                     可是,咱們能夠根據本身的須要重寫該方法。通常重寫該方法比較的是成員變量是否相同。

3.2     2,字符串的面試題(看程序寫結果)

                   A:==equals()

                            Strings1 = new String("hello");

                            Strings2 = new String("hello");

                            System.out.println(s1== s2);// false

                            System.out.println(s1.equals(s2));//true

 

                            Strings3 = new String("hello");

                            Strings4 = "hello";

                            System.out.println(s3== s4);// false

                            System.out.println(s3.equals(s4));//true

 

                            Strings5 = "hello";

                            String s6 ="hello";

                            System.out.println(s5== s6);// true

                            System.out.println(s5.equals(s6));//true

                   B:字符串的拼接

                            Strings1 = "hello";

                            Strings2 = "world";

                            Strings3 = "helloworld";

                            System.out.println(s3== s1 + s2);// false

                            System.out.println(s3.equals((s1+ s2)));// true

 

                            System.out.println(s3== "hello" + "world");// false 這個咱們錯了,應該是true

                            System.out.println(s3.equals("hello"+ "world"));// true

3.3     3String,StringBuffer,StringBuilder的區別(答案百度)

String:不可變的字符序列;

StringBuffer:線程安全的可變字符序列;

StringBuilder:線程不安全的可變字符序列;

三者在執行速度方面的比較:StringBuilder > StringBuffer  >  String

對於三者使用的總結: 1.若是要操做少許的數據用 = String

2.單線程操做字符串緩衝區下操做大量數據 = StringBuilder

3.多線程操做字符串緩衝區下操做大量數據 = StringBuffer

3.4     4-128127之間的數據緩衝池問題

看程序,寫結果:

Integer i1=128;

Integer i2=128;

i1=i2;//false

il.equals(i2);//true  重寫了Objectequals方法,比較的是數值是否相同。

Integer i3=127;

Integer i4=127;

i3=i4;//true

查看Integer源碼:

public static Integer valueOf(int i) {

       assert IntegerCache.high >= 127;

       if (i >= IntegerCache.low && i <= IntegerCache.high)

           return IntegerCache.cache[i + (-IntegerCache.low)];

       return new Integer(i);

}

跟蹤IntegerCache

IntegerCache.low=-128

IntegerCache.high=127

private static class IntegerCache {

       static final int low = -128;

       static final int high;

       static final Integer cache[];

 

       static {

           // high value may be configured by property

           int h = 127;

           String integerCacheHighPropValue =

               sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

           if (integerCacheHighPropValue != null) {

                int i =parseInt(integerCacheHighPropValue);

                i = Math.max(i, 127);

                // Maximum array size isInteger.MAX_VALUE

               h = Math.min(i,Integer.MAX_VALUE - (-low) -1);

           }

           high = h;

 

           cache = new Integer[(high - low) + 1];

           int j = low;

           for(int k = 0; k < cache.length; k++)

                cache[k] = new Integer(j++);

       }

 

       private IntegerCache() {}

}

上述代碼延伸:

assert:斷言

編寫代碼時,咱們老是會作出一些假設,斷言就是用於在代碼中捕捉這些假設,能夠將斷言看做是異常處理的一種高級形式。斷言表示爲一些布爾表達式,程序員相信在程序中的某個特定點該表達式值爲真。能夠在任什麼時候候啓用和禁用斷言驗證,所以能夠在測試時啓用斷言,而在部署時禁用斷言。一樣,程序投入運行後,最終用戶在遇到問題時能夠從新起用斷言。

斷言特性

前置條件斷言:代碼執行以前必須具有的特性

後置條件斷言:代碼執行以後必須具有的特性

先後不變斷言:代碼執行先後不能變化的特性

 

java基礎系列:

java基礎(一)java語法

java基礎(二)面向對象

java基礎(三)繼承/多態/接口

java基礎(四)經常使用類/算法

java基礎(五)集合/IO流/異常

java基礎(六)多線程/設計模式

java基礎(七)網絡編程/反射/動態代理

相關文章
相關標籤/搜索