Javase隨機數(shù)類、日期類、包裝類的基礎(chǔ)知識示例詳解
一、Random隨機數(shù)類
1. 基本使用
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random random = new Random();
// 在int的范圍內(nèi)產(chǎn)生隨機數(shù)
int a = random.nextInt();
//bound:邊界的意思,不包含邊界10, 產(chǎn)生[0, 10) 范圍內(nèi)的隨機數(shù)
int b = random.nextInt(10);
// 產(chǎn)生[1, 11) 范圍內(nèi)的隨機數(shù),左右邊界一起+1
int c = random.nextInt(10) + 1;
//要是要產(chǎn)生[6,8]的隨機數(shù)就是x+6=(8+1),x=3,那就是nextInt(3)+6
//因為左邊界一定是0,想要左邊界為6就要+6
int c = random.nextInt(3) + 6;
}
}
2. Random類常用方法及使用場景
| 方法 | 使用方法及結(jié)果 | 實際開發(fā)使用場景 |
|---|---|---|
| nextInt(bound) | 返回[0, bound)范圍的隨機整數(shù) int num = random.nextInt(100); // 0-99 | 數(shù)組隨機索引、抽獎系統(tǒng)、驗證碼生成、游戲中的隨機事件、分頁數(shù)據(jù)隨機采樣 |
| nextDouble() | 返回[0.0, 1.0)的隨機雙精度數(shù) double prob = random.nextDouble(); // 0.0-1.0 | 概率判斷(如70%成功率)、隨機折扣計算、機器學(xué)習(xí)中的隨機初始化、A/B測試分組 |
| nextBoolean() | 返回true或false boolean flag = random.nextBoolean(); // true/false | 隨機開關(guān)功能、50%概率事件、隨機選擇是/否、隨機啟用/禁用特性 |
| nextInt() | 返回int范圍內(nèi)的隨機整數(shù) int randomNum = random.nextInt(); // -2³¹到2³¹-1 | 生成唯一ID種子、哈希計算、需要大范圍隨機數(shù)時 |
| nextLong() | 返回long范圍內(nèi)的隨機數(shù) long id = random.nextLong(); // 極大范圍隨機數(shù) | 生成數(shù)據(jù)庫主鍵、分布式ID生成、需要更大范圍隨機數(shù)時 |
| nextBytes() | 用隨機字節(jié)填充數(shù)組 byte[] bytes = new byte[16]; random.nextBytes(bytes); | 加密算法、生成隨機令牌、安全相關(guān)的隨機數(shù)生成 |
| nextFloat() | 返回[0.0, 1.0)的隨機浮點數(shù) float randFloat = random.nextFloat(); // 0.0-1.0 | 圖形處理、游戲物理引擎、需要輕量級浮點隨機數(shù)時 |
| nextGaussian() | 返回高斯分布隨機數(shù)(均值0,標準差1) double normal = random.nextGaussian(); | 統(tǒng)計學(xué)模擬、自然現(xiàn)象建模、金融風(fēng)險分析、AI訓(xùn)練數(shù)據(jù)生成 |
最常用的三個方法:
- nextInt(bound) - 使用頻率最高,幾乎每個需要隨機數(shù)的場景都會用到
- nextDouble() - 概率相關(guān)計算的必備方法
- nextBoolean() - 簡單的二選一隨機場景非常實用
3. 自定義范圍隨機數(shù)
根據(jù)1.基本使用的第四個方法[6,8]的推導(dǎo)得出
我們可以用封裝方法獲取指定范圍內(nèi)的隨機數(shù)
public static int getRandomInRange(int min, int max) {
Random random = new Random();
//左邊界一定是min,且包含min
//右邊界為max-min+1,如果不+1將會是,[min,max)不包含右邊界
return random.nextInt(max - min + 1) + min;
}
// 調(diào)用示例(在main函數(shù)里面的代碼):獲取[6,8]范圍內(nèi)的隨機數(shù)
int num = getRandomInRange(6, 8);
4. 種子(Seed)的作用
Random類支持設(shè)置種子,相同種子會產(chǎn)生相同的隨機數(shù)序列:
隨機出來的數(shù)字是固定好的
相同種子 第1次運行 從第一個到最后一個數(shù)字和 第n次運行 的第一個到最后的數(shù)字都是一一對應(yīng)相同的
Random random1 = new Random(123); // 固定種子 Random random2 = new Random(123); // 相同種子 // random1和random2將產(chǎn)生相同的隨機數(shù)序列
計算機生成的是偽隨機數(shù),實際上是通過種子值計算出來的序列。

二、日期時間類
1. Date類
Date類是Java中最基礎(chǔ)的日期類
(!??!不要和data搞混,data是數(shù)據(jù))
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
Date date = new Date();
// 自動調(diào)用toString(),
System.out.println(date);
//System.out.println(date.toString());但是會在編譯器里面發(fā)現(xiàn)toString()是灰色的,灰色的就是沒必要寫。
}
}
Date類的toString()方法也被重寫了,沒重寫的話就會打印出一個地址值(也就是object.toString()),重寫了會輸出可讀的日期時間格式(但其實也不是很能看得懂)。
Date類的方法


這些方法可以用來獲取時間的某些值,拼接輸出自己想要的日期格式,其實就是單純的字符串拼接。

劃斜杠的 就是已經(jīng)被jdk棄用了,不推薦使用
Date類的方法有很多,但是了解一下就行,有的方法可以用接下來會講的日歷類來轉(zhuǎn)化。
Date類的常用方法
// 獲取年份(需要+1900) int year = date.getYear() + 1900; // 獲取時間戳(1970年1月1日至今的毫秒數(shù)) long timestamp = date.getTime();
- getYear:計算機誕生1970左右,所以計算機把1900當(dāng)成起始年份,數(shù)出來的要再加上1900才是當(dāng)前年份
- getTime:時間戳,所有編程語言都有的,指的是到1970年一月一號零點零分零秒的毫秒數(shù)。
- 驗證:除以1000(1000毫秒=1秒),60,60,24,365(單位的換算)再加上1970就是當(dāng)前的年份,除完是個int類型但是其實還有一些毫秒被略掉了(類似于四舍五入),這些毫秒還可以再接著除拿來算幾月幾日幾點幾分幾秒。
2. Calendar日歷類
Calendar是抽象類,不能直接實例化:
就是沒辦法new Calendar() 來創(chuàng)建實例,只能借助他的靜態(tài)工廠方法 Calendar.getInstance() 來獲取一個 Calendar 類型的對象,這個對象實際上是它的某個具體子類(如 GregorianCalendar)的實例。

學(xué)習(xí)時候可以直接把calendar打印出來看看輸出什么,一步步理解。
打印出來一大堆亂七八糟但是又能看懂一點點的東西:(翻一下jdk看看每個變量代表啥意思,不然直接字面意思理解也行)
java.util.GregorianCalendar[time=1756092317924,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2025,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=5,DAY_OF_MONTH=25,DAY_OF_YEAR=237,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=25,SECOND=17,MILLISECOND=924,ZONE_OFFSET=28800000,DST_OFFSET=0]
日歷類常用方法
- Gettime():
把日歷類對象轉(zhuǎn)化為Date對象
Date times=calendar.getTime(); - Get():有返回值返回int類型,就是獲取日歷類對象的年、月……等等。
括號里面寫calendar.Year,calendar.Month……,里面也可以寫數(shù)字,但是要點進去看數(shù)字代表的是什么意思(對應(yīng)年、月……),不推薦。 - Set():沒有返回值,set(int field, int value)
里面左邊寫你想設(shè)置的年月日(calendar.Year…),右邊寫你想設(shè)置的值,如果你設(shè)置3000月,那么多出來的會換算加到年上(除12),日 也一樣會換算加到 月/年 上
只是修改了數(shù)據(jù),要查看的話還要用.getTime()方法來實例化一個Date對象。 - Add():同set()一樣沒有返回值
給年月…加上多少,可以傳負數(shù),相當(dāng)于減了
3. SimpleDateFormat日期格式化
格式化日期類:英文名太長記不住鍵盤連著敲SDF就行
在選擇構(gòu)造器的時候一般選第一個構(gòu)造器,選擇傳一個模板pattern
Pattern
使用占位符代替年月日時分秒的數(shù)據(jù),占位符的大小寫有區(qū)分!!
當(dāng)很多個一樣的占位符在一塊(如yyyyyyyyyyyy),他會只輸出后面的,前面的用000占位(變成000000002025),但是要是(yyyyMMyyyyMMyyyyMM)那他都會輸出出來(202508202508202508),因為他碰到了別的數(shù)據(jù)。
他的底層邏輯其實就是字符串的“替換”,和用date方法輸出想要的日期格式一樣。
查看jdk文檔看看占位符里每個字母代表啥意思

常用的占位符:
- yyyy:4位年份
- MM:2位月份
- dd:2位日期
- HH:24小時制小時
- mm:分鐘
- ss:秒
常用的pattern(模板):
SimpleDateFormat常用方法
- Sdf.fomat():有字符串的返回值
按照pattern的格式把傳進來的Date變成字符串
括號里面?zhèn)饕粋€時間,沒有就在里面new Date - Sdf. Parse():解析轉(zhuǎn)換,把長得像日期的字符串變成日期Date。
格式一定要和pattern一樣不然會報錯,編譯時會有異常,往上拋就行,parse的作者考慮到你傳過來的字符串可能是亂傳的所以他要你處理一下,在main后面加上throws parseexception,也可以try catch處理一下只要編譯時不報錯就行
代碼示例
import java.text.SimpleDateFormat;
import java.util.Date;
public class SDFDemo {
public static void main(String[] args) {
// 創(chuàng)建格式化模板
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化日期為字符串
String formattedDate = sdf.format(new Date());
System.out.println(formattedDate);
// 解析字符串為日期,也可以在main(String[] args)后面加上throws parseexception拋出異常
try {
Date date = sdf.parse("2025-08-25 12:00:00");
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
三、包裝類(Wrapper Classes)
1. 基本數(shù)據(jù)類型與包裝類對應(yīng)關(guān)系
總共八個基本數(shù)據(jù)類型
除了int和char變了,其他的都是改個大小寫
| 基本類型 | 包裝類 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
每個類型默認的數(shù)據(jù)類型:數(shù)字int,浮點double,字符char,布爾boolean
2. 裝箱與拆箱
- 裝箱: 把基本數(shù)據(jù)類型轉(zhuǎn)化為包裝類
在基本類型和包裝類互相對應(yīng)的時候可以用自動裝箱來轉(zhuǎn)化相應(yīng)類型
// 手動裝箱 Integer i1 = Integer.valueOf(100);//工廠方法 Integer i2 = new Integer(100);//構(gòu)造函數(shù)法 // 自動裝箱 直接賦值 //自動裝箱(autoboxing)會將基本類型 int 轉(zhuǎn)換為 Integer 類型 Integer i3 = 100;
- 拆箱: 把包裝類變回基本數(shù)據(jù)類型
// 手動拆箱 int value = i1.intValue(); // 自動拆箱 int num = i1;//直接把Integer類型的值賦給int類型的num int sum = i1 + i2;//進行運算
3. 小練習(xí)
下列五個分別輸出什么?有點難度
小提示:
基本數(shù)據(jù)類型和包裝類“= =”比較的是值
兩個包裝類對象之間的 “= =”比較的是地址

答案:TFFTT
解析:
true:包裝類(i7)與基本數(shù)據(jù)類型(i6)進行運算時會進行自動拆箱(i7=>int類型),比較的是兩個基本數(shù)據(jù)類型的值。
“==”是一種比較運算符也是運算Integer num = 100; int primitive = 100; // num (Integer) 會被自動拆箱成 int (調(diào)用 num.intValue()) // 然后比較兩個 int 值:100 == 100 System.out.println(num == primitive); // true
運算的類型:

false:兩個都是包裝類對象,不會自動拆箱,比較的是地址值。使用 new Integer() 創(chuàng)建的包裝類對象地址不同。
false:基本數(shù)據(jù)類型賦值給包裝類Java 會調(diào)用該包裝類的 valueOf 方法自動裝箱,但這題其實還是調(diào)用了new Integer() 創(chuàng)建一個新對象,像第二題一樣,使用new創(chuàng)建的包裝類地址不一樣【后面會結(jié)合2.3.5題詳細講一下】
true:intValue()得到的是基本數(shù)據(jù)類型,“==”在基本數(shù)據(jù)類型里面就是比較的值
true:重頭戲:結(jié)合第2.3.5題講一下
先介紹一下 new Integer()和Integer.valueOf() 的區(qū)別
- new Integer():他總是在創(chuàng)建新的對象。每次使用 new
關(guān)鍵字,都會在堆(Heap)上創(chuàng)建一個全新的、獨立的對象,無論值是否相同。不利用任何緩存。 - Integer.valueOf():他并不是每次都在創(chuàng)建新的對象。它內(nèi)部使用了一個靜態(tài)緩存池(cache pool),這個池預(yù)先創(chuàng)建并存儲了從 -128 到 127 范圍內(nèi)的所有 Integer 對象。當(dāng)調(diào)用Integer.valueOf(x)這個方法的時侯,他會先檢查x的值在不在 -128 到127這個范圍內(nèi),如果在它不會創(chuàng)建新對象,而是直接從緩存池中返回一個已有對象的引用,如果不在它才會調(diào)用 new Integer(x)創(chuàng)建一個新對象。
- 所以當(dāng)我們使用Integer.valueOf()方法創(chuàng)建相同的對象(-128 到 127范圍內(nèi))時,他們的地址是一樣的。
// 比較兩個包裝類對象時,通常是比較引用(除非有特殊情況,如 Integer 緩存) Integer num1 = 100; Integer num2 = 100; // 由于 Integer 緩存了 -128 到 127 的值,num1 和 num2 的地址相同 System.out.println(num1 == num2); // true (在緩存范圍內(nèi))
Integer num1 = 200; Integer num2 = 200; //200不在-128 到 127 的范圍內(nèi),將調(diào)用new Integer創(chuàng)建新對象 System.out.println(num1 == num2); // false (new創(chuàng)建的地址不一樣)
操作快捷鍵及注意事項
- new 類名()加上.var 然后回車會自動創(chuàng)建一個類,new Date().var => Date date = new Date();
- 當(dāng)不理解某些類的時候可以Ctrl單擊點進去查看方法的源碼,可以自己用軟件翻譯一下上面的注釋的解釋
- 通過查看JDK文檔和源碼,可以更深入地理解這些類的設(shè)計原理和使用方法
- sout加上回車 => System.out.println()
變量名.sout+回車 => System.out.println(變量名) - Ctrl+d往下復(fù)制一行,光標放在想復(fù)制的那一行
總結(jié)
到此這篇關(guān)于Javase隨機數(shù)類、日期類、包裝類的基礎(chǔ)知識的文章就介紹到這了,更多相關(guān)Javase隨機數(shù)類、日期類、包裝類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot 定時任務(wù)@Scheduled實現(xiàn)解析
這篇文章主要介紹了springboot 定時任務(wù)@Scheduled實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決
這篇文章主要介紹了詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)
在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標,甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達到80%或 90%。下面我們就來詳細學(xué)習(xí)下java單元測試吧2019-06-06

