主頁 > 後端開發 > Java學習-第一部分-第二階段-第四節:常用類

Java學習-第一部分-第二階段-第四節:常用類

2022-08-17 07:32:19 後端開發

常用類

筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

包裝類

包裝類的分類

  1. 針對八種基本資料型別相應的參考型別—包裝類
  2. 有了類的特點,就可以呼叫類中的方法,
基本資料型別 包裝類
boolean Boolean
char Character
byte Byte
short Short
int lnteger
long Long
float Float
double Double

繼承體系

image

包裝類和基本資料的轉換

演示包裝類和基本資料型別的相互轉換,這里以int和 Integer演示,

  1. jdk5 之前的手動裝箱和拆箱方式,裝箱:基本型別->包裝型別,反之,拆箱
  2. jdk5以后(含jdk5)的自動裝箱和拆箱方式
  3. 自動裝箱底層呼叫的是valueOf方法,比如Integer.valueOf()
  4. 其它包裝類的用法類似,不一一舉例
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面試題

  1. 看看下面代碼,輸出什么結果?為什么?

    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
    }
    
  2. 看看下面代碼,輸出什么結果.

    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類的理解和創建物件

  1. String物件用于保存字串,也就是一組字符序列

  2. 字串常量物件是用雙引號括起的字符序列,例如:"你好"、"12.97"、"boy"等

  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 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");

  1. 方式一:先從常量池查看是否有"hsp"資料空間,如果有,直接指向;如果沒有則重新創建,然后指向,s最終指向的是常量池的空間地址

  2. 方式二:先在堆中創建空間,里面維護了value屬性,指向常量池的hsp空間,如果常量池沒有"hsp",重新創建,如果有,直接通過value指向,最終指向的是堆中的空間地址,

  3. 畫出兩種方式的記憶體分布圖

image

測驗試題

測驗題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;
}

字串的特性

說明

  1. String是一個final類,代表不可變的字符序列

  2. 字串是不可變的,一個字串物件一旦被分配,其內容是不可變的.(指的是常量池中創建好的字串資料不能手動改變)

以下陳述句創建了幾個物件?畫出記憶體布局圖,

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

記憶體分析:

image

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

  1. String保存的是字串常量,里面的值不能更改,每次String類的更新實際上就是更改地址,效率較低//private final char value[];
  2. 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類

基本介紹

  1. 一個可變的字符序列,此類提供一個與StringBuffer 兼容的APl,但不保證同步(StringBuilder不是執行緒安全),該類被設計用作 StringBuffer的一個簡易替換,用在字串緩沖區被單個執行緒使用的時候,如果可能,建議優先采用該類,因為在大多數實作中,它比StringBuffer 要快[后面測],
  2. 在 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的比較

  1. StringBuilder 和 StringBuffer非常類似,均代表可變的字符序列,而且方法也一樣
  2. String:不可變字符序列,效率低,但是復用率高,
  3. StringBuffer:可變字符序列、效率較高(增刪)、執行緒安全
  4. StringBuilder:可變字符序列、效率最高、執行緒不安全
  1. String使用注意說明:
    string s="a";//創建了一個字串
    s +="b";//實際上原來的"a"字串物件已經丟棄了,現在又產生了一個字串s+"b”(也就是"ab"),如果多次執行這些改變串內容的操作,會導致大量副本字串物件存留在記憶體中,降低效率,如果這樣的操作放到回圈中,會極大影響程式的性能=>結論:如果我們對String做大量修改,不要使用String

效率:StringBuilder > StringBuffer > String

String、StringBuffer 和StringBuilder的選擇

使用的原則,結論:

  1. 如果字串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
  2. 如果字串存在大量的修改操作,并在單執行緒的情況,使用 StringBuilder
  3. 如果字串存在大量的修改操作,并在多執行緒的情況,使用 StringBuffer
  4. 如果我們字串很少修改,被多個物件參考,使用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里面包含了一系列靜態方法,用于管理或操作陣列(比如排序和搜索).

  1. toString回傳陣列的字串形式
    Arrays.toString(arr)

    int[] in={1,20,22};
    System.out.println(Arrays.toString(in));//[1, 20, 22]
    
  2. 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));
    
  3. 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);
    
  4. 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));
    
  5. 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]
    
  6. 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
    
  7. 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類常見方法和案例

  1. exit 退出當前程式

      System.out.println( "ok1");
      //解讀
      //1. exit(0)表示程式退出
      //2,0表示一個狀態,正常的狀態
      System.exit(0);
      System.out.println("ok2");
    
  2. 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));
    
  3. currentTimeMillens:回傳當前時間距離1970-1-1的毫秒數

    //currentTimeMilLens:回傳當前時間距離1970-1-1的毫秒數
    // 解讀:
    System.out.println(System.currentTimeMillis());
    
  1. gc:運行垃圾回識訓制System.gc();

Biglnteger類和BigDecimal類

BigInteger和BigDecimal介紹

應用場景:

  1. 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);//除
    
  2. 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日歷類以及新的日期

第一代日期類

  1. Date:精確到毫秒,代表特定的瞬間

  2. 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 星期一

第二代日期類

  1. 第二代日期類,主要就是Calendar類(日歷),
    public abstract class Calendar extends object implements Serializable,Cloneable, Comparable
  2. 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)·

第三代日期類常見方法

  1. LocalDate(日期/年月日)、LocalTime(時間/時分秒)、LocaIDateTime(日期時間/年月日時分秒)JDK8加入

    LocalDate只包含日期,可以獲取日期欄位

    LocalTime只包含時間,可以獲取時間欄位

    LocalDateTime包含日期+時間,可以獲取日期和時間欄位

  2. DateTimeFormatter格式日期類

    類似于SimpleDateFormat

    DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);

    String str = dtf.format(日期物件);

    1. 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();
  1. 第三代日期類更多方法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

上一篇:光說不練假把式,一起Kafka業務實戰。

下一篇:MultipartFile上傳檔案異步處理時的java.io.FileNotFoundException

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more