Java常见类
一、包裝類
1.1 概述
概述:
- 基本數據類型所對應的引用數據類型。
- Object可統一所有數據,包裝類的默認值是null。
2.2 裝箱、拆箱
-
八種包裝類提供不同類型間的轉換方式。
-
Number父類中提供的6個共性方法。
- parseXXX()靜態方法(除了Character)。
- valueOf()靜態方法。
-
注意:需保證類型兼容,否則拋出NumberFormatException異常。
-
JDK 5.0之后,自動裝箱、拆箱。基本數據類型和包裝類自動轉換。
3.3 整數緩沖區
- Java預先創建了256個常用的整數包裝類型對象。
- 在實際應用當中,對已創建的對象進行復用。
面試題:分析以下輸出結果的原因。
public class TestInteger2 {public static void main(String[] args) {//面試題Integer integer1=new Integer(100);Integer integer2=new Integer(100);System.out.println(integer1==integer2); Integer integer3=Integer.valueOf(100);//自動裝箱Integer.valueOfInteger integer4=Integer.valueOf(100);System.out.println(integer3==integer4);//true Integer integer5=Integer.valueOf(200);//自動裝箱Integer integer6=Integer.valueOf(200);System.out.println(integer5==integer6);//false } }二、String類
2.1 概述:
-
Java程序中的所有字符串文本(例如“abc”)都是此類的實例。
-
字符串字面值是常量,創建之后不可改變。
-
常用創建方式:
- String str1 = “Hello”;
- String str2 = new String(“World”);
2.2 常用方法:
| public char charAt(int index) | 根據下標獲取字符 |
| public boolean contains(String str) | 判斷當前字符串中是否包含str |
| public char[] toCharArray() | 將字符串轉換成數組。 |
| public int indexOf(String str) | 查找str首次出現的下標,存在,則返回該下標;不存在,則返回-1 |
| public int length() | 返回字符串的長度 |
| public String trim() | 去掉字符串前后的空格 |
| public String toUpperCase() | 將小寫轉成大寫 |
| public boolean endsWith(String str) | 判斷字符串是否以str結尾 |
| public String replace(char oldChar,char newChar) | 將舊字符串替換成新字符串 |
| public String[] split(String str) | 根據str做拆分 |
| public String subString(int beginIndex,int endIndex) | 在字符串中截取出一個子字符串 |
2.3 split():
打斷字符串 — 返回一個字符串數組
案例:將字符串打斷,轉換為對象,存入對象數組中(前端返回字符串數據,后端的加工)
1.創建對象類(便于訪問就不加訪問修飾符)
public class Student {String name;int age; @Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";} }2.操作
public class TestSplit {public static void main(String[] args) {// 字符串轉對象的思想(重點)String students = "name=張三豐,age=20;name=郭襄,age=10;name=華箏,age=6";String[] stustr = students.split(";"); // 分割每一條數據,返回字符串數組Student[] stus = new Student[stustr.length]; // 創建學生數組 // 打印分割的字符串數組 // for (String string : stustr) { // System.out.println(string); // } for (int i = 0; i < stustr.length; i++) {String s = stustr[i]; // 保存為字符串Student stu = new Student(); // 創建學生對象stu.name = s.split(",")[0].split("=")[1]; // 打斷后,個姓名賦值stu.age = Integer.parseInt(s.split(",")[1].split("=")[1]); // 打斷后,給年齡賦值stus[i] = stu; // 存到學生數組中}System.out.println(Arrays.toString(stus)); // 打印} }2.4 可變字符串
- 概念:可在內存中創建可變的緩沖空間,存儲頻繁改變的字符串。
- Java中提供了兩個可變字符串類:
- StringBuilder:可變長字符串,JDK5.0提供,運行效率快、線程不安全。
- StringBuffer:可變長字符串,JDK1.0提供,運行效率慢、線程安全。
- 這兩個類中方法和屬性完全一致。
常用方法:
| public StringBuilder append(String str) | 追加內容。 |
| public StringBuilder insert(int dstOffset, CharSequence s) | 將指定 字符串插入此序列中。 |
| public StringBuilder delete(int start, int end) | 移除此序列的子字符串中的字符。 |
| public StringBuilder replace(int start, int end, String str) | 使用給定字符串替換此序列的子字符串中的字符。start開始位置、end結束位置。 |
| public int length() | 返回長度(字符數)。 |
StringBuilder效率高于String。
三、正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。
正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。
四、大數值運算類
4.1 BigInteger
為什么使用:
? double是近似值存儲,和金錢相關的就不符合要求了,這是就需要使用BigInteger
特點:大,構造的時候要使用字符串構造
? 不能自動裝箱拆箱,意味著不能直接賦基本數據類型,必須要new
要調用方法來運算
add,substract multiply,divide
// 大數值運算 public class TestBig {public static void main(String[] args) {String str = "";for (int i = 1; i <= 100; i++) {str +=i;} BigInteger bi1 = new BigInteger(str);BigInteger bi2 = new BigInteger(str.substring(10)); // 大數值的運算 - 加減乘除System.out.println(bi1.add(bi2));System.out.println(bi1.subtract(bi2));System.out.println(bi1.multiply(bi2));System.out.println(bi1.divide(bi2));} }4.2 BigDecemal
和BigInteger差不多
- 位置:java.math包中。
- 作用:精確計算浮點數。
- 創建方式:BigDecimal bd=new BigDecimal(“1.0”)。
五、日期
5.1 Data類
- Date表示特定的瞬間,精確到毫秒。
- Date類中的大部分方法都已經被Calendar類中的方法所取代。
- 時間單位
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 1微秒=1000納秒
5.2 SimpleDateFormat類
- SimpleDateFormat是以與語言環境有關的方式來格式化和解析日期的類。
- 進行格式化(日期 -> 文本)、解析(文本 -> 日期)。
| y | 年 |
| M | 月 |
| d | 日 |
| H | 時 |
| m | 分 |
| s | 秒 |
| S | 毫秒 |
5.3 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-Calendar |
| Date getTime() | 返回一個Date表示此日歷的時間。Calendar-Date |
| void add(int field,int amount) | 按照日歷的規則,給指定字段添加或減少時間量 |
| long getTimeInMillis() | 毫秒為單位返回該日歷的時間值 |
六、Math類
6.1 Math
Math 類提供了一序列基本數學運算和幾何函數的方法。
Math類是final類,并且它的所有成員變量和成員方法都是靜態的。
math的常量:
public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846;math的方法:
Math內的所有方法均為靜態的。
| double sin(double a) | 角a(弧度)的正弦值 |
| double cos(double a) | 角a(弧度)的余弦值 |
| double pow(double a,double b) | a的b的方法 |
| double sqrt(double a) | 求平方根 |
| int abs(int a) | 求絕對值 |
| double ceil(double a) | 返回大于等于a的最小整數的double值 |
| double floor(double a) | 返回小于等于a的最大整數的double值 |
| int max(int a, int b) | 返回int型值a和b中的較大值 |
| int min(int a, int b) | 返回int型值a和b中的較小值 |
| int round(float a) | 四舍五入返回整數 |
| double random() | 返回帶+的double值,該值大于等于0.0且小于1.0 |
6.2 靜態導入
想直接寫方法名或者變量名,則可以考慮使用靜態導入
語法:import static 包名.類名.*; //導入該類下的所有靜態方法和常量
// 靜態導入 import static java.lang.Math.random; public class TestStaticImport {public static void main(String[] args) {// 生成0-1之間的隨機數//使用靜態導入,可以直接使用導入的方法System.out.println(random()); } }七、Random類
生成隨機數 (偽隨機)
偽隨機:
? 實際上這個隨機數的生成是由線性同余的算法確定,如果種子一樣,生成是數據是一樣的
// 無參構造 public Random() {this(seedUniquifier() ^ System.nanoTime()); } // 帶參構造 public Random(long seed) {if (getClass() == Random.class)this.seed = new AtomicLong(initialScramble(seed));else {// subclass might have overriden setSeedthis.seed = new AtomicLong();setSeed(seed);} } // 生成隨機數: public int nextInt(int bound) {if (bound <= 0)throw new IllegalArgumentException(BadBound);int r = next(31);//生成31位的隨機數int m = bound - 1;//100-1=99//01111 10000 if ((bound & m) == 0) // i.e., bound is a power of 2 r = (int)((bound * (long)r) >> 31);else {for (int u = r;u - (r = u % bound) + m < 0;u = next(31));}return r; }結論:隨機數生成與隨機數種子相關,種子可以自己設置,也可以默認使用系統時間生成
八、Runtime類
Runtime代表Java程序的運行時環境,可以通過 getRuntime 方法獲取當前運行時。
? 應用程序不能自己創建Runtime對象,可以通過Runtime的靜態方法getRuntime()獲得Runtime對象。
Runtime類可以訪問jvm的相關信息,如處理器數量,內存信息等
public class TestRuntime {public static void main(String[] args) {Runtime rt = Runtime.getRuntime(); // // 核數,可以在操作系統中設置System.out.println("處理器數量:"+rt.availableProcessors());// 空閑的空間-已將拿到的沒有用完的空間 (剩余空間隨著對象的生成要減少)System.out.println("空閑內存:"+rt.freeMemory()); // 最大空間 (最大空間跟虛擬機參數有關)System.out.println("分配的最大內存:"+rt.maxMemory()); // 總空間 - 已經獲取的 (隨著對象的創建增加)System.out.println("已獲得的內存:"+rt.totalMemory()); } }九、System類
System系統類,主要用于獲取系統的屬性數據和其他操作。
常用方法:
| static void arraycopy(…) | 復制數組 |
| static long currentTimeMillis() | 獲取當前系統時間,返回的是毫秒值 |
| static void gc(); | 建議JVM趕快啟動垃圾回收器回收垃圾 |
| static void exit(int status) | 退出jvm,如果參數是0表示正常退出jvm,非0表示異常退出jvm。 |
十、 枚舉
枚舉(enum)全稱為 enumeration, 是 JDK 1.5 中引入的新特性。
10.1 語法:
public enum Color{//默認添加 public static final ColorRED,GREEN,BLUE; }10.2 本質:
盡管枚舉看起來像是一種新的數據類型,實際上,枚舉就是一種受限制的類,并且具有自己的方法。創建自己的enum類時,這個類繼承自 java.lang.Enum。
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable{... }枚舉的值是不會變的 – 封裝的思想
Grade.values()[0] = Grade.SENIOR; System.out.println(Grade.values()[0]); // LOWER創建一個枚舉:
public enum Grade { // 默認繼承了Enum, 因為java是單繼承的,所以枚舉不能再繼承了,只能實現接口LOWER,MIDDLE,SENIOR; // //默認添加 public static final Grade }反編譯:
public final class Grade extends Enum {public static final Grade LOWER;public static final Grade MIDDLE;public static final Grade SENIOR;private static final Grade ENUM$VALUES[];// 是一個私有的構造 - 所以枚舉不能實例化對象private Grade(String s, int i){super(s, i);}public static Grade[] values(){Grade agrade[];int i;Grade agrade1[];System.arraycopy(agrade = ENUM$VALUES, 0, agrade1 = new Grade[i = agrade.length], 0, i);return agrade1;} //把一個字符串轉為對應的枚舉類型public static Grade valueOf(String s){return (Grade)Enum.valueOf(com/qf/cd2206/myday15_class2/enu/Grade, s);}static //初始化枚舉對象的{LOWER = new Grade("LOWER", 0);MIDDLE = new Grade("MIDDLE", 1);SENIOR = new Grade("SENIOR", 2);ENUM$VALUES = (new Grade[] {LOWER, MIDDLE, SENIOR});} }枚舉的初始化過程
1、在靜態代碼塊中new 自己的對象,構造函數使用自身的私有構造
2、枚舉類會自動生成values方法,這個方法返回枚舉類中所有元素的數組的拷貝。
10.3 特點:
- 枚舉就是一個受限制的類,默認繼承Enum
- 枚舉的第一行必須定義該枚舉類型的對象
- 枚舉類型對象默認添加: public static final 類型
- 枚舉沒有繼承明確類(自定義枚舉類默認繼承Enum,Enum默認繼承Object)
- 枚舉類不能被繼承
- 枚舉里可以有構造方法、成員方法、靜態方法、抽象方法
- 枚舉可以實現接口
- 枚舉里沒有定義方法,可以在最后一個對象后面加逗號、分號或什么都不加
10.4 優勢:
-
增強代碼可讀性
-
枚舉型可直接與數據庫交互
-
switch語句優勢
-
編譯優勢
(枚舉類編譯時,沒有把常量值編譯到代碼中,即使常量值發生改變,也不會影響引用常量的類 )
- 將常量組織起來,統一管理
- 去除equals兩者判斷 由于常量值地址唯一,使用枚舉可以直接通過“==”進行兩個值之間的對比,性能會有所提高
10.5 方法:
| Enum.valueOf(Class enumType, String name) | 根據字符串找到該枚舉類中的對象 |
| public static void values() | 獲取該枚舉類對象數組 |
| public static void valueOf(String args0) | 根據字符串獲取該枚舉類中的對象 |
| public final String name() | 獲取該枚舉對象名字 |
| public final Class getDeclaringClass() | 獲取枚舉對象的枚舉類型相對應的Class對象 |
| public final int hashCode() | 獲取該枚舉對象的hash值 |
| public final int compareTo(E o) | 兩個枚舉對象進行比較 |
| public final boolean equals(Object other) | 比較兩個枚舉對象是否相同 |
根據字符串獲得枚舉
Grade sen = Grade.valueOf("SENIOR"); System.out.println(sen); // SENIOR10.6 案例分析 – 狀態碼
// 這個枚舉的名字叫數據結果--編碼--描述 public enum DataResult { SUCCESS(0,"成功"),ERR1(1,"page not found"),ERR2(2,"server internal error"); Integer code; // 錯誤編碼String msg; // 錯誤信息 private DataResult(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;} } // 這個枚舉的名字叫數據結果--編碼--描述 public enum DataResult { SUCCESS(0,"成功"),ERR1(1,"page not found"),ERR2(2,"server internal error"); Integer code; // 錯誤編碼String msg; // 錯誤信息 private DataResult(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;} } DataResult dr = DataResult.SUCCESS; System.out.println(dr.name()); // SUCCESS System.out.println(dr.msg); // 成功 應用,返回狀態碼總結
- 上一篇: 搭建Wpf框架(1) —— 管理系统-W
- 下一篇: Java使用itextpdf生成PDF文