常用類
筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
包裝類
包裝類的分類
- 針對八種基本資料型別相應的參考型別—包裝類
- 有了類的特點,就可以呼叫類中的方法,
| 基本資料型別 | 包裝類 |
|---|---|
| boolean | Boolean |
| char | Character |
| byte | Byte |
| short | Short |
| int | lnteger |
| long | Long |
| float | Float |
| double | Double |
繼承體系

包裝類和基本資料的轉換
演示包裝類和基本資料型別的相互轉換,這里以int和 Integer演示,
- jdk5 之前的手動裝箱和拆箱方式,裝箱:基本型別->包裝型別,反之,拆箱
- jdk5以后(含jdk5)的自動裝箱和拆箱方式
- 自動裝箱底層呼叫的是valueOf方法,比如Integer.valueOf()
- 其它包裝類的用法類似,不一一舉例
public static void main(String[] args) {
//jdk5前是手動裝箱和拆箱
// 手動裝箱int->Integer
int n1 = 100;
Integer integer = new Integer(n1);
Integer integer1 = Integer.valueOf(n1);
//手動拆箱
//Integer -> int
int i = integer.intValue();
//jdk5后,就可以自動裝箱和自動拆箱
int n2 = 200;
//自動裝箱int->Integer
Integer integer2 = n2;//底層使用的是 Integer.valueOf(n2)
//自動拆箱Integer->int
int n3 = integer2;//底層仍然使用的是 intValue()方法
}
包裝型別和String型別的相互轉換
案例演示,以lnteger和String轉換為例,其它類似:
public static void main(String[] args) {
//包裝類(Integer)->String
Integer i = 100;//自動裝箱
//方式1
String str1 = i +"";
//方式2
String str2 = i.toString();
//方式3
String str3 = String.valueOf(i);
//String ->包裝類(Integer)
String str4 = "12345";
Integer i2 = Integer.parseInt(str4);//使用到自動裝箱
Integer i3 = new Integer(str4);//構造器
System.out.println( "ok~~");
}
Integer類和Character類的常用方法
Integer類和Character有些常用的方法,我們一起來使用一下,
public static void main(String[] args) {
System.out.println(Integer.MIN_VALUE);//回傳最小值
System.out.println(Integer.MAX_VALUE);//回傳最大值
System.out.println(Character.isDigit( 'a'));//判斷是不是數字
System.out.println(Character.isLetter('a'));//判斷是不是字母
System.out.println(Character.isUpperCase('a'));//判斷是不是大寫
System.out.println(Character.isLowerCase('a'));//判斷是不是小寫
System.out.println(Character.isWhitespace('a'));//判斷是不是空格
System.out.println(Character.toUpperCase('a'));//轉成大寫
System.out.println(Character.toLowerCase('A'));//轉成小寫
}
Integer面試題
-
看看下面代碼,輸出什么結果?為什么?
public static void main(String[] args) { Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i ==j);//False // 所以,這里主要是看范圍-128 ~ 127就是直接回傳 //原始碼 //public static Integer valueOf(int i) { // if (i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high) // return Integer.IntegerCache.cache[i + (-Integer.IntegerCache.low)]; // return new Integer(i); //} //1.如果i 在IntegerCache.low(-128)~IntegerCache.high(127),就直接從陣列回傳 // 2.如果不在 -128~127,就直接 new Integer(i) Integer m = 1;//底層Integer.value0f(1); ->閱讀原始碼 Integer n= 1;//底層Integer.valueOf(1); System.out.println(m==n); //T // 所以,這里主要是看范圍-128 ~ 127就是直接回傳 // ,否則,就new Integer(xx); Integer x = 128;//底層Integer.valueOf(1); Integer y = 128;//底層Integer. valueOf(1); System.out.println(x=y);//False } -
看看下面代碼,輸出什么結果.
public static void main(String[] args) { //示例1 Integer i1=127; int i2=127; //只要有基本資料型別,判斷的是 //值是否相同 System.out.println(i1==i2); //示例2 Integer i3=128; int i4=128; System.out.println(i3==i4); }
String類
String類的理解和創建物件
-
String物件用于保存字串,也就是一組字符序列
-
字串常量物件是用雙引號括起的字符序列,例如:"你好"、"12.97"、"boy"等
-
字串的字符使用Unicode字符編碼,一個字符(不區分字母還是漢字)占兩個位元組,
-
String類較常用構造器(其它看手冊):
String s1 =new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startlndex,int count)
說明:
public static void main(String[] args) {
//1.String物件用于保存字串,也就是一組字符序列
// 2."jack"字串常量,雙引號括起的字符序列
// 3.字串的字符使用Unicode字符編碼,一個字符(不區分字母還是漢字)占兩個位元組
// 4.String類有很多構造器,構造器的多載
//常用的有String s1 = new String();//
//String s2 = new String(string original);
// String s3 = new String(char[] a);
// String s4 = new String(char[] a,int startIndex,int count)
// String s5 = new String(byte[] b)
// 5.String類實作了介面 Serializable 【String可以串行化:可以在網路傳輸】
//接口Comparable [String物件可以比較大小]
//6. String是final類,不能被其他的類繼承
//7.String有屬性 private final char value[];用于存放字串內容
//8.一定要注意: value是一個final型別,不可以修改(需要功力):即value不能指向
// 新的地址,但是單個字符內容是可以變化
String name = "jack";
name = "tom";
final char[] value = https://www.cnblogs.com/wenjie2000/p/{'a' ,'b','c'};
char[] v2 = {'t','o','m'};
value[0] ='H';
//value = https://www.cnblogs.com/wenjie2000/p/v2;//會報錯 因為存在 final,value中指向的各個地址不能改變,但各個地址對應的值能改變
}
兩種創建String物件的區別
方式一:直接賦值 String s = "hsp";
方式二:呼叫構造器 String s2 = new String("hsp");
-
方式一:先從常量池查看是否有"hsp"資料空間,如果有,直接指向;如果沒有則重新創建,然后指向,s最終指向的是常量池的空間地址
-
方式二:先在堆中創建空間,里面維護了value屬性,指向常量池的hsp空間,如果常量池沒有"hsp",重新創建,如果有,直接通過value指向,最終指向的是堆中的空間地址,
-
畫出兩種方式的記憶體分布圖

測驗試題
測驗題1
String a = "abc";
String b="abc";
System.out.println(a.equals(b))://T
System.out.println(a==b);//T a和b指向同一個地址
測驗題2
String a = "hsp";
String b = new String("hsp");
System.out.println(a.equals(b));//T
System.out.println(a == b);//F
System.out.println(a == b.intern());//T
System.out.println(b == b.intern());//F
/*
知識點:
當呼叫intern方法時,如果池已經包含一個等于此 String物件的字串(用equals(Object)方法確定),則回傳池中的字串,否則,將此 String 物件添加到池中,并回傳此 String物件的參考
解讀;(1) b.intern()方法最侄訓傳的是常量池的地址(物件).
*/
測驗題3
String s1 = "hspedu";
String s2 = "java";
String s4 = "java";
String s3 = new String("java");
System.out.println(s2 == s3);//f
System.out.println(s2 == s4);//t
System.out.println(s2.equals(s3));//t
System.out.println(s1 == s2);//f
測驗4
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "hspedu";
Person p2 = new Person();
p2.name = "hspedu";
System.out.println(p1.name.equals(p2.name));//t
System.out.println(p1.name == p2.name);//t
System.out.println(p1.name == "hspedu");//t
String s1 = new String("bcde");
String s2 = new String("bcde");
System.out.println(s1 == s2);//f
//可以畫出記憶體布局圖分析
}
}
class Person{
String name;
}
字串的特性
說明
-
String是一個final類,代表不可變的字符序列
-
字串是不可變的,一個字串物件一旦被分配,其內容是不可變的.(指的是常量池中創建好的字串資料不能手動改變)
以下陳述句創建了幾個物件?畫出記憶體布局圖,
String s1 = "hello";
s1="haha";//s1指向的地址發生了改變
面試題
題1
String a= "hello" +"abc";
創建了幾個物件?
//解讀: String a = "hello" +"abc"; //==>優化等價 String a = "helloabc"; 所以只創建了一個物件
題2
String a = "hello";
String b ="abc";
String c=a+b;創建了幾個物件?畫出記憶體圖?
//關鍵就是要分析String c =a + b;到底是如何執行的
//一共有3物件,
public static void main(String[] args) {
String a = "hello" ;//創建a物件
String b = "abc";
// 創建b物件
// 解讀
// 1,先創建一個StringBuilder sb = StringBuilder()//StringBuilder具體會在后面講
// 2,執行sb.append("hello");
// 3. sb.append("abc");
// 4.String c= sb.toString()
// 最后其實是c指向堆中的物件(String) value[] ->池中"helloabc"
String c = a + b;
String d="helloabc";
System.out.println(c ==d);//真還是假? F
}
小結:底層是StringBuilder sb = new StringBuilder(); sb.append(a); sb.append(b); sb是在堆中,并且append是在原來字串的基礎上追加的.
重要規則,Stringc1 = "ab" + "cd";常量相加,看的是池,String c1 = a+b;變數相加,是在堆中
題3
下列程式運行的紋果是什么,嘗試畫出記憶體布局圖?
class Test1 {
String str = new String("hsp");
final char[] ch = {'j', 'a', 'v', 'a'};
public void change(String str, char ch[]) {
str = "java";
ch[0] = 'h';
}
public static void main(String[] args) {
Test1 ex = new Test1();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
}
}//思考,認真看,仔細想 hsp and hava
記憶體分析:

String類的常見方法
●說明
String類是保存字串常量的,每次更新都需要重新開辟空間,效率較低,因此java設計者還提供了StringBuilder和 StringBuffer 來增強String的功能,并提高效率,[后面我們還會詳細介紹StringBuilder和StringBuffer]
String s = new String("");
for( int i = 0; i<80000; i++){
s +="hello";
}
String類的常見方法一覽[了解就可以,不需要背]
equals //區分大小寫,判斷內容是否相等
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));//f
equalsIgnoreCase //忽略大小寫的判斷內容是否相等
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equalsIgnoreCase(str2));//t
length //獲取字符的個數,字串的長度
String str1 = "hello";
System.out.println(str1.length());//5
indexOf //獲取字符在字串中第1次出現的索引,索引從0開始,如果找不到,回傳-1
String str1 = "hello";
System.out.println(str1.indexOf("lo"));//3
lastIndexOf //獲取字符在字串中最后1次出現的索引,索引從0開始,如找不到,回傳-1
String str1 = "hello";
System.out.println(str1.lastIndexOf("l"));
substring //截取指定范圍的子串
String str1 = "hello";
System.out.println(str1.substring(2));//從索引2開始截取所有內容 [2,-1] llo
System.out.println(str1.substring(2,4));//從索引2開始到索引4-1的內容 [2,4) ll
charAt //獲取某索引處的字符,注意不能使用Str[index]這種方式.
String str1 = "hello";
System.out.println(str1.charAt(3));//l
toUpperCase //字串轉換為大寫
String str1 = "Hello";
System.out.println(str1.toUpperCase());//Hello
toLowerCase //字串轉換為小寫
String str1 = "Hello";
System.out.println(str1.toLowerCase());//hello
concat //拼接字串
String s1 ="寶玉";
s1 = s1.concat("林黛玉").concat("薛寶釵").concat("together");
System.out.println(s1);//寶玉林黛玉薛寶釵together
replace //替換字串中的字符
String s1 ="林黛玉 and薛寶釵薛寶釵 林黛玉 薛寶釵";
//s1.replace()方法回傳的結果才是替換過的,原先的s1不會影響
s1 = s1.replace("林黛玉","薛寶釵");//在s1中,將所有的 林黛玉 替換成 林黛玉
System.out.println(s1);//薛寶釵 and薛寶釵薛寶釵 薛寶釵 薛寶釵
split 分割字串,對于某些分割字符,我們需要轉義比如|\\等(此處支持正則運算式)
// 5.split分割字串,對于某些分割字符,我們需要轉義比如 │\|等
String poem ="鋤禾目當午,汗滴禾下土,誰知盤中餐,粒粒皆辛苦";
//解讀:
// 1.以,為標準對 poem進行分割,回傳一個陣列
// 2.在對字串進行分割時,如果有特殊字符,需要加入轉義符\
String[] split = poem.split(",");
poem = "E:\\aaa\\bbb";
split =poem.split("\\\\");//此處四個\是因為經過將“\\\\“轉換為"\\","\\"識別為正則運算式會再次進行轉換,最終成為"\"
//如果括號中為“\\d”則為 “\\d”-->"\d"-->數字(正則運算式) 根據數字分割字串
System.out.println("\\\\");
// String[] split = poem.split("\\\\");
// String[] split = poem.split("\\\\");
System.out.println("==分割后內容===");
for (int i = 0; i< split.length; i++) {
System.out.println(split[i]);
}
toCharArray //轉換成字符陣列
String s ="happy";
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
System.out.println(chs[i]);
}
compareTo //比較兩個字串的大小
// 先比較每一位的字符(相減) 再比較長度(相減) 如果都相同則回傳0
// 如果前者大,則回傳正數,后者大,則回傳負數,如果相等,回傳0
// (1)如果長度相同,并且每個字符也相同,就回傳0
// (2)如果長度相同或者不相同,但是在進行比較時,可以區分大小1l
// 就回傳if(c1 != c2){
// return c1 - c2;
// }
// (3)如果前面的部分都相同,就回傳str1.len - str2.len
String a = "jchns";
String b = "jack";
System.out.println(a.compareTo(b));//回傳值是'c' - 'a' =2的值
a = "jack";
b = "jacklll";
System.out.println(a.compareTo(b));//回傳值是長度相減4 - 7 =-3的值
format //格式化字串,%s字串%c字符%d整型%.2f 浮點型
String name = "john";
int age = 10;
double score = 98.3 / 3;
char gender ='男';
//將所有的資訊都拼接在一個字串
String info = "我的姓名是" + name +"年齡是" + age + " ,成績是" + score +"性別是" + gender;
System.out.println(info);
//解讀
//1. %s , %d , %.2f %c稱為占位符
//2. 這些占位符由后面變數來替換
//3. %s 表示后面由字串來替換
//4. %d是整數來替換
//5.%.2f 表示使用小數來替換,替換后,只會保留小數點兩位,并且進行四舍五入的處理
//6,%c使用char型別來替換
String info2 = String.format("我的姓名是%s年齡是%d,成績是%.2f 性別是%c.希望大家喜歡我! ",name,age,score,gender);
System.out.println("info2=" + info2);
String formatStr="我的姓名是%s年齡是%d,成績是%.2f 性別是%c.希望大家喜歡我!";
info2 = String.format(formatStr,"zwj",age,score,gender);
System.out.println("info2=" + info2);
案例,將一個人的資訊格式化輸出.
StringBuffer類
基本介紹
java.lang.StringBuffer代表可變的字符序列,可以對字串內容進行增刪,
很多方法與String相同,但StringBuffer是可變長度的,
StringBuffer是一個容器,
//解讀
//1.StringBuffer的直接父類是 AbstractStringBuilder
//2. StringBuffer實作了Serializable,即StringBuffer的物件可以串行化
// 3.在父類中 AbstractStringBuilder有屬性 char[] value,不是final
// 該value 陣列存放字串內容,引出存放在堆中的
//4. StringBuffer是一個 final類,不能被繼承
//5.因為StringBuffer字符內容是存在char[] value,所有在變化(增加/洗掉)
//不用每次都更換地址(即不是每次創建新物件),所以效率高于String
StringBuffer stringBuffer = new StringBuffer("hello");
String Vs StringBuffer
- String保存的是字串常量,里面的值不能更改,每次String類的更新實際上就是更改地址,效率較低//private final char value[];
- StringBuffer保存的是字串變數,里面的值可以更改,每次StringBuffer的更新實際上可以更新內容,不用每次更新地址(當空間不夠時創建新的空間,并將之前的字串拷貝進去),效率較高//char[] value;//這個放在堆.
StringBuffer的構造器
StringBuffer()
構造一個其中不帶字符的字串緩沖區,其初始容量為16個字符,
StringBuffer(int capacity) //capacity [容量]
構造一個不帶字符,但具有指定初始容量的字串緩沖區,即對 char[]大小進行指定
StringBuffer(String str)
構造一個字串緩沖區,并將其內容初始化為指定的字串內容,
//構造器的使用
//解讀
//1.創建一個大小為16的 char[],用于存放字符內容
StringBuffer stringBuffer = new StringBuffer();
//2.通過構造器指定char[]大小
StringBuffer stringBuffer1 = new StringBuffer(100);
//3.通過給一個String創建StringBuffer,char[]大小就是 str.length() +16
StringBuffer hello = new StringBuffer("hello");
String和StringBuffer相互轉換
在開發中,我們經常需要將String 和StringBuffer進行轉換,看看如何實作,看演示.
//看String-->StringBuffer
String str = "hello tom" ;
//方式1 使用構造器
//注意:回傳的才是StringBuffer物件,對str本身沒有影響
StringBuffer stringBuffer= new StringBuffer(str) ;
//方式2 使用的是append方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
//看看StringBuffer ->String
StringBuffer stringBuffer3 = new StringBuffer("韓順平教育");
//方式1 使用StringBuffer提供的 toString方法
String s = stringBuffer3.toString();
//方式2 使用構造器來搞定
String s1 = new String(stringBuffer3);
StringBuffer類常見方法
StringBuffer s = new StringBuffer("hello");
//增
s.append( ',');// "hello, "
s.append("張三豐");//"hello,張三豐"
s.append("趙敏").append(100) .append(true).append(10.5);//"hello,張三豐趙敏100true10.5
System.out.println(s);//"hello,張三豐趙敏100true10.5"
//刪
/*洗掉索引為>=start && <end 處的字符
* 解讀:洗掉11~14的字符[11,14)
*/
s.delete(11,14);
System.out.println(s);// "hello,張三豐趙敏true10.5"
//改
//老韓解讀,使用周芷若替換索引9-11的字符[9,11)
s.replace(9,11,"周芷若");
System.out.println(s);// "hello,張三豐周芷若true10.5"
//查找指定的子串在字串第一次出現的索引,如果找不到回傳-1
int index0f = s.indexOf("張三豐");
System.out. println(index0f);//6
//插
//老韓解讀,在索引為9的位置插入“趙敏",原來索引為9的內容自動后移
s.insert(9,"趙敏");
System.out.println(s);// "hello,張三豐趙敏周芷若true10.5"
//長度
System.out.println(s.length());//22
System.out.println(s);
課后練習題1
String str = null;// ok
StringBuffer sb = new StringBuffer(); //ok
sb.append(str);//需要看原始碼,底層呼叫的是AbstractStringBuilder的appendNull 傳入的字串為空時 append("null")
System.out.println(sb.length());//4
System.out.println(sb);//null
System.out.println(sb); //null
// 下面的構造器,會拋出NullpointerException
StringBuffer sb1 = new StringBuffer(str);//看底層原始碼super(str.length() + 16);
System.out.println(sb1);
課后練習2
輸入商品名稱和商品價格,要求列印效果示例,使用前面學習的方法完成:
商品名 商品價格
手機 123,564.59 //比如價格3,456,789.88
要求:價格的小數點前面每三位用逗號隔開,再輸出,
//Scanner scanner = new Scanner(System.in);
//String price = scanner.next();
String price = "8123564.59";
StringBuffer sb = new StringBuffer(price);
//先完成一個最簡單的實作123,564.59
//找到小數點的索引,然后在該位置的前3位,插入,即可
//int i = sb.lastIndexOf(".");
//sb = sb.insert(i - 3,",");
// 上面的兩步需要做一個回圈處理,才是正確的
for (int i = sb.lastIndexOf(".") - 3; i > 0; i -= 3) {
sb = sb.insert(i, ",");
}
System.out.println(sb);//8,123,564.59
StringBuilder類
基本介紹
- 一個可變的字符序列,此類提供一個與StringBuffer 兼容的APl,但不保證同步(StringBuilder不是執行緒安全),該類被設計用作 StringBuffer的一個簡易替換,用在字串緩沖區被單個執行緒使用的時候,如果可能,建議優先采用該類,因為在大多數實作中,它比StringBuffer 要快[后面測],
- 在 StringBuilder上的主要操作是 append和 insert方法,可多載這些方法,以接受任意型別的資料,
StringBuilder常用方法
StringBuilder和 StringBuffer均代表可變的字符序列,方法是一樣的,所以使用和StringBuffer一樣,看老師演示.[參考StringBuffer].
看原始碼
//老韓解讀
//1.StringBuilder繼承 AbstractStringBuilder類
//2,實作了Serializable,說明StringBuilder物件是可以串行化(物件可以網路傳輸,可以保存到檔案)
//3.StringBuilder是final類,不能被繼承
//4.StringBuilder物件字符序列仍然是存放在其父類 AbstractStringBuilder的 char[] value;因此,字符序列是堆中
//5.StringBuilder 的方法,沒有做互斥的處理,即沒有synchronized 關鍵字,因此在單執行緒的情況下使用StringBuilder
StringBuilder stringBuilder = new StringBuilder();
String、StringBuffer 和StringBuilder的比較
- StringBuilder 和 StringBuffer非常類似,均代表可變的字符序列,而且方法也一樣
- String:不可變字符序列,效率低,但是復用率高,
- StringBuffer:可變字符序列、效率較高(增刪)、執行緒安全
- StringBuilder:可變字符序列、效率最高、執行緒不安全
- String使用注意說明:
string s="a";//創建了一個字串
s +="b";//實際上原來的"a"字串物件已經丟棄了,現在又產生了一個字串s+"b”(也就是"ab"),如果多次執行這些改變串內容的操作,會導致大量副本字串物件存留在記憶體中,降低效率,如果這樣的操作放到回圈中,會極大影響程式的性能=>結論:如果我們對String做大量修改,不要使用String
效率:StringBuilder > StringBuffer > String
String、StringBuffer 和StringBuilder的選擇
使用的原則,結論:
- 如果字串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
- 如果字串存在大量的修改操作,并在單執行緒的情況,使用 StringBuilder
- 如果字串存在大量的修改操作,并在多執行緒的情況,使用 StringBuffer
- 如果我們字串很少修改,被多個物件參考,使用String,比如配置資訊等StringBuilder 的方法使用和StringBuffer一樣,不再說.
Math類
Math類常見方法應用案例
//看看Math常用的方法(靜態方法)//1.abs 絕對值
int abs = Math.abs(-9);
System.out.println(abs);//9
// 2.pow求冪
double pow = Math.pow(2, 4);//2的4次方
System.out.println(pow); //16
//3.ceil向上取整,回傳>=該引數的最小整數(回傳double型別);
double ceil = Math.ceil(-3.0001);
System.out.println(ceil);//-3.0
//4.floor向下取整,回傳<=該引數的最大整數(回傳double型別)
double floor = Math.floor(-4.999);
System.out.println(floor);//-5.0
//5.round 四舍五入 相當于Math.floor(該引數+0.5)
long round = Math.round(-5.001);
System.out.println(round);//-5
//6.sqrt求開方
double sqrt = Math.sqrt(9.0);
System.out.println(sqrt); //3.0
sqrt = Math.sqrt(-9.0);
System.out.println(sqrt); //NaN
// 7.random求亂數
//random回傳的是0<=x<1之間的一個隨機小數
//思考:請寫出獲取a-b之間的一個隨機整數,a, b均為整數,比如a = 2,b=7
// 即回傳一個數x ,2<= x <=7
//公式 (int)(Math.random()*(b-a+1)+a)
int x=(int)(Math.random()*6+2);
System.out.println(x);
//max , min回傳最大值和最小值
int min = Math.min(1,9);
int max = Math.max(45,90);
System.out.println( "min=" + min);
System.out.println("max=" + max);
Arrays類
Arrays類常見方法應用案例
Arrays里面包含了一系列靜態方法,用于管理或操作陣列(比如排序和搜索).
-
toString回傳陣列的字串形式
Arrays.toString(arr)int[] in={1,20,22}; System.out.println(Arrays.toString(in));//[1, 20, 22] -
sort排序(自然排序和定制排序)Integer arr[] = {1,-1,7, 0,89};
int[] in={1,20,22}; //直接使用Arrays.toString方法,顯示陣列 System.out.println(Arrays.toString(in)); //演示sort方法的使用 Integer arr[] = {1,-1,7,0,89}; //進行排序 //老韓解讀 //1.可以直接使用冒泡排序,也可以直接使用Arrays提供的sort方法排序 //2.因為陣列是參考型別,所以通過sort排序后,會直接影響到實參arr // 3. sort多載的,也可以通過傳入一個介面 Comparator實作定制排序 // 4.呼叫定制排序時,傳入兩個引數(1)排序的陣列arr // (2〕實作了Comparator介面的匿名內部類,要求實作compare方法 //5,先演示效果,再解釋 //6,這里體現了介面編程的方式 //原始碼分析 //Arrays.sort(arr, new Comparator() //(2)最終到 TimSort類的private static <T> void binarySort(T[] a, int lo, int hi, int start, // Comparator<? super T> c) //(3)執行到 binarySort方法的代碼,會根據動態系結機制C.compare()執行我們傳入的匿名內部類的 compare () // while (left < right) { // int mid = (left + right) >>> 1; // if (c.compare(pivot, a[mid]) < 0) // right = mid; // else // left = mid + 1; // } //(4) new Comparator() { // @Override // public int compare(Object o1, Object o2) { // Integer i1 = (Integer) o1; // Integer i2 = (Integer) o2; // return i2 - i1; // } // } //(5)public int compare(Object o1, Object o2)回傳的值>0還是<0 //會影響整個排序結果,這就充分體現了介面編程+動態系結+匿名內部類的綜合使用將來的底層框架和原始碼的使用方式,會非常常見 // Arrays.sort(arr);//默認排序方法 //定制排序 Arrays.sort(arr, new Comparator() { @Override public int compare(Object o1, Object o2) { Integer i1 = (Integer) o1; Integer i2 = (Integer) o2; return i2 - i1; } }); System.out.println("===排序后==="); System.out.println(Arrays.toString(arr)); -
binarySearch 通過二分搜索法進行查找,要求必須排好序
int index = Arrays.binarySearch(arr,3);Integer[] arr = {1,2,90,123,567}; // binarySearch通過二分搜索法進行查找,要求必須排好 // 老韓解讀 //1.使用 binarySearch二叉查找 //2.要求該陣列是有序的,如果該陣列是無序的,不能使用binarySearch //3.如果陣列中不存在該元素,就回傳 return -(low + 1);// key not found. int index = Arrays.binarySearch(arr,30); System.out.println( "index=" +index); -
copyOf陣列元素的復制
Integer[] arr = {1,2,90,123,567}; //copyOf陣列元素的復制/老韓解讀 //1.從 arr陣列中,拷貝 arr.length個元素到newArr陣列中 // 2.如果拷貝的長度> arr.length就在新陣列的后面增加null // 3.如果拷貝長度<0就拋出例外NegativeArraySizeException //4.該方法的底層使用的是System.arraycopy() Integer[] newArr = Arrays.copyOf(arr,arr.length); System.out.println("==拷貝執行完畢后=="); System.out.println(Arrays.toString(newArr)); -
ill 陣列元素的填充
//ill 陣列元素的填充 Integer[] num = new Integer[]{9,3,2}; //解讀 //1.使用99去填充num陣列,可以理解成是替換原理的元素 Arrays.fill(num,99); System.out.println( "==num陣列填充后=="); System.out.println(Arrays.toString(num));//[99, 99, 99] -
equals比較兩個陣列元素內容是否完全一致
Integer[] arr = {1,2,90,123,567}; //equals比較兩個陣列元素內容是否完全一致 Integer[] arr2 = {1,2,90,123}; //解讀 //1.如果arr 和 arr2 陣列的元素一樣,則方法true; //2.如果不是完全一樣,就回傳 false boolean equals = Arrays.equals(arr,arr2); System.out.println( "equals=" +equals);//F -
asList將一組值,轉換成list
//asList將一組值,轉換成list //解讀 //1. asList方法,會將(2,3,4,5,6,1)資料轉成一個List集合 //2.回傳的asList編譯型別List(介面) //3.asList運行型別java.util.Arrays#ArrayList,是Arrays類的 //靜態內部類 private static class ArrayList<E> extends AbstractList<El/ // implements RandomAccess,java.io.Serializable List asList = Arrays.asList(2,3,4,5,6,1); System.out.println("asList=" +asList); System.out.println("asList的運行型別" +asList.getClass());
System類
System類常見方法和案例
-
exit 退出當前程式
System.out.println( "ok1"); //解讀 //1. exit(0)表示程式退出 //2,0表示一個狀態,正常的狀態 System.exit(0); System.out.println("ok2"); -
arraycopy :復制陣列元素,比較適合底層呼叫,一般使用Arrays.copyOf完成復制陣列.
int[] src=https://www.cnblogs.com/wenjie2000/p/{1,2,3}; int[] dest = new int[4];// dest當前是{0,0,0,0} //傳入引數:(原陣列,原陣列開始位置,目標陣列,目標位置索引,拷貝數量) System.arraycopy(src, 0,dest,1,3); System.out.println("dest="+Arrays.toString(dest)); -
currentTimeMillens:回傳當前時間距離1970-1-1的毫秒數
//currentTimeMilLens:回傳當前時間距離1970-1-1的毫秒數 // 解讀: System.out.println(System.currentTimeMillis());
- gc:運行垃圾回識訓制System.gc();
Biglnteger類和BigDecimal類
BigInteger和BigDecimal介紹
應用場景:
-
BigInteger適合保存比較大的整型
//當我們編程中,需要處理很大的整數,long不夠用 //可以使用BigInteger的類來搞定, //long l = 23788888899999999999999999999l; // System.out.println("l=" +l); BigInteger bigInteger = new BigInteger("2378888889999999999999999999999"); BigInteger bigInteger2 = new BigInteger("100"); System.out.println(bigInteger); //解讀 //1,在對 BigInteger進行加減乘除的時候,需要使用對應的方法,不能直接進行+– * / // 2,可以創建一個要操作的 BigInteger然后進行相應操作 BigInteger add = bigInteger.add(bigInteger2); System.out.println(add);//加 BigInteger subtract = bigInteger.subtract(bigInteger2); System.out.println(subtract);//減 BigInteger multiply = bigInteger.multiply(bigInteger2); System.out.println(multiply);//乘 BigInteger divide = bigInteger.divide(bigInteger2); System.out.println(divide);//除 -
BigDecimal適合保存精度更高的浮點型(小數)
//當我們需要保存一個精度很高的數時,double不夠用//可以是 BigDecimal //double d = 1999.11111111111999999999999977788d; //System.out.println(d); BigDecimal bigDecimal = new BigDecimal("1999.1111111187"); BigDecimal bigDecimal2 = new BigDecimal("3"); System.out.println(bigDecimal); //老韓解讀 //1,如果對 BigDecimal進行運算,比如加減乘除,需要使用對應的方法 //2.創建一個需要操作的 BigDecimal然后呼叫相應的方法即可 System.out.println(bigDecimal.add(bigDecimal2)); System.out.println(bigDecimal.subtract(bigDecimal2)); System.out.println(bigDecimal.multiply(bigDecimal2)); //System.out.println(bigDecimal.divide(bigDecimal2));//可能拋出例外ArithmeticException(因為可能出現無限小數) //在呼叫divide 方法時,指定精度即可. // BigDecimal.ROUND_CEILING 會保留分子的精度 System.out.println(bigDecimal.divide(bigDecimal2,BigDecimal.ROUND_CEILING));
Date日期類、Calendar日歷類以及新的日期
第一代日期類
-
Date:精確到毫秒,代表特定的瞬間
-
SimpleDateFormat:格式和決議日期的類SimpleDateFormat格式化和決議日期的具體類,它允許進行格式化(日期->文本)、決議(文本->日期)和規范化.
G 年代標志符;y 年;M 月;d 日;h 時 在上午或下午 (1~12);H 時 在一天中 (0~23);m 分;s 秒;S 毫秒;E 星期;D 一年中的第幾天;F 一月中第幾個星期幾;w 一年中第幾個星期;W 一月中第幾個星期;a 上午 / 下午 標記符;k 時 在一天中 (1~24);K 時 在上午或下午 (0~11);z 時區
//解讀
//1,獲取當前系統時間
//2,這里的Date 類是在java.util包
//3.默認輸出的日期格式是國外的方式,因此通常需要對格式進行轉換
Date d1 = new Date();//獲取當前系統時間
System.out.println("當前日期=" + d1);// 當前日期=Sat Aug 13 19:50:58 CST 2022
Date d2 = new Date(9234567);//通過指定毫秒數得到時(從1970年開始計算)
System.out.println(" d2=" + d2);//獲取某個時間對應的毫秒數 d2=Thu Jan 01 10:33:54 CST 1970
//解讀
//1,創建SimpleDateFormat物件,可以指定相應的格式
//2.這里的格式使用的字母是規定好,不能亂寫
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 a hh:mm:ss E");
String format = sdf.format(d1); // format:將日期轉換成指定格式的字串
System.out.println("當前日期="+ format);//當前日期=2022年08月13日 下午 08:12:16 星期六
//解讀
//1,可以把一個格式化的String 轉成對應的 Date
//2.得到Date 仍然在輸出時,還是按照國外的形式,如果希望指定格式輸出,需要轉換
//3.在把String -> Date ,使用的 sdf 格式需要和你給的String的格式一樣,否則會拋出轉換例外
String s = "1996年01月01日 上午 10:20:30 星期一";
Date parse = sdf.parse(s);
System.out.println("parse=" + sdf.format(parse));//parse=1996年01月01日 上午 10:20:30 星期一
第二代日期類
- 第二代日期類,主要就是Calendar類(日歷),
public abstract class Calendar extends object implements Serializable,Cloneable, Comparable - Calendar類是一個抽象類,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_ MONTH、HOUR等日歷欄位之間的轉換提供了一些方法,并為操作日歷欄位(例如獲得下星期的日期)提供了一些方法,
Calendar c = Calendar.getInstance();//創建日歷類物件//比較簡單,自由
System.out.println(c);
//2.獲取日歷物件的某個日歷欄位
System.out.println("年:" + c.get(Calendar.YEAR));
System.out.println("月:" + (c.get(Calendar.MONTH) + 1));//注意獲取的月份從0開始
System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
System.out.println("小時:" + c.get(Calendar.HOUR));
System.out.println("小時:" + c.get(Calendar.HOUR_OF_DAY));
System.out.println("分鐘:" + c.get(Calendar.MINUTE));
System.out.println("秒:" + c.get(Calendar.SECOND));
//Calender沒有專門的格式化方法,所以需要程式員自己來組合顯示
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DAY_OF_MONTH) + "日");
第三代日期類
前面兩代日期類的不足分析
JDK 1.0中包含了一個java.util.Date類,但是它的大多數方法已經在JDK 1.1引入Calendar類之后被棄用了,而Calendar也存在問題是:
1)可變性:像日期和時間這樣的類應該是不可變的,
2)偏移性:Date中的年份是從1900開始的,而月份都從0開始,
3)格式化:格式化只對Date有用,Calendar則不行,
4)此外,它們也不是執行緒安全的;不能處理閏秒等(每隔2天,多出1s)·
第三代日期類常見方法
-
LocalDate(日期/年月日)、LocalTime(時間/時分秒)、LocaIDateTime(日期時間/年月日時分秒)JDK8加入
LocalDate只包含日期,可以獲取日期欄位
LocalTime只包含時間,可以獲取時間欄位
LocalDateTime包含日期+時間,可以獲取日期和時間欄位
-
DateTimeFormatter格式日期類
類似于SimpleDateFormat
DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);
String str = dtf.format(日期物件);
- lnstant時間戳
類似于Date
提供了一系列和Date類轉換的方式Instant——>Date:
Date date = Date.from(instant);Date—>lnstant:
lnstant instant = date.tolnstant);
//1.通過靜態方法now()獲取表示當前時間截的物件
Instant now = Instant.now();
System.out.println(now);
//2.通過 from可以把Instant轉成Date
Date date = Date.from(now);
//3.通過 date的toInstant()可以把 date轉成Instant物件
Instant instant = date.toInstant();
-
第三代日期類更多方法LocalDateTime類
MonthDay類:檢查重復事件是否是閏年
增加日期的某個部分
使用plus方法測驗增加時間的某個部分
使用minus方法測驗查看一年前和一年后的日期其他的方法就不說了,使用的時候,自己查看API使用即可
//第三代日期/老韓解讀
//1,使用now()回傳表示當前日期時間的物件
LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now();//LocalTime.now()
System.out.println(ldt);
//2,使用DateTimeFortiatter物件來進行格式化
// 創建DateTimeFormatter物件
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//具體規則可查看jdk1.8手冊
String format = dateTimeFormatter.format(ldt);
System.out.println("格式化的日期 ="+ format);
System.out.println("年=" + ldt.getYear());
System.out.println("月=" + ldt.getMonth());
System.out.println("月=" + ldt.getMonthValue());
System.out.println("日=" + ldt.getDayOfMonth());
System.out.println("時=" + ldt.getHour());
System.out.println("分=" + ldt.getMinute());
System.out.println("秒=" + ldt.getSecond());
LocalDate now = LocalDate.now();//可以獲取年月日
LocalTime now2 = LocalTime.now();//獲取到時分秒
//提供plus 和 minus方法可以對當前時間進行加或者減/看看890天后,是什么時候把年月日-時分秒
LocalDateTime localDateTime = ldt.plusDays(890);
System.out.println("890天后=" + dateTimeFormatter.format(localDateTime));
//看看在 3456分鐘前是什么時候,把年月目-時分秒輸出
LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
System.out.println("3456分鐘前日期=" + dateTimeFormatter.format(localDateTime2));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501978.html
標籤:Java
