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

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


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

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

學(xué)習(xí)時(shí)候可以直接把calendar打印出來(lái)看看輸出什么,一步步理解。
打印出來(lái)一大堆亂七八糟但是又能看懂一點(diǎn)點(diǎn)的東西:(翻一下jdk看看每個(gè)變量代表啥意思,不然直接字面意思理解也行)
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():
把日歷類對(duì)象轉(zhuǎn)化為Date對(duì)象
Date times=calendar.getTime(); - Get():有返回值返回int類型,就是獲取日歷類對(duì)象的年、月……等等。
括號(hào)里面寫(xiě)calendar.Year,calendar.Month……,里面也可以寫(xiě)數(shù)字,但是要點(diǎn)進(jìn)去看數(shù)字代表的是什么意思(對(duì)應(yīng)年、月……),不推薦。 - Set():沒(méi)有返回值,set(int field, int value)
里面左邊寫(xiě)你想設(shè)置的年月日(calendar.Year…),右邊寫(xiě)你想設(shè)置的值,如果你設(shè)置3000月,那么多出來(lái)的會(huì)換算加到年上(除12),日 也一樣會(huì)換算加到 月/年 上
只是修改了數(shù)據(jù),要查看的話還要用.getTime()方法來(lái)實(shí)例化一個(gè)Date對(duì)象。 - Add():同set()一樣沒(méi)有返回值
給年月…加上多少,可以傳負(fù)數(shù),相當(dāng)于減了
3. SimpleDateFormat日期格式化
格式化日期類:英文名太長(zhǎng)記不住鍵盤(pán)連著敲SDF就行
在選擇構(gòu)造器的時(shí)候一般選第一個(gè)構(gòu)造器,選擇傳一個(gè)模板pattern
Pattern
使用占位符代替年月日時(shí)分秒的數(shù)據(jù),占位符的大小寫(xiě)有區(qū)分!!
當(dāng)很多個(gè)一樣的占位符在一塊(如yyyyyyyyyyyy),他會(huì)只輸出后面的,前面的用000占位(變成000000002025),但是要是(yyyyMMyyyyMMyyyyMM)那他都會(huì)輸出出來(lái)(202508202508202508),因?yàn)樗龅搅藙e的數(shù)據(jù)。
他的底層邏輯其實(shí)就是字符串的“替換”,和用date方法輸出想要的日期格式一樣。
查看jdk文檔看看占位符里每個(gè)字母代表啥意思

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

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

false:兩個(gè)都是包裝類對(duì)象,不會(huì)自動(dòng)拆箱,比較的是地址值。使用 new Integer() 創(chuàng)建的包裝類對(duì)象地址不同。
false:基本數(shù)據(jù)類型賦值給包裝類Java 會(huì)調(diào)用該包裝類的 valueOf 方法自動(dòng)裝箱,但這題其實(shí)還是調(diào)用了new Integer() 創(chuàng)建一個(gè)新對(duì)象,像第二題一樣,使用new創(chuàng)建的包裝類地址不一樣【后面會(huì)結(jié)合2.3.5題詳細(xì)講一下】
true:intValue()得到的是基本數(shù)據(jù)類型,“==”在基本數(shù)據(jù)類型里面就是比較的值
true:重頭戲:結(jié)合第2.3.5題講一下
先介紹一下 new Integer()和Integer.valueOf() 的區(qū)別
- new Integer():他總是在創(chuàng)建新的對(duì)象。每次使用 new
關(guān)鍵字,都會(huì)在堆(Heap)上創(chuàng)建一個(gè)全新的、獨(dú)立的對(duì)象,無(wú)論值是否相同。不利用任何緩存。 - Integer.valueOf():他并不是每次都在創(chuàng)建新的對(duì)象。它內(nèi)部使用了一個(gè)靜態(tài)緩存池(cache pool),這個(gè)池預(yù)先創(chuàng)建并存儲(chǔ)了從 -128 到 127 范圍內(nèi)的所有 Integer 對(duì)象。當(dāng)調(diào)用Integer.valueOf(x)這個(gè)方法的時(shí)侯,他會(huì)先檢查x的值在不在 -128 到127這個(gè)范圍內(nèi),如果在它不會(huì)創(chuàng)建新對(duì)象,而是直接從緩存池中返回一個(gè)已有對(duì)象的引用,如果不在它才會(huì)調(diào)用 new Integer(x)創(chuàng)建一個(gè)新對(duì)象。
- 所以當(dāng)我們使用Integer.valueOf()方法創(chuàng)建相同的對(duì)象(-128 到 127范圍內(nèi))時(shí),他們的地址是一樣的。
// 比較兩個(gè)包裝類對(duì)象時(shí),通常是比較引用(除非有特殊情況,如 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)建新對(duì)象 System.out.println(num1 == num2); // false (new創(chuàng)建的地址不一樣)
操作快捷鍵及注意事項(xiàng)
- new 類名()加上.var 然后回車會(huì)自動(dòng)創(chuàng)建一個(gè)類,new Date().var => Date date = new Date();
- 當(dāng)不理解某些類的時(shí)候可以Ctrl單擊點(diǎn)進(jìn)去查看方法的源碼,可以自己用軟件翻譯一下上面的注釋的解釋
- 通過(guò)查看JDK文檔和源碼,可以更深入地理解這些類的設(shè)計(jì)原理和使用方法
- sout加上回車 => System.out.println()
變量名.sout+回車 => System.out.println(變量名) - Ctrl+d往下復(fù)制一行,光標(biāo)放在想復(fù)制的那一行
總結(jié)
到此這篇關(guān)于Javase隨機(jī)數(shù)類、日期類、包裝類的基礎(chǔ)知識(shí)的文章就介紹到這了,更多相關(guān)Javase隨機(jī)數(shù)類、日期類、包裝類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java ReentrantLock條件鎖實(shí)現(xiàn)原理示例詳解
這篇文章主要為大家介紹了java ReentrantLock條件鎖實(shí)現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式
這篇文章主要介紹了Mybatis插件+注解實(shí)現(xiàn)數(shù)據(jù)脫敏方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Flowable數(shù)據(jù)庫(kù)表分類及數(shù)據(jù)字典解析
這篇文章主要介紹了Flowable數(shù)據(jù)庫(kù)表分類及數(shù)據(jù)字典解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Disconf實(shí)現(xiàn)分布式配置管理的原理與設(shè)計(jì)
這篇文章主要為大家介紹了Disconf實(shí)現(xiàn)分布式配置管理的原理與設(shè)計(jì)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Java反射獲取所有Controller和RestController類的方法
這篇文章給大家分享了Java反射獲取所有Controller和RestController類的方法,文中有詳細(xì)的代碼示例講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08
ElasticSearch突然采集不到日志問(wèn)題解決分析
這篇文章主要為大家介紹了ElasticSearch突然采集不到日志問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java利用ip2region實(shí)現(xiàn)獲取IP地址詳情
ip2region是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,提供了眾多主流編程語(yǔ)言的?xdb?數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn)。本文將利用ip2region實(shí)現(xiàn)獲取IP地址詳情,感興趣的可以了解一下2022-07-07
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之在線美食網(wǎng)站系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)在線美食網(wǎng)站系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
java中數(shù)組的相關(guān)知識(shí)小結(jié)(推薦)
下面小編就為大家?guī)?lái)一篇java中數(shù)組的相關(guān)知識(shí)小結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07

