大學本科階段我僅僅選修了Java這門課
感覺學業不精
所以會更新我的blog來督促自己更好地掌握Java
開啓小白的高級開發之路
目錄
1.3 String類中的equals方法與Object類中的equals方法的不同點
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
並指定參數爲另一個對象,則可以判斷這兩個對象是否是相同的。這裏的“相同”有默認和自定義兩種方式。
- 默認地址比較:如果沒有覆蓋重寫
equals
方法,那麼Object
類中默認進行==
運算符的對象地址比較,只要不是同一個對象,結果必然爲false。; - 對象內容比較:如果希望進行對象的內容比較,即所有或指定的部分成員變量相同就判定兩個對象相同,則可以覆蓋重寫
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轉換爲2020年03月16日:
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使用) |
代碼實現:用程序判斷2020年03月16日是星期幾:
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
就是:獲取當前系統時間與1970年01月01日00: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 類 > 對象名稱
-
意義:只能接受改類型及其父類型
歡迎關注博主,歡迎互粉,一起學習!
感謝您的閱讀,不足之處歡迎指正!