網上理論上的概念都大同小異,使用自己的方式來理解,把他"吃透",這樣才能變成你自己財富。
包裝類
在Java中基本數據類型都存放在棧內存中,那我們如果想把基本數據類型存放在堆中,那該如何來進行處理呢?這時我們就可以使用包裝類來實現。
| 基本數據類型 | 對應的包裝類 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
基本數據類型轉換為引用數據類型稱為裝箱
包裝好的數據類型轉換為基本數據類型稱為拆箱
Integer num1 = 12; // 自動裝箱
int num2 = num1; // 自動拆箱
常用工具類
System
將指定源數組中的數組從指定位置復制到目標數組的指定位置。
System.in:輸入
System.out:輸出
System.err:輸出錯誤
System.arraycopy:數據拷貝
// System.arraycopy(源數組, 從源數組指定索引開始截取, 目標數組, 從目的數組指定的位置開始存放, 要復制的數組元素的數量);
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// 例:
int[] arr = {5,8,4,3,9,7};
int[] newArr = new int[10];
System.arraycopy(arr, 0, newArr, 2, arr.length);
System.out.println(Arrays.toString(newArr));
獲取JVM環境在運行時的數據
/**
* 獲取Java程序運行時操作系相關的數據
*/
public class TestSystem {
public static void main(String[] args) {
// 獲取當前Java程序運行時,操作系統的名稱
String osName= System.getProperty("os.name");
System.out.println(osName); // Windows 10
// 獲取操作系統位數(os.arch 獲取操作系統的架構)
String arch = System.getProperty("os.arch");
System.out.println(arch);
// 獲取操作系統當前正在使用的目錄類路徑
String dir = System.getProperty("user.dir");
System.out.println(dir);
}
}
Random
該類的實例用於生成偽隨機數的流。Random返回隨機數的范圍為[0, 1);
public static void main(String[] args) {
Random random = new Random();
int num = random.nextInt(10); // 隨機輸出一個[0, 10)之間的數字
System.out.println(num);
}
Math
Math類包含執行基本數字運算的方法,如基本指數,對數,平方根和三角函數。
常用方法:
public static void main(String[] args) {
System.out.println("圓周率" + Math.PI);
System.out.println("絕對值:" + Math.abs(-8));
System.out.println("向上取整:" + Math.ceil(3.14));
System.out.println("向下取整:" + Math.floor(3.14));
System.out.println("返回兩個數的較大值:" + Math.max(2, 8));
System.out.println("返回兩個數的較小值:" + Math.min(2, 8));
System.out.println("平方根:" + Math.sqrt(8));
System.out.println("計算2的8次方" + Math.pow(2, 8));
System.out.println("正弦值" + Math.sin(30));
System.out.println("余弦值" + Math.cos(30));
System.out.println("正切值" + Math.tan(30));
System.out.println("四舍五入:" + Math.round(10.5));
System.out.println("四舍五入:" + Math.round(-10.5));
}
UUID
通用唯一識別碼( Universally Unique Identifier )。一個表示不可變的通用唯一標識符(UUID)的類。SinceJDK1.5
import java.util.UUID;
/**
* 面試題:如何產生一個唯一識別碼(標識符)
*/
public static void main(String[] args) {
// 隨機產生一個UUID對象(通用唯一識別碼)
UUID randomUUID = UUID.randomUUID();
System.out.println(randomUUID.toString());
}
Runtime
能夠獲取程序在運行時的數據(總的堆內存空間,自由(剩余)堆內存空間),還可以啟動進程
內存使用率
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public static void main(String[] args) {
// 獲取總空間
Runtime runtime = Runtime.getRuntime();
// 獲取JVM總空間
long total = runtime.totalMemory();
// 獲取JVM空閑空間
long free = runtime.freeMemory();
// 當前使用空間
long usedMemory = total - free;
// 獲取當前使用率
double useRate = 1.0*100*usedMemory/total;
/* BigDecimal:有效位的數進行精確的運算
* MathContext(指定的精度, 舍入模式):根據上下文設置進行舍入
* RoundingMode:指定丟棄精度的數值運算的舍入行為
*/
BigDecimal bDecimal = new BigDecimal(useRate, new MathContext(3, RoundingMode.HALF_UP));
System.out.println("使用率:" + bDecimal + "%");
}
Runtime總常見的陷阱:https://www.jianshu.com/p/af4b3264bc5d
日期工具類
Date
日期類:一般用來獲取展示時間的類。
public static void main(String[] args) {
// currentTimeMillis:獲取從1970.01.01 00:00:00到現在的毫秒數
long time = System.currentTimeMillis();
System.out.println(time);
Date date = new Date();
System.out.println(date); // Sat Sep 07 20:54:07 CST 2019
}
SimpleDateFormat
格式化時間:常用的標准寫法“ yyyy-MM-dd HH:mm:ss ”。
import java.util.Date;
import java.text.SimpleDateFormat;
public class SimpleDateFormatTool {
public static void main(String[] args) {
Date date = new Date();
/*
* G :年代標志符
* y :年
* M :月
* d :日
* h :小時(12小時制)
* H :小時(24小時制)(0-23)
* m :分
* s :秒
* S :毫秒
* E :星期
* D :一年中的第幾天
* F :一個月中的第幾個星期
* w :一年中的第幾周
* W :一個月中的第幾周
* k :一天中的小時數(1-24)
* K :上午(am)/下午(pm)中的小時數(0-11)
* z/Z :時區
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 將日期時間轉換為指定的格式
String format = sdf.format(date);
System.out.println(format);
}
}
Calendar
Calendar類是一個抽象類,不可以使用new關鍵字直接創建實例。
Calendar可以為在某一特定時刻和一組之間的轉換的方法 calendar fields(日歷域) 如YEAR , MONTH , DAY_OF_MONTH , HOUR 等等,以及用於操縱該日歷字段,如獲取的日期下個星期。
import java.util.Calendar;
/**
* 使用默認時區和區域設置獲取日歷
*/
public class TestCalendar {
public static void main(String[] args) {
Calendar ca = Calendar.getInstance();
// get:返回給定日歷字段的值。
// YEAR:年份
int year = ca.get(Calendar.YEAR);
System.out.println(year);
// MONTH:月份
System.out.println(ca.get(Calendar.MONTH));
// DATE:本月的日期
System.out.println(ca.get(Calendar.DATE));
// DAY_OF_MONTH:一周中的日期
System.out.println(ca.get(Calendar.DAY_OF_MONTH));
// 一個月的第幾周
System.out.println(ca.get(Calendar.DAY_OF_WEEK_IN_MONTH));
// 一個月的第幾天
System.out.println(ca.get(Calendar.DAY_OF_MONTH));
// HOUR_OF_DAY:當天的小時數
System.out.println(ca.get(Calendar.HOUR_OF_DAY));
// MINUTE:分
System.out.println(ca.get(Calendar.MINUTE));
// SECOND:秒
System.out.println(ca.get(Calendar.SECOND));
// 注意:靜態成員和靜態方法不要使用名稱來調用,必須使用名稱來調用。
System.out.println(ca.get(ca.SECOND));
// set:設置日歷字段的值
// set(int field, nt value);
// field -> 給定的日歷字段
// value -> 要為給定日歷字段設置的值
ca.set(Calendar.YEAR, 2020);
Date time = ca.getTime();
System.out.println(time);
// set(int year, int month, int date, int hourOfDay, int minute, int second);
// year -> 用於設置 YEAR日歷字段的值。
// month -> 用於設置MONTH日歷字段的值。 月值為0。 例如,1月份為0。
// date -> 用於設置 DAY_OF_MONTH日歷字段的值。
// hourOfDay -> 用於設置 HOUR_OF_DAY日歷字段的值。
// minute -> 用於設置 MINUTE日歷字段的值。
// second -> 用於設置 SECOND日歷字段的值。
}
}
JDK1.8以后新增的幾種日期工具類
LocalDate
LocalDate是不可變的和線程安全的。
LocalDate是一個不可變的日期時間對象,表示日期,通常被視為年月日。 也可以訪問其他日期字段,例如日期,星期幾和星期。
import java.time.LocalDate;
public class TestLocalDate {
public static void main(String[] args) {
// 獲取當前日期(年-月-日)
LocalDate time = LocalDate.now();
// 將日期轉換成字符串類型
String str = time.toString();
System.out.println(str);
// 設置日期 of(年份, 月份, 月中的天數)
LocalDate of = LocalDate.of(2020, 10, 1);
System.out.println(of);
// 獲取年
System.out.println(time.getYear());
// 獲取月
System.out.println(time.getMonth());
// 獲取當前月的天數
System.out.println(time.getDayOfMonth());
// 獲取一年中的天數
System.out.println(time.getDayOfYear());
// 獲取當天星期幾
System.out.println(time.getDayOfWeek());
}
}
LocalTime
LocalTime是不可變的和線程安全的。
LocalTime是一個不可變的日期時間對象,代表一個時間,通常被看作是小時 - 秒。 時間表示為納秒精度。
import java.time.LocalTime;
public class TestLocalDate {
public static void main(String[] args) {
// now():獲取當前時間(時-分-秒-納秒)
// withNano(0):去除納秒
LocalTime time = LocalTime.now().withNano(0);
// 將時間轉換成字符串類型
String str = time.toString();
System.out.println(str);
// 獲取小時
System.out.println(time.getHour());
// 獲取分鍾
System.out.println(time.getMinute());
// 獲取秒
System.out.println(time.getSecond());
}
}
LocalDateTime
LocalDateTime是不可變的和線程安全的。
LocalDateTime是一個不可變的日期時間對象,代表日期時間,通常被視為年 - 月 - 日 - 時 - 分 - 秒。 也可以訪問其他日期和時間字段,例如日期,星期幾和星期。 時間表示為納秒精度。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* LocalDateTime可以認為是LocalDate和LocalTime的結合體。
*/
public class TestLocalDateTime {
public static void main(String[] args) {
// now():獲取當前時間
LocalDateTime time = LocalDateTime.now();
System.out.println(time); // 2019-09-08T14:10:06.662
// withNano(0):去除納秒
LocalDateTime withNano = time.withNano(0);
System.out.println(withNano); // 2019-09-08T14:10:06
// JDK1.8以后的日期轉換類 (通過定義格式可以把“T”去掉)
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatTime = ofPattern.format(time);
System.out.println(formatTime); // 2019-09-08 14:10:06
}
}
Flie類
File:文件和目錄路徑名的抽象表示代表表磁盤中實際存在的文件和目錄。
import java.io.File;
public class TestFile {
public static void main(String[] args) {
// 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例
// 注意:多層路徑下用“\\”來連接
new File("text\\Test.java");
// 從父抽象路徑名和子路徑名字符串創建新的 File實例
File file = new File("text", "Test.java");
System.out.println(file);
}
}
exists()
測試此路徑下的文件或目錄是否存在,true(存在)、false(不存在)。
boolean exists = file.exists();
System.out.println(exists);
isDirectory()
測試此路徑名表示的文件是否為目錄,true(是目錄)、false(不是目錄)。
boolean directory = file.isDirectory();
System.out.println(directory);
isFile()
測試此路徑名表示的文件是否為文件,true(是文件)、false(不是文件)。
boolean file2 = file.isFile();
System.out.println(file2);
創建目錄、文件及刪除
mkdir()
創建由此路徑名命名的目錄,true(創建成功)、false(創建失敗);只能創建一個目錄。
File file= new File("textDemo");
if (!file.exists()) {
boolean mkdir = file.mkdir();
System.out.println(mkdir);
}else {
System.out.println(false);
}
mkdirs()
創建由此路徑名命名的目錄,包括所有必需但不存在的父目錄,true(創建成功)、false(創建失敗);可創建一個目錄,也可創建多及目錄(推薦)
File file= new File("textDemo\\aaa\\bbb");
if (!file.exists()) {
boolean mkdir = file.mkdirs();
System.out.println(mkdir);
}else {
System.out.println(false);
}
createNewFile()
當該名稱的文件尚不存在時,創建一個由該路徑名命名的新的空文件,true(創建成功)、false(創建失敗)。
import java.io.File;
public class TestFile {
public static void main(String[] args) {
// 從父抽象路徑名和子路徑名字符串創建新的 File實例
File file = new File("text", "TestDemo.java");
System.out.println(file);
// 這里需要拋出異常
try {
boolean createNewFile = file.createNewFile();
System.out.println(createNewFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
delete()
刪除由此抽象路徑名表示的文件或目錄。 如果此路徑名表示目錄,則目錄必須為空才能刪除。true(刪除成功)、false(刪除失敗)。
boolean delete = file.delete();
System.out.println(delete);
注意:此方法刪除,直接刪除,不進回收站,謹慎使用。
獲取路徑
import java.io.File;
public class GetPath {
public static void main(String[] args) {
File file = new File("text", "Test.java");
// 返回此抽象路徑名的絕對形式
File absoluteFile = file.getAbsoluteFile();
System.out.println(absoluteFile);
// 返回此抽象路徑名的絕對路徑名字符串
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
// 返回父目錄的路徑名
File parentFile = file.getParentFile();
System.out.println(parentFile);
// 將此抽象路徑名轉換為路徑名字符串
String fileName = file.getName();
System.out.println(fileName);
}
}
length()
返回路徑名表示的文件的長度(字節數)
long length = file.length();
System.out.println(length);
list()
返回一個字符串數組,由此路徑名表示的目錄中的所有文件和目錄。
File file = new File("D:\\學習\\筆記\\Java\\Java SE");
String[] list = file.list();
for (String str : list) {
System.out.println(str);
}
listFiles()
獲取指定路徑下的所有文件的路徑。
File file = new File("D:\\學習\\筆記\\Java\\Java SE");
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
System.out.println(file2);
}
獲取指定路徑下以某后綴結尾的所有文件的路徑
import java.io.File;
import java.io.FilenameFilter;
public class TestFileFilter {
public static void main(String[] args) {
File file = new File("D:\\學習\\筆記\\Java\\Java SE");
File[] listFiles = file.listFiles(new TestFileFilterImpl());
for (File file2 : listFiles) {
System.out.println(file2);
}
}
// FilenameFilter -->文件過濾器
// 實現FilenameFilter接口需重寫accept()方法
static class TestFileFilterImpl implements FilenameFilter {
// 濾波器的方法
@Override
public boolean accept(File dir, String name) {
// 由指定的字符串的后綴進行過濾
return name.endsWith(".md");
}
}
}
獲取指定路徑下以某后綴結尾的所有文件的路徑(lambda寫法)
import java.io.File;
public static void main(String[] args) {
File file = new File("D:\\學習\\筆記\\Java\\Java SE");
File[] listFiles = file.listFiles((dir,name)->name.endsWith(".md"));
for (File file2 : listFiles) {
System.out.println(file2);
}
}
listRoots()
獲取系統所有的盤符。
File[] listRoots = File.listRoots();
for (File file2 : listRoots) {
System.out.println(file2);
}
磁盤使用率
import java.io.File;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
/**
* 計算磁盤使用率
*/
public class TestFileDiskRage {
public static void main(String[] args) {
File file = new File("..");
System.out.println(file.getAbsolutePath());
// 當前磁盤總空間
long totalSpace = file.getTotalSpace();
// 空閑空間
long freeSpace = file.getFreeSpace();
// 已使用的空間
double usageRate = 1.0*100*(totalSpace - freeSpace)/totalSpace;
// BigDecimal:有效位的數進行精確的運算
// MathContext(指定的精度, 舍入模式):根據上下文設置進行舍入
// RoundingMode:指定丟棄精度的數值運算的舍入行為
BigDecimal bDecimal = new BigDecimal(usageRate, new MathContext(3, RoundingMode.HALF_UP));
System.out.println("當前磁盤使用率:" + bDecimal + "%");
}
}
刪除目錄
刪除某個文件夾下面所有的子文件夾和文件
import java.io.File;
public class TestDeleteFile {
public static void main(String[] args) {
File file = new File("textDemo");
deleteFolderOrFile(file);
}
public static boolean deleteFolderOrFile(File file){
// 判斷該路徑是否存在並且該路徑是否是文件夾
if (file.exists() && file.isDirectory()) {
// //獲取路徑下面所有的文件和目錄列表
File[] listFiles = file.listFiles();
// 遍歷當前文件夾的所有文件及目錄
for (File allFilePath : listFiles) {
// File(parent, child):
// parent:父路徑
// child:子路徑的文件名或者目錄名
File allFile = new File(file, allFilePath.getName());
// 遞歸進行查找刪除(每次自己調用自己都有一個壓棧的過程)
deleteFolderOrFile(allFile);
}
}
//當路徑是文件直接刪除
return file.delete();
}
}
枚舉(enum)
枚舉(enum)類型是JDK1.5新增的特性,存放在 java.lang 包中,創建枚舉需要使用 enum 關鍵字來創建。
定義枚舉格式:
修飾符 enum 枚舉名 {
枚舉體(常量列表)
}
例1:
public enum EWeek {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
例2:
public enum EColour {
RED((byte) 1) {
@Override
public void color() {
System.out.println("紅色");
}
},
YELLOW((byte) 2) {
@Override
public void color() {
System.out.println("黃色");
}
},
TEAL((byte) 3) {
@Override
public void color() {
System.out.println("青色");
}
},
BLUE((byte) 4) {
@Override
public void color() {
System.out.println("藍色");
}
};
private byte id;
public byte getId() {
return id;
}
private EColour(byte id) {
this.id = id;
}
/**
* 內部定義顏色抽象方法,枚舉中的所有類型都要重寫該方法
*/
public abstract void color();
}
