Java從入門到高級(第一天)


大學本科階段我僅僅選修了Java這門課

感覺學業不精

所以會更新我的blog來督促自己更好地掌握Java

開啓小白的高級開發之路


目錄

1. Object類

1.1 toString方法

1.2 equals方法

1.3 String類中的equals方法與Object類中的equals方法的不同點

 1.4 StringBuilder類與String類的區別

 2. 時間日期類

2.1 Date類

2.2 DateFormat類

2.3 Calendar類

3. System類

3.1 currentTimeMillis方法

3.2 arraycopy方法

4. StringBuilder類

5. 包裝類

6. Collection集合

7. Iterator迭代器

7.1 Iterator接口

7.2 增強for

8. 泛型

8.1 泛型的定義

8.2 泛型通配符

8.3 受限泛型


 

1. Object類

 java.lang.Object 類是Java語言中的根類,即所有類的父類。它中描述的所有方法子類都可以使用。在對象實例化的時候,最終找的父類就是 Object 。 如果一個類沒有特別指定父類,那麼默認則繼承自 Object 類。

其中重要的兩個方法爲:

  •  public String toString() :返回該對象的字符串表示。

  •  public boolean equals(Object obj) :指示其他某個對象是否與此對象“相等”。


1.1 toString方法

 public String toString() :返回該對象的字符串表示。

 toString 方法返回該對象的字符串表示,其實該字符串內容就是對象的類型+@+內存地址值。

由於 toString 方法返回的結果是內存地址,而在開發中,經常需要按照對象的屬性得到相應的字符串表現形式,因此也需要重寫它。

IntelliJ IDEA中,可以點擊 Code 菜單中的 Generate... ,也可以使用快捷鍵 alt+insert ,點擊 toString() 選項。選擇需要包含的成員變量並確定。

代碼實現:覆蓋重寫 toString 方法:

public class Person {  
    private String name;
    private int age;

    // 覆蓋重寫toString方法
    @Override
    public String toString() {
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}

1.2 equals方法

 public boolean equals(Object obj) :指示其他某個對象是否與此對象“相等”。

調用成員方法 equals 並指定參數爲另一個對象,則可以判斷這兩個對象是否是相同的。這裏的“相同”有默認和自定義兩種方式。

  1. 默認地址比較:如果沒有覆蓋重寫 equals 方法,那麼 Object 類中默認進行==運算符的對象地址比較,只要不是同一個對象,結果必然爲false。;
  2. 對象內容比較:如果希望進行對象的內容比較,即所有或指定的部分成員變量相同就判定兩個對象相同,則可以覆蓋重寫 equals 方法。

IntelliJ IDEA中,可以使用 Code 菜單中的 Generate… 選項,也可以使用快捷鍵 alt+insert ,並選擇 equals() and hashCode() 進行自動代碼生成。

代碼實現:覆蓋重寫 equals 方法:

public class Person {	
	private String name;
	private int age;
	
    // 覆蓋重寫equals方法
    @Override
    public boolean equals(Object o) {
        // 如果對象地址一樣,則認爲相同
        if (this == o)
            return true;
        
        // 如果參數爲空,或者類型信息不一樣,則認爲不同
        if (o == null || getClass() != o.getClass())
            return false;
        
        // 轉換爲當前類型
        Person person = (Person) o;
        
        // 要求基本類型相等,並且將引用類型交給java.util.Objects類的equals靜態方法取用結果
        return age == person.age && Objects.equals(name, person.name);
    }
}

1.3 String類中的equals方法與Object類中的equals方法的不同點

 String 類中的 equals 方法是用來判斷兩個對象的內容是否相同,而 Object 類中的 equals 方法是用來判斷兩個對象是否是同一個對象,所謂同一個對象指的是內存中的同一塊存儲空間。


 1.4 StringBuilder類與String類的區別

 String 類的對象內容不可改變,所以每當進行字符串拼接時,總是會在內存中創建一個新的對象,所以經常改變內容的字符串最好不要用 String ,因爲每次生成對象都會對系統性能產生影響。

 StringBuilder 又稱爲可變字符序列,是JDK5.0中新增加的一個類,它是一個類似於 String 的字符串緩衝區,通過某些方法調用可以改變該序列的長度和內容。即它是一個容器,容器中可以裝很多字符串,並且能夠對其中的字符串進行各種操作。它的內部擁有一個數組用來存放字符串內容,進行字符串拼接時,直接在數組中加入新內容, StringBuilder 會自動維護數組的擴容。


 2. 時間日期類

2.1 Date類

 java.util.Date 類 表示特定的瞬間,精確到毫秒。

繼續查閱 Date 類的描述,發現 Date 擁有多個構造函數,只是部分已經過時,但是其中有未過時的構造函數可以把毫秒值轉成日期對象。

  •  public Date() :分配 Date 對象並初始化此對象,以表示分配它的時間(精確到毫秒)。

  •  public Date(long date) :分配Date對象並初始化此對象,以表示自從標準基準時間(稱爲“曆元(epoch)”,即1970年1月1日00:00:00 GMT)以來的指定毫秒數。

  •  public long getTime() : 把日期對象轉換成對應的時間毫秒值。

代碼實現:獲取當前的日期,並把這個日期轉換爲指定格式的字符串:

public class DateTest {
    public static void main(String[] args) {
        //獲取當前日期對象 now;
        Date now = new Date();
        
        //創建SimpleDateFormat對象 df,並制定日期格式
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        //調用df的format(Date  date) 方法,傳入now; 接收返回的字符串
        String datestr = df.format(now);
        System.out.println(datestr);
    }
}

2.2 DateFormat類

 java.text.DateFormat  是日期/時間格式化子類的抽象類,我們通過這個類可以幫我們完成日期和文本之間的轉換,也就是可以在 Date 對象與 String 對象之間進行來回轉換。

  • 格式化:按照指定的格式,從 Date 對象轉換爲 String 對象。

  • 解析:按照指定的格式,從 String 對象轉換爲 Date 對象。

由於 DateFormat 爲抽象類,不能直接使用,所以需要常用的子類 java.text.SimpleDateFormat 。這個類需要一個模式(格式)來指定格式化或解析的標準。構造方法爲:

  •  public SimpleDateFormat(String pattern) :用給定的模式和默認語言環境的日期格式符號構造 SimpleDateFormat ,參數 pattern 是一個字符串,代表日期時間的自定義格式。

  •  public String format(Date date) :將 Date 對象格式化爲字符串。

  •  public Date parse(String source) :將字符串解析爲 Date 對象。

常用的格式規則爲:

標識字母(區分大小寫) 含義
y
M
d
H
m
s

代碼實現:使用 SimpleDateFormat 類,把2020-03-16轉換爲20200316日:

public class DateFormatTest {
    public static void main(String[] args) throws ParseException {
        //創建SimpleDateFormat對象df1,指定日期模式爲yyyy-MM-dd
        SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
        
        //調用df1的parse(String str)方法傳入2020-03-16,得到對應日期類型
        Date date = df1.parse("2020-03-16");
       
        //創建日期格式化對象df2,在獲取格式化對象時可以指定風格
        DateFormat df2 = new SimpleDateFormat("yyyy年MM月dd日");
        
        //調用df2的format(Date date) 傳入剛纔轉換的日期
        String str = df2.format(date);
        System.out.println(str);
    }
}

2.3 Calendar類

 java.util.Calendar 是日曆類,在 Date 後出現,替換掉了許多 Date 的方法。該類將所有可能用到的時間信息封裝爲靜態成員變量,方便獲取。日曆類就是方便獲取各個時間屬性的。

 Calendar 爲抽象類,由於語言敏感性, Calendar 類在創建對象時並非直接創建,而是通過靜態方法創建,返回子類對象

  •  public static Calendar getInstance() :使用默認時區和語言環境獲得一個日曆

  •  public int get(int field) :返回給定日曆字段的值

  •  public void set(int field, int value) :將給定的日曆字段設置爲給定值

  •  public abstract void add(int field, int amount) :根據日曆的規則,爲給定的日曆字段添加或減去指定的時間量

  •  public Date getTime() :返回一個表示此 Calendar 時間值(從曆元到現在的毫秒偏移量)的 Date 對象

 Calendar 類中提供很多成員常量,代表給定的日曆字段:

字段值 含義
YEAR
MONTH 月(從0開始,可以+1使用)
DAY_OF_MONTH 月中的天(幾號)
HOUR 時(12小時制)
HOUR_OF_DAY 時(24小時制)
MINUTE
SECOND
DAY_OF_WEEK 週中的天(周幾,週日爲1,可以-1使用)

代碼實現:用程序判斷20200316日是星期幾:

public class CalendarTest {
    public static void main(String[] args) {
        //創建Calendar對象
        Calendar c = Calendar.getInstance();
        
        //將給定的日曆字段設置到Calendar對象中
        c.set(Calendar.YEAR, 2020);
        c.set(Calendar.MONTH, 03);
        c.set(Calendar.DATE, 16);
        
        //設置年、月、日、星期
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH)+1;
        int date = c.get(Calendar.DATE);
        char week = getWeek(c.get(Calendar.DAY_OF_WEEK));
        
        //輸出結果
        System.out.println(year+"年"+month+"月"+date+"日是星期"+week);
    }
    
    //定義方法,獲取星期漢字
    public static char getWeek(int a){
        char[] c = {' ','日','一','二','三','四','五','六'};
        return c[a];
    }
}

3. System類

 java.lang.System 類中提供了大量的靜態方法,可以獲取與系統相關的信息或系統級操作,常用的方法有:

  •  public static long currentTimeMillis() :返回以毫秒爲單位的當前時間。

  •  public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :將數組中指定的數據拷貝到另一個數組中。


3.1 currentTimeMillis方法

用法: currentTimeMillis 就是:獲取當前系統時間與1970010100:00之間的毫秒差值 。


3.2 arraycopy方法

 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :將數組中指定的數據拷貝到另一個數組中。

 System.arraycopy 方法具有5個參數,含義分別爲:

參數序號 參數名稱 參數類型 參數含義
1 src Object 源數組
2 srcPos int 源數組索引起始位置
3 dest Object 目標數組
4 destPos int 目標數組索引起始位置
5 length int 複製元素個數

4. StringBuilder類

 java.lang.StringBuilder 的API, StringBuilder 又稱爲可變字符序列,它是一個類似於 String 的字符串緩衝區,通過某些方法調用可以改變該序列的長度和內容。

 StringBuilder 是個字符串的緩衝區,即它是一個容器,容器中可以裝很多字符串。並且能夠對其中的字符串進行各種操作。

它的內部擁有一個數組用來存放字符串內容,進行字符串拼接時,直接在數組中加入新內容。 StringBuilder 會自動維護數組的擴容。

  •  public StringBuilder() :構造一個空的 StringBuilder 容器。

  •  public StringBuilder(String str) :構造一個 StringBuilder 容器,並將字符串添加進去。

  •  public StringBuilder append(...) :添加任意類型數據的字符串形式,並返回當前對象自身。

  •  public String toString() :將當前 StringBuilder 對象轉換爲 String 對象。


5. 包裝類

Java提供了兩個類型系統,基本類型與引用類型,使用基本類型在於效率,然而很多情況,會創建對象使用,因爲對象可以做更多的功能,如果想要我們的基本類型像對象一樣操作,就可以使用基本類型對應的包裝類,如下:

基本類型 對應的包裝類(位於java.lang包中)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
  • 裝箱:從基本類型轉換爲對應的包裝類對象。

  • 拆箱:從包裝類對象轉換爲對應的基本類型。

除了Character類之外,其他所有包裝類都具有parseXxx靜態方法可以將字符串參數轉換爲對應的基本類型:

  •  public static byte parseByte(String s) :將字符串參數轉換爲對應的 byte 基本類型。

  •  public static short parseShort(String s) :將字符串參數轉換爲對應的 short 基本類型。

  •  public static int parseInt(String s) :將字符串參數轉換爲對應的 int 基本類型。

  •  public static long parseLong(String s) :將字符串參數轉換爲對應的 long 基本類型。

  •  public static float parseFloat(String s) :將字符串參數轉換爲對應的 float 基本類型。

  •  public static double parseDouble(String s) :將字符串參數轉換爲對應的 double 基本類型。

  •  public static boolean parseBoolean(String s) :將字符串參數轉換爲對應的 boolean 基本類型。


6. Collection集合

集合按照其存儲結構可以分爲兩大類,分別是單列集合 java.util.Collection 和雙列集合 java.util.Map 。

  Collection  :單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是 java.util.List java.util.Set 。其中, List 的特點是元素有序、元素可重複。 Set 的特點是元素無序,而且不可重複。 List 接口的主要實現類有 java.util.ArrayList java.util.LinkedList Set 接口的主要實現類有 java.util.HashSet java.util.TreeSet

 Collection 是所有單列集合的父接口,因此在 Collection 中定義了單列集合( List Set )通用的一些方法,這些方法可用於操作所有的單列集合。方法如下:

  •  public boolean add(E e) : 把給定的對象添加到當前集合中 。

  •  public void clear() :清空集合中所有的元素。

  •  public boolean remove(E e) : 把給定的對象在當前集合中刪除。

  •  public boolean contains(E e) : 判斷當前集合中是否包含給定的對象。

  •  public boolean isEmpty() : 判斷當前集合是否爲空。

  •  public int size() : 返回集合中元素的個數。

  •  public Object[] toArray() : 把集合中的元素,存儲到數組中。

代碼實現: Collection 集合數組轉集合:

public class CollectionTest {
    public static void main(String[] args) {
        //定義int數組
        int[] arr = {1,2,3,4,5};
        ArrayList<Integer> list = listTest(arr);
        System.out.println(list);
    }

    public static ArrayList<Integer> listTest(int[] arr) {
        //定義集合
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        //遍歷數組,把元素依次添加到集合當中
        for (int a : arr) {
            list.add(a);
        }
        return list;
    }
}

7. Iterator迭代器

當遍歷集合時,首先通過調用集合的 Iterator() 方法獲得迭代器對象,然後使用 hasNext() 方法判斷集合中是否存在下一個元素,如果存在,則調用 next() 方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。

 Iterator 迭代器對象在遍歷集合時,內部採用指針的方式來跟蹤集合中的元素,在調用 Iterator next() 方法之前,迭代器的索引位於第一個元素之前,不指向任何元素,當第一次調用迭代器的 next() 方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次調用 next() 方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到 hasNext() 方法返回false,表示到達了集合的末尾,終止對元素的遍歷。


7.1 Iterator接口

 Iterator 接口也是Java集合中的一員,但它與 Collection Map 接口有所不同, Collection 接口與 Map 接口主要用於存儲元素,而 Iterator 主要用於迭代訪問(即遍歷) Collection 中的元素,因此 Iterator 對象也被稱爲迭代器。

  •  public Iterator iterator() : 獲取集合對應的迭代器,用來遍歷集合中的元素的。

  •  public E next() :返回迭代的下一個元素。

  •  public boolean hasNext() :如果仍有元素可以迭代,則返回 true

代碼實現:使用 iterator 迭代集合中元素:

public class IteratorDemo {
  	public static void main(String[] args) {
        // 使用多態方式創建對象
        Collection<String> col = new ArrayList<String>();

        // 添加元素到集合
        col.add("玩家1");
        col.add("玩家2");
        col.add("玩家3");
        
        // 使用迭代器遍歷
        Iterator<String> it = col.iterator();
        
        // 判斷是否有迭代元素
        while(it.hasNext()){ 
            //獲取迭代出的元素
            String s = it.next();
            System.out.println(s);
        }
    }
}

7.2 增強for

增強 for 循環(也稱 for each 循環)是JDK1.5以後出來的一個高級 for 循環,專門用來遍歷數組和集合的。它的內部原理其實是個 iterator 迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。它用於遍歷 Collection 和數組。通常只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。

// 基本格式
for(元素的數據類型  變量 : Collection集合or數組){ 
  	// 代碼
}

8. 泛型

在學習集合時,我們都知道集合中是可以存放任意對象的,只要把對象存儲集合後,那麼這時他們都會被提升成 Object 類型。當我們在取出每一個對象,並且進行相應的操作,這時必須採用類型轉換。

泛型:可以在類或方法中預支地使用未知的類型。 好處是:將運行時期的 ClassCastException ,轉移到了編譯時期變成了編譯失敗;避免了類型強轉的麻煩。


8.1 泛型的定義

定義常見幾種格式:

// 1.定義和使用含有泛型的類
修飾符 class 類名<代表泛型的變量> {  }

// 舉例:ArrayList集合
class ArrayList<E>{ 
    public boolean add(E e){ }

    public E get(int index){ }
   	....
}

// 2.定義和使用含有泛型的方法
修飾符 <代表泛型的變量> 返回值類型 方法名(參數){  }

// 舉例
public class MyMethod {	  
    public <MVP> void show(MVP mvp) {
    	System.out.println(mvp.getClass());
    }
    
    public <MVP> MVP show2(MVP mvp) {	
    	return mvp;
    }
}

// 3.含有泛型的接口
修飾符 interface接口名<代表泛型的變量> {  }

// 舉例
public interface MyInterface<E>{
	public abstract void add(E e);
	
	public abstract E getE();  
}

8.2 泛型通配符

當使用泛型類或者接口時,傳遞的數據中,泛型類型不確定,可以通過通配符 <?> 表示。但是一旦使用泛型的通配符後,只能使用 Object 類中的共性方法,集合中元素自身方法無法使用。

泛型的通配符:不知道使用什麼類型來接收的時候,此時可以使用?,?表示未知通配符。此時只能接受數據,不能往該集合中存儲數據。


8.3 受限泛型

泛型的上限

  • 格式:類型名稱<? extends 類 > 對象名稱

  • 意義:只能接受該類型以及子類

泛型的下限

  • 格式:類型名稱<? super 類 > 對象名稱

  • 意義:只能接受改類型及其父類型


 

歡迎關注博主,歡迎互粉,一起學習!

感謝您的閱讀,不足之處歡迎指正!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章