Java学习笔记2——常用类
目錄
- 1 內部類
- 1.1 成員內部類
- 1.2 靜態內部類
- 1.3 局部內部類
- 1.4 匿名內部類
- 2 Object類
- 2.1 getClass()方法
- 2.2 hashCode()方法
- 2.3 toSring()方法
- 2.4 equals()方法
- 2.5 finalize()方法
- 3 包裝類
- 3.1 類型轉換與裝箱、拆箱
- 3.2 整數緩沖區
- 4 String類
- 4.1 常用方法
- 4.2 可變字符串
- 5 BigDecimal類
- 6 時間類型
- 6.1 Date類
- 6.2 Calendar類
- 6.3 SimpleDateFormat類
- 6.4 System類
1 內部類
- 成員內部類
- 靜態內部類
- 局部內部類
- 匿名內部類
內部類特點:
1.編譯之后會生成獨立的字節碼文件
2.內部類可直接訪問外部類的私有成員,而不破壞封裝
3.內部類可以為外部類提供必要的內部功能組件
1.1 成員內部類
在類的內部定義,與實例變量、實例方法同級別的類。
創建內部類對象時,必須依賴外部類對象。
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
或者一步到位:Outer.Inner inner = new Outer().new Inner();
當外部類、內部類存在同名屬性時,會優先訪問內部類屬性。如果需要調用外部類屬性,需要使用Outer.this.屬性
成員內部類不能定義靜態成員,但是可以定義靜態常量。
1.2 靜態內部類
不依賴外部類對象,可直接創建或通過類名訪問,可聲明靜態成員。(相當于外部類)
直接創建靜態內部類對象:
Outer.Inner Inner = new Outer.Inner();注意new Outer后面沒有括號,即沒有創建對象,表明Outer和Inner只是包含關系。
只有靜態內部類才能被static修飾,普通類不能被static修飾。
靜態內部類調用外部類對象的屬性需要使用Outer.屬性。
靜態內部類自己的的屬性和方法直接調用。
1.3 局部內部類
定義在外部類方法中,作用范圍和創建對象范圍僅限于當前方法。
不能加任何訪問修飾符。
如果需要在其他普通類調用局部內部類里面的方法(方法2),要在外部類的包含了局部內部類的局部方法(方法1)中創建局部內部類對象:
class Outer{方法1(){class Inner{方法2(){}}Inner inner = new Inner();inner.方法2(); } } class OtherClass{Outer outer = new Outer();outer.方法1();//這樣就可以調用到方法2了 }局部內部類訪問外部類當前方法中的局部變量時,因無法保障變量的生命周期與自身相同,變量必須修飾為final。
訪問局部變量 jdk1.7要求局部方法中的變量必須為常量final、jdk1.8自動添加final修飾(只是不顯示而已)
1.4 匿名內部類
沒有類名的局部內部類(一切特征都與局部內部類相同)。
必須繼承一個父類或者實現一個接口。
定義類、實現類、創建對象的語法合并,只能創建一個該類的對象。
優點:減少代碼量;缺點:可讀性較差。
// 使用匿名內部類優化(相當于創建了一個局部內部類) Usb usb = new Usb(){ // Usb為一個接口/抽象類/父類(多態)@Overridepublic void service(){sout("連接電腦成功,fan開始工作")} }; usb.service();2 Object類
- 超類、基類,所有類的直接或間接父類,位于繼承樹的最頂層
- 任何類,如沒有書寫extends顯示繼承某個類,都默認直接繼承Object類,否則為間接繼承
- Object類中所定義的方法,是所有對象都具備的方法
- Object類型可以存儲任何對象
作為參數,可接受任何對象
作為返回值,可返回任何對象
2.1 getClass()方法
public final Class<?> getClass(){}返回引用中存儲的實際對象類型。
應用:通常用于判斷兩個引用中實際存儲對象類型是否一致。
2.2 hashCode()方法
public int hashCode(){}返回該對象的哈希碼值。
哈希值根據對象的地址或字符串或數字使用hash算法計算出來的int類型的值。
一般情況下相同對象返回相同哈希碼。
2.3 toSring()方法
public String toSring(){}返回該對象的字符串表示(表現形式)
可以根據程序需求覆蓋該方法,如:展示對象各個屬性值
2.4 equals()方法
public boolean equals(Object obj){}默認實現為(this == obj), 比較兩個對象地址是否相同。
可進行覆蓋,比較兩個對象的內容是否相同。
// 判斷兩個對象是否相等 Student s4 = new Strudent("小明", 17); Student s5 = new Strudent("小明", 17); sout(s4.equals(s5)); // false 堆中地址不同// 重寫 改變其比較內容 /* 步驟 1. 比較兩個應用是否指向同一個對象2. 判斷obj是否為null3. 判斷兩個引用只想的實際對象類型是否一致4. 強制類型轉換5. 依次比較各個屬性值是否相同 */ @override public boolean equals(Object obj){// 1.判斷兩個對象是否是同一個引用if(this == obj){return true;}// 2.判斷obj是否為nullif(obj == null){return false;}// 3.判斷是否是同一個類型// if(this.getClass() == obj.getClass()){//// }//最好使用instanceof 判斷對象是否是某種類型if(obj instanceof Student){// 4.強制類型轉換Student s = (Student)obj;// 5. 比較屬性if(this.name.equals(s.getName()) && this.age == s.getAge()){return true;}}return false; }2.5 finalize()方法
當對象被判定為垃圾對象時,由JVM自動調用此方法,用以標記垃圾對象,進入回收隊列。
垃圾對象:沒有有效引用指向此對象時,為垃圾對象。
垃圾回收:由GC銷毀垃圾對象,釋放數據存儲空間。
自動回收機制:JVM的內存耗盡,一次性回收所有垃圾對象。
手動回收機制:使用System.gc();通知JVM執行垃圾回收。
3 包裝類
- 基本數據類型所對應的引用數據類型。
- Object 可統一所有數據,包裝類的默認值是null。
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| boolean | Boolean |
| char | Character |
3.1 類型轉換與裝箱、拆箱
8種包裝類提供不用類型間的轉換方式:
注意:需保證類型兼容,否則拋出NumberFormatException異常
//裝箱,基本類型轉成引用類型 //拆箱,引用類型轉成基本類型 // jdk1.5之后提供了自動裝箱拆箱int age = 30;//自動裝箱。自動完成了:Integer integer = Integer.valueOf(age);Integer integer = age;//// 自動拆箱。自動完成了該行代碼:int age2 = integer.intValue();int age2 = integer;基本類型和字符串之間轉換:
// 1. 基本類型轉成字符串int n1 = 100;// 方法1 使用+號String s1 = n1 + "";// 方法2 使用Integer中的toString()方法String s2 = Integer.toString(n1);String s2 = Integer.toString(n1, x); // x為進制要求// 2. 字符串轉成基本類型String str = "150";// 使用Integer.parseXXX();int n2 = Integer.parseInt(str);// boolean 字符串形式轉成基本類型,"true" ---> true 非“true ———> falseString str2 = "true";boolean b1 = Boolean.parseBoolean(str2);3.2 整數緩沖區
Java預先在堆內存中創建了256個常用的整數包裝類型對象,即[-128,127],當 Integer i =Integer.valueOf(x)處于這個區間之內,就直接將堆內存中的那個值的地址賦給i。如果x相同,i的地址都相同,如果不處于那個區間,則new一個對象。(此為源碼解讀)
可以參考:低調的洋仔
在實際應用當中,對已創建的對象進行復用(如下面的integer3和integer4例子)
psvm(String[] args){// 面試題Integer integer1 = new Integer(100);Integer integer2 = new Integer(100);sout(integer1 == integer2); // falseInteger integer3 =100;// 自動裝箱// 相當于調用 Integer.valueOf(100);Integer integer4 =100;sout(integer3 == integer4); // trueInteger integer5 = 200;// 自動裝箱Integer integer6 = 200;sout(integer5 == integer6); // false// 因為緩存區數組 [-128, 127] 在這之內地址一樣 }4 String類
- 字符串是常量,創建之后不可改變
- 字符串字面值存儲在字符串池中,可以共享
- String s = “Hello”;產生一個對象,字符串池中存儲
- String s = new String(“Hello”); 產生兩個對象,堆、池各一個
(由以上可知,因為產生了對象。可以直接用“字符串名.方法()”來調用方法)
4.1 常用方法
-
public int length():返回字符串長度
-
public char charAt(int index):根據下標獲取字符
-
public boolean contains(String str):判斷當前字符串是否包含str
-
public char[] toCharArray():將字符串轉換成數組
-
public int indexOf(String str):查找str首次出現的下標,存在則返回該下標;不存在則返回-1。
public int indexOf(String str, int fromIndex),從fromIndex下標開始查找。 -
public int lastIndexOf(String str):查找字符串在當前字符串中最后一次出現的下標索引
-
public String trim():去掉字符串前后的空格
-
public String toUpperCase():將小寫轉成大寫
public String toLowerCase():將大寫轉成小寫 -
public boolean endsWith(String str):判斷字符串是否以str結尾
public boolean starsWith(String str):判斷字符串是否以str開頭 -
public String replace(char oldChar, char newChar):將舊字符串替換成新字符串
-
public String[] split(String str):根據str做拆分,str可以是空格,如split(" “)。str可以是空格或逗號,如split(”[ ,]")。如果要將一個或多個空格或括號作為str,則醬紫寫split("[ ,]+")
-
public boolean equals(Object anObject):用于比較兩個字符串的內容是否相等
-
public boolean equalsIgnoreCase(String anotherString):用于將字符串與指定的對象比較,不考慮大小寫
-
public int compareTo(String
anotherString):如果字符串的第一個字符和參數字符串的第一個字符不等,結束比較,返回兩字符的ASCII碼差值。如果字符串的第一個字符和參數字符串的第一個字符相等,則以兩者的第二個字符做比較,以此類推,直至不等為止,返回該字符的ASCII碼差值。
如果兩個字符串不一樣長,可對應字符又完全一樣,則返回兩個字符串的長度差值。
4.2 可變字符串
- StringBuffer : 可變長字符串,運行效率慢、線程安全
- StringBuilder : 可變長字符串,運行快、線程不安全
上面兩者效率都比String高且節省內存。
psvm(String[] args){// StringBuffer 和 StringBuilder 用法一致StringBuffer sb = new StringBuffer();//StringBuilder sb = new StringBuilder();sb.append("java no1");// 1. append(); 在最后面追加sb.insert(0, "內容xx"); // 2. insert(); 插入內容sb.replace(0, 9, str); // 3.replace(); 替換(區間左閉右開)[0,9)sb.delete(0, 5); // 4. delete(); 刪除(左閉右開)[0,5)sb.delete(0, sb.length()); // 5. 清空 }5 BigDecimal類
很多實際應用中需要用到精確運算,而double是近似值存儲,不符合要求。需要用到BigDecimal。
位置:java.math包中
作用:精確計算浮點數
創建方式:BigDecimal bd = new BigDecimal(“x.xxx…”);(建議選擇字符串類型)
- 加:BigDecimal add(BigDecimal bd)
- 減:BigDecimal subtract(BigDecimal bd)
- 乘:BigDecimal multiply(BigDecimal bd)
- 除法:divide(BigDecimal bd, int scal, RoundingMode mode)
參數scal:指定精確到小數點后幾位
參數mode:指定小數部分的取舍模式,四舍五入模式為RoundingMode.HALF_UP
例如:
6 時間類型
6.1 Date類
Date表示特定的瞬間,精確到毫秒。Date類中的大部分方法都已經被Calendar類中的方法所取代
時間單位:1s = 1,000ms = 1,000,000 μs = 1,000,000,000 = ns
psvm(String[] args){// 1 創建Date對象Date date1 = new Date();sout(date1.toString()); //WED Sept 02 22:25:23 CST 2020sout(date1.toLocaleString()); // 已過時,但也能用 2020-9-2// 創建昨天的Date date2 = new Date(date1.getTime() - (60*60*24*1000));sout(date2.toLocaleString());// 2 方法after beforeboolean b1 = date.after(date2);sout(b1); //trueboolean b2 = date1.before(date2);sout(b2); //false// 比較compareTo();int d = date1.compareTo(date2);sout(d); // 比較兩個日期的順序。date1比date2大則為正,否則負// 比較是否相等 equals()boolean b3 = date1.equals(date2);sout(b3); // false }6.2 Calendar類
- Calendar提供了獲取或設置各種日歷字段的方法
- 構造方法 protected Calendar(); 由于是protected 所以無法直接創建
其他方法:
| static Calendar getInstance() | 使用默認時區和區域獲取日歷 |
| void set(int year, int month, int date, int hourofday, int minute, int second) | 設置日歷的年、月、日、時、分、秒 |
| int get(int field) | 返回給定日歷字段的值。字段比如年、月、日 |
| void setTime(Date date) | 用給定的date設置此日歷時間 |
| Date getTime() | 返回一個date表示此日歷的時間 |
| void add(int field, int amount) | 按照日歷的規則,給指定字段添加或減少時間量 |
| long getTimeInMilles() | 毫秒為單位返回該日歷的時間值 |
例子:
psvm(String[] args){// 1. 創建 Calendar 對象Calendar calendar = Calendar.getInstance();sout(calendar.getTime().toLocaleString());// 2. 獲取時間信息// 獲取年int year = calendar.get(Calendar.YEAR);// 獲取月 從 0 - 11int month = calendar.get(Calendar.MONTH);// 日int month = calendar.get(Calendar.DAY_OF_MONTH);// 小時int hour = calendar.get(Calendar.HOUR_OF_DAY);// 分鐘int minute = calendar.get(Calendar.MINUTE);// 秒int second = calendar.get(Calendar.SECOND);// 3. 修改時間Calendar calendar2 = Calendar.getInstance();calendar2.set(Calendar.DAY_OF_MONTH, x);// 4. add修改時間calendar2.add(Calendar.HOUR, x); // x為正就加 負就減// 5. 補充方法int max = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);// 月數最大天數int min = calendar2.getActualMinimum(Calendar.DAY_OF_MONTH); }6.3 SimpleDateFormat類
- SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類
常用的時間模式字母:
| y | 年 | 2019 |
| M | 年中月份 | 08 |
| d | 月中天數 | 10 |
| H | 一天中小時(0-23) | 22 |
| m | 分鐘 | 16 |
| s | 秒 | 59 |
| S | 毫秒 | 356 |
6.4 System類
主要用于獲取系統的屬性數據和其他操作,構造方法私有的
| static void arraycopy(…) | 復制數組 |
| static long currentTimeMillis(); | 獲取當前系統時間,返回毫秒值 |
| static void gc(); | 建議jvm趕快啟動垃圾回收期器回收垃圾 |
| static void exit(int status); | 退出jvm 如果參數是0表示正常退出jvm 非0表示異常退出 |
Arrays.copyOf(original, newLength)也可以復制數組,但這個的源碼其實還是用了System類的arraycopy方法
currentTimeMillis()方法的一個應用:獲取程序運行用時
long start = System.currentTimeMillis();//{程序}long end = System.currentTimeMillis();sout("用時:"+(end-start)); System.exit(0);//下面的代碼不再執行,因為JVM已經退出 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java学习笔记2——常用类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 门道多:一次MaxCompute PS任
- 下一篇: 如何给软件开发项目估价?