1. 程式人生 > >Java基礎-初級(四)【陣列、常用類的使用】

Java基礎-初級(四)【陣列、常用類的使用】

目錄

 

4、陣列、常用類的使用

4.1 陣列

4.1.1 陣列建立的幾種方式

4.1.2 foreach 迴圈

4.1.3 多維陣列

4.1.4 Arrays類

4.1.5 陣列排序

4.1.5 Object類

4.1.6 String類

4.1.7 StringBuffer和Stringbuilder類

4.1.8  包裝類

4.1.9   Math類

4.1.10  Random類

4.1.11  System類

4.1.12  BigInteger、BigDecimal類

4.1.13  Date、DateFormat類


4、陣列、常用類的使用

4.1 陣列

所謂陣列,是有序的元素序列,用於儲存不同或相同型別的資料或引用物件。

4.1.1 陣列建立的幾種方式

宣告:

dataType[] arrayRefVar; // 首選的方法 

dataType arrayRefVar[]; // 效果相同,但不是首選方法

建立:

dataType[] arrayRefVar= new dataType[size]

dataType[] arrayRefVar = {value0, value1, ..., valuek};

dataType[] arrayRefVar= new dataType[]{value0, value1, ..., valuek}

在Java中允許長度為0的陣列,所以在編寫一個結果是陣列的方法時,如果返回結果是空,可以建立長度為0的陣列【new type[0]】

4.1.2 foreach 迴圈

JDK 1.5 引進了一種新的迴圈型別,被稱為 foreach 迴圈或者加強型迴圈,它能在不使用下標的情況下遍歷陣列。

public class TestArray {
   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};
 
      // 列印所有陣列元素
      for (double element: myList) {
         System.out.println(element);
      }
   }
}

4.1.3 多維陣列

多維陣列可以看成是陣列的陣列,比如二維陣列就是一個特殊的一維陣列,其每一個元素都是一個一維陣列

String [][] = new String [3][4]   注意:定義陣列的時候,後面可以沒有數字,但是第一個陣列必須要說明是幾,也就是說可以

String [][] = new String [3][] 去使用

二維陣列可以看做為幾行幾列的一維陣列,以此類推,多維陣列(n)就是幾行幾列的(n-1)的陣列。

int a[][] = new int[2][3];

String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");

4.1.4 Arrays類

java.util.Arrays 類能方便地運算元組,它提供的所有方法都是靜態的。

具有以下功能(常用功能):

  • 給陣列賦值:通過 fill 方法。
  • 對陣列排序:通過 sort 方法,按升序。
  • 比較陣列:通過 equals 方法比較陣列中元素值是否相等。
  • 查詢陣列元素:通過 binarySearch 方法能對排序好的陣列進行二分查詢法操作。
  • 複製新的陣列:copyOf:複製出新的陣列,複製長度由 newLength 決定,長度可大於被複制陣列的長;copyOfRange:複製指定下標範圍內的值
  • 列印成字串:字串表示由陣列元素的列表組成,括在方括號( "[]" )中。 相鄰的元素由字元", " (逗號後跟一個空格)分隔開。 元素被轉換為字串由String.valueOf(short)。 返回"null"如果a是null。

4.1.5 陣列排序

1、氣泡排序

//1、氣泡排序規則:將資料的最大值放到最後,陣列的最後面就是水面,最大值依次浮出
public int[] bubbleSort(int[] arr){  
        for(int i = 0;i < arr.length;i++){  
            //比較兩個相鄰的元素  
            for(int j = 0;j < arr.length-i-1;j++){  
                if(arr[j] > arr[j+1]){  
                    int t = arr[j];  
                    arr[j] = arr[j+1];  
                    arr[j+1] = t;  
                }  
            }  
        }  
        return arr;  
    }  

2、直接選擇排序(選擇出迴圈中最小的,放到陣列的前面,與冒泡不同的是,它不是依次交換而是最後將位置交換)

public static void selectionSort(long[]arr){
        long temp = 0;
        for(int i=0;i<arr.length-1;i++){
            int min=i;
            for(int j=i;j<arr.length-1;j++){
                if(arr[min]>arr[j+1]){
                    min = j+1;
                }
            }
            if(min!=i){
                temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
    }

3、插入排序

 /**
     * 插入排序
     * 規則:與前面的值進行比較,插入到比自己小和大的中間
     * @param arr
     */
    public static void insertSort(long arr[]){
        long temp =0;
        for(int i=1;i<arr.length;i++){
            temp =arr[i];
            int j = i;
            while(j>0&&arr[j-1]>=temp){
                arr[j]=arr[j-1];
                j--;
            }
            arr[j] =temp;
        }

    }

4、二分法排序

 //二分查詢  
    public static int binarySearch(int array[],int low,int high,int temp)  
    {  
        int mid=0;  
        while(low<=high)  
        {  
            mid=(low+high)/2;  
            if(array[mid]<temp&&temp<=array[mid+1])  
                return (mid+1);  
            else if(array[mid]<temp)  
                low = mid + 1;  
            else  
                high = mid -1;  
        }  
        return high;  
    }  
      
    //二分排序  
    public static void binarySort(int array[],int size)  
    {  
        int i,j,k,temp;  
        for(i=1;i<size;i++)  
        {  
            temp=array[i];  
            if(array[i]<array[0])  
                k=0;  
            else  
                k = binarySearch(array,0,i,temp);  
              
            for(j=i;j>k;j--)  
            {  
                array[j]=array[j-1];  
            }  
            array[k]=temp;  
            System.out.println(Arrays.toString(array));  
        }  
    }  

4.1.5 Object類

Object類是所有類的超類,也是預設類。如果一個類沒有用extends明確指出繼承於某個類,那麼它預設繼承Object類。

可以使用Object型別的變數可以用於引用任何型別的變數。在Java中,只有基本型別不是物件,例如數值、字元、布林,但是他們的包裝類屬於繼承於Object類。

Object類的方法

 

返回型別 方法
protected Object clone()

建立並返回此物件的副本。

boolean equals(Object obj)

指示一些其他物件是否等於此。

protected void finalize()

當垃圾收集確定不再有對該物件的引用時,垃圾收集器在物件上呼叫該物件。

<?> getClass()

返回此 Object的執行時類。

int hashCode()

返回物件的雜湊碼值。

void notify()

喚醒正在等待物件監視器的單個執行緒。

void notifyAll()

喚醒正在等待物件監視器的所有執行緒。

String toString()

返回物件的字串表示形式。

void wait()

導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法。

void wait(long timeout)

導致當前執行緒等待,直到另一個執行緒呼叫 notify()方法或該物件的 notifyAll()方法,或者指定的時間已過。

void wait(long timeout, int nanos)

導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法,或者某些其他執行緒中斷當前執行緒,或一定量的實時時間。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.1.6 String類

String類代表字串。 Java程式中的所有字串文字(例如"abc" )都被實現為此類的例項。字串不變; 它們的值在建立後不能被更改。 字串緩衝區支援可變字串。 因為String物件是不可變的,它們可以被共享。 例如:String str = "abc"。

String類的不可繼承

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

String的成員變數

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;

/**
 * Class String is special cased within the Serialization Stream Protocol.
 *
 * A String instance is written into an ObjectOutputStream according to
 * <a href="{@docRoot}/../platform/serialization/spec/output.html">
 * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
 */
private static final ObjectStreamField[] serialPersistentFields =
    new ObjectStreamField[0];

 從原始碼看出String底層使用一個字元陣列來維護的。

 建立字串的兩種方式:

1、String str =“abc”

2、String str= new String("abc");

第一種方式:在記憶體堆中直接開闢一個記憶體,並進入物件池。

第二種方式:現在記憶體中開闢一塊記憶體,建立“abc”,然後new 的時候又開闢了一塊記憶體,前一塊記憶體中匿名物件變成了垃圾。

綜上:一般都使用第一種方式,只開闢一塊記憶體,並且入池。

String的不可變:

String因為是final修飾,所以值不可變。當然我們可以修改當前物件引用的地址,例如

String str =“abc”

str = “345”;

現在str確實為“345”,但是記憶體中還存在著“abc”,所以使用String時,總是變化的話,會很佔記憶體,推薦使用StringBuffer來拼接字串。

不可變優點:

  • 方便做hash中的key
  • String pool的需要
  • 安全性
  • 執行緒安全

String使用的設計模式

亨元模式

一個系統中如果有多處用到了相同的一個元素,那麼我們應該只儲存一份此元素,而讓所有地方都引用這一個元素,Java中String部分就是根據享元模式設計的,而那個儲存元素的地方就叫做“字串常量池 - String Pool

構造方法:

方法 解釋
String(byte[] bytes)  通過使用平臺的預設字符集解碼指定的位元組陣列來構造新的 String
String(byte[] bytes, Charset charset) 構造一個新的String由指定用指定的位元組的陣列解碼charset
String(byte[] bytes, int offset, int length) 通過使用平臺的預設字符集解碼指定的位元組子陣列來構造新的 String
String(char[] value, int offset, int count) 分配一個新的 String ,其中包含字元陣列引數的子陣列中的字元。
String(StringBuffer buffer) 分配一個新的字串,其中包含當前包含在字串緩衝區引數中的字元序列。

成員方法:

返回型別 方法名稱
char charAt(int index)

返回 char指定索引處的值。

int codePointAt(int index)

返回指定索引處的字元(Unicode程式碼點)。

int codePointBefore(int index)

返回指定索引之前的字元(Unicode程式碼點)。

int codePointCount(int beginIndex, int endIndex)

返回此 String指定文字範圍內的Unicode程式碼點數。

int compareTo(String anotherString)

按字典順序比較兩個字串。

int compareToIgnoreCase(String str)

按字典順序比較兩個字串,忽略病例差異。

String concat(String str)

將指定的字串連線到該字串的末尾。

boolean contains(CharSequence s)

當且僅當此字串包含指定的char值序列時才返回true。

boolean contentEquals(CharSequence cs)

將此字串與指定的CharSequence進行 CharSequence

boolean contentEquals(StringBuffer sb)

將此字串與指定的StringBuffer進行 StringBuffer

static String copyValueOf(char[] data)

相當於 valueOf(char[])

static String copyValueOf(char[] data, int offset, int count)

相當於 valueOf(char[], int, int)

boolean endsWith(String suffix)

測試此字串是否以指定的字尾結尾。

boolean equalsIgnoreCase(String anotherString)

將此 String與其他 String比較,忽略案例注意事項。

static String format(Locale l, String format, Object... args)

使用指定的區域設定,格式字串和引數返回格式化的字串。

static String format(String format, Object... args)

使用指定的格式字串和引數返回格式化的字串。

byte[] getBytes()

使用平臺的預設字符集將此 String編碼為位元組序列,將結果儲存到新的位元組陣列中。

byte[] getBytes(Charset charset)

使用給定的charset將該String編碼為位元組序列,將結果儲存到新的位元組陣列中。

void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)已棄用

此方法無法將字元正確轉換為位元組。 從JDK 1.1開始,首選的方法是通過getBytes()方法,該方法使用平臺的預設字符集。

byte[] getBytes(String charsetName)

使用命名的字符集將此 String編碼為位元組序列,將結果儲存到新的位元組陣列中。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

將此字串中的字元複製到目標字元陣列中。

int hashCode()

返回此字串的雜湊碼。

int indexOf(int ch)

返回指定字元第一次出現的字串內的索引。

int indexOf(int ch, int fromIndex)

返回指定字元第一次出現的字串內的索引,以指定的索引開始搜尋。

int indexOf(String str)

返回指定子字串第一次出現的字串內的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出現的字串中的索引,從指定的索引開始。

boolean isEmpty()

返回 true如果,且僅當 length()0

int lastIndexOf(int ch)

返回指定字元的最後一次出現的字串中的索引。

int lastIndexOf(int ch, int fromIndex)

返回指定字元的最後一次出現的字串中的索引,從指定的索引開始向後搜尋。

int lastIndexOf(String str)

返回指定子字串最後一次出現的字串中的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字串的最後一次出現的字串中的索引,從指定索引開始向後搜尋。

boolean matches(String regex)

告訴這個字串是否匹配給定的 regular expression

String replace(char oldChar, char newChar)

返回從替換所有出現的導致一個字串 oldChar在此字串 newChar

String replace(CharSequence target, CharSequence replacement)

將與字面目標序列匹配的字串的每個子字串替換為指定的字面替換序列。

String replaceAll(String regex, String replacement)

用給定的替換替換與給定的 regular expression匹配的此字串的每個子字串。

String[] split(String regex)

將此字串分割為給定的 regular expression的匹配。

String[] split(String regex, int limit)

將這個字串拆分為給定的 regular expression的匹配。

boolean startsWith(String prefix)

測試此字串是否以指定的字首開頭。

boolean startsWith(String prefix, int toffset)

測試在指定索引處開始的此字串的子字串是否以指定的字首開頭。

CharSequence subSequence(int beginIndex, int endIndex)

返回一個字元序列,該序列是該序列的子序列。

String substring(int beginIndex)

返回一個字串,該字串是此字串的子字串。

String substring(int beginIndex, int endIndex)

返回一個字串,該字串是此字串的子字串。

char[] toCharArray()

將此字串轉換為新的字元陣列。

String toLowerCase()

將所有在此字元 String使用預設語言環境的規則,以小寫。

String toLowerCase(Locale locale)

將所有在此字元 String ,以降低使用給定的規則情況下 Locale

String toUpperCase()

將所有在此字元 String使用預設語言環境的規則大寫。

String toUpperCase(Locale locale)

將所有在此字元 String使用給定的規則,大寫 Locale

String trim()

返回一個字串,其值為此字串,並刪除任何前導和尾隨空格。

static String valueOf(boolean b)

返回 boolean引數的字串 boolean形式。

static String valueOf(Object obj)

返回 Object引數的字串 Object形式。

4.1.7 StringBuffer和Stringbuilder

 當對字串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。和 String 類不同的是,StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。

由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程式要求執行緒安全的情況下,則必須使用 StringBuffer 類。

StringBuffer和Stringbuilder的成員方法

返回值 方法名稱
StringBuffer append(boolean b)

boolean引數的字串表示附加到序列中。

StringBuffer append(Object obj)

追加 Object引數的字串表示。

StringBuffer append(StringBuffer sb)

將指定 StringBuffer這個序列。

StringBuffer appendCodePoint(int codePoint)

codePoint引數的字串表示法附加到此序列。

int capacity()

返回當前容量。

char charAt(int index)

返回 char在指定索引在這個序列值。

StringBuffer delete(int start, int end)

刪除此序列的子字串中的字元。

StringBuffer deleteCharAt(int index)

刪除 char在這個序列中的指定位置。

int indexOf(String str)

返回指定子字串第一次出現的字串內的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出現的字串中的索引,從指定的索引開始。

StringBuffer insert(int offset, boolean b)

在此序列中插入 boolean引數的字串表示形式。

int lastIndexOf(String str)

返回指定子字串最右邊出現的字串內的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字串最後一次出現的字串中的索引。

StringBuffer replace(int start, int end, String str)

用指定的String中的字元替換此序列的子字串中的 String

StringBuffer reverse()

導致該字元序列被序列的相反代替。

String substring(int start)

返回一個新的 String ,其中包含此字元序列中當前包含的字元的子序列。

String substring(int start, int end)

返回一個新的 String ,其中包含此序列中當前包含的字元的子序列。

面試題:

String 、StringBuffer、StringBuilder的區別?

  1. 相同點:String、StringBuff 與 StringBuilder 都可以對字串進行操作。

  2. 字串操作效率上看 StringBuilder >  StringBuffer  >  String

  3. 效率的區別分析:

    • String 在設計的時候處於安全和效能的考慮,設定為 final 修飾,長度不可變,每次在常量池新增一個字串都是重新 new 一個物件,原來的物件沒有引用後等待 GC 回收,所以效率比較慢。
    • StringBuilder 和 StringBuffer 都是可變長度的字串,都繼承了 AbstractStringBuilder 。那麼造成它們使用區別的原因分析原始碼可以知道。StringBuffer 的方法都加了 synchronized 同步鎖,代表執行緒安全。而StringBuilder 則沒有加鎖,所以 StirngBuilder 的效率要優於 StirngBuffer。
  4. 使用總結:

    1. 如果要操作少量的資料用 = String
    2. 單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder(執行緒非安全)
    3. 多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer(有buff就是安全,這個是執行緒安全的)
  5. 最後使用時可以指定StringBuffer的初始化長度,因為預設長度為16,超出後新建陣列,將前面的陣列複製過來,避免自動增長來提高效能。

4.1.8  包裝類

概念:

包裝類(Wrapper Class): Java是一個面向物件的程式語言,但是Java中的八種基本資料型別卻是不面向物件的,為了使用方便和解決這個不足,在設計類時為每個基本資料型別設計了一個對應的類進行代表,這樣八種基本資料型別對應的類統稱為包裝類(Wrapper Class),包裝類均位於java.lang包。、

 包裝類與基本型別的對應關係:

  • char —> Character
  • boolean —> Boolean
  • byte—> Byte
  • short—> Short
  • long—> Long
  • int —> Integer
  • float—> Float
  • double—> Double

下面學習平時開發使用較多的方法

Character類

序號 方法與描述
1 isLetter()
是否是一個字母
2 isDigit()
是否是一個數字字元
3 isWhitespace()
是否是一個空格
4 isUpperCase()
是否是大寫字母
5 isLowerCase()
是否是小寫字母
6 toUpperCase()
指定字母的大寫形式
7 toLowerCase()
指定字母的小寫形式
8 toString()
返回字元的字串形式,字串的長度僅為1

抽象類 Number 是父類,Number 的子類必須提供將表示的數值轉換 成 byte、double/float/long/int/short 的方法。Number 類的方法被 Number 的各子類所實現,常用方法如下:

Number 類的方法

方法 返回值 功能描述
byteValue() byte 以 byte 形式返回指定的數值
intValue() int 以 int 形式返回指定的數值
floatValue() float 以 float 形式返回指定的數值
shortValue() short 以 short 形式返回指定的數值
longValue() long 以 long 形式返回指定的數值
doubleValue() double 以 double 形式返回指定的數值

4.1.9   Math類

Math類包含執行基本數字運算的方法,如基本指數,對數,平方根和三角函式。

返回值 方法名稱
static double abs(double a)

返回值為 double絕對值。

static float abs(float a)

返回 float值的絕對值。

static double acos(double a)

返回值的反餘弦值; 返回的角度在0.0到pi的範圍內。

static double floor(double a)

返回小於或等於引數的最大(最接近正無窮大) double值,等於一個數學整數。

static double max(double a, double b)

返回兩個 double值中的較大值。

static float max(float a, float b)

返回兩個 float的較大值。

static float min(float a, float b)

返回兩個 float的較小值。

static double pow(double a, double b)

將第一個引數的值返回到第二個引數的冪。

static double random()

返回值為 double值為正號,大於等於 0.0 ,小於 1.0

static double rint(double a)

返回與引數最接近值的 double值,並且等於數學整數。

static long round(double a)

返回引數中最接近的 long ,其中 long四捨五入為正無窮大。

4.1.10  Random類

random類用於生成隨機數的類。許多應用程式會發現方法Math.random()使用起來更簡單。

返回值 方法
DoubleStream doubles()

返回一個有效的無限流的偽隨機 double值,每個值在零(包括)和一(獨佔)之間。

IntStream ints()

返回一個有效的無限流的偽 int值。

IntStream ints(int randomNumberOrigin, int randomNumberBound)

返回一個有效的無限流偽 intint ,每個值都符合給定的起始(包括)和繫結(排他)。

protected int next(int bits)

生成下一個偽隨機數。

boolean nextBoolean()

返回下一個偽隨機數,從這個隨機數發生器的序列中均勻分佈 boolean值。

void nextBytes(byte[] bytes)

生成隨機位元組並將它們放入使用者提供的位元組陣列中。

double nextDouble()

返回下一個偽隨機數,從這個隨機數發生器的序列中 0.01.0之間的 double0.0分佈。

float nextFloat()

返回下一個偽隨機數,從這個隨機數發生器的序列中 0.01.0之間的 float0.0分佈。

double nextGaussian()

從該隨機數發生器的序列返回下一個偽隨機數,高斯(“正”)分佈 double值,平均值為 0.0 ,標準差為 1.0

int nextInt()

返回下一個偽隨機數,從這個隨機數發生器的序列中均勻分佈 int值。

int nextInt(int bound)

返回偽隨機的,均勻分佈 int值介於0(含)和指定值(不包括),從該隨機數生成器的序列繪製。

long nextLong()

返回下一個偽,均勻分佈 long從這個隨機數生成器的序列值。

void setSeed(long seed)

使用單個 long種子設定該隨機數生成器的種子。

4.1.11  System類

System類提供的System包括標準輸入,標準輸出和錯誤輸出流; 訪問外部定義的屬性和環境變數; 一種載入檔案和庫的方法; 以及用於快速複製陣列的一部分的實用方法。

返回值 方法
static long currentTimeMillis()

返回當前時間(以毫秒為單位)。

static void exit(int status)

終止當前執行的Java虛擬機器。

static void gc()

執行垃圾回收器。

static Map<String,String> getenv()

返回當前系統環境的不可修改的字串對映檢視。

static String getenv(String name)

獲取指定環境變數的值。

static Properties getProperties()

確定當前的系統屬性。

static String getProperty(String key)

獲取指定鍵指示的系統屬性。

static String getProperty(String key, String def)

獲取指定鍵指示的系統屬性。

static SecurityManager getSecurityManager()

獲取系統安全介面。

static void setSecurityManager(SecurityManager s)

設定系統安全性。

4.1.12  BigInteger、BigDecimal

一般來說,BigInteger用的不是很多,BigDecimal用的稍微多一點,就比如說JDBC中,如果一個欄位的資料庫型別是Number, 那麼getObject().getClass()的結果是java.math.BigDecimal

BigInteger相比Integer的確可以用big來形容。它是用於科學計算,Integer只能容納一個int, 所以最大值也就是2的31次訪減去1,十進位制為2147483647,如果需要計算更大的數,那麼31位顯然是不夠用了,BigInteger能夠容納的位數那可就大了,理論上可以無限大。除了容量大之外,BigInteger還封裝了一些常見的操作,比如+-*/的基本操作,還有絕對值,相反數,最大公約數,是否是質數等等的運算。

4.1.13  Date、DateFormat類

java.util.Date

返回值 方法
boolean after(