Java常用類庫StringBuffer,Runtime,日期操作類等類庫總結(jié)
1):StringBuffer類:
String、StringBuffer、StringBuilder的區(qū)別
1.String一旦聲明,不可改變,StringBuffer與StringBuilder聲明的內(nèi)容可以改變
2.StringBuffer類中提供的方法都是同步方法,屬于安全的線程操作,而StringBuilder類中大的方法都是屬于異步方法,屬于非線程安全的操作。
2):Runtime類
Runtime類是Java中與運行時環(huán)境有關(guān)的操作類,利用此類可以取得系統(tǒng)的內(nèi)存信息,也可以利用此類產(chǎn)生新的操作系統(tǒng)進程對象。
Runtime類表示運行時操作類,是一個封裝了JVM進程的類,每一個JVM都對應(yīng)著一個Runtime類的實例,此實例由JVM運行時為其實例化。
Runtime run = Runtime.getRuntime();
package library;
public class RuntimeDemo {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();//通過Runtime類的靜態(tài)方法為其進行實例化操作
System.out.println("JVM最大內(nèi)存量:"+run.maxMemory());//觀察最大內(nèi)存量,根據(jù)機器環(huán)境會有所不同
System.out.println("JVM空閑內(nèi)存量:"+run.freeMemory());//取得程序運行時的內(nèi)存空閑量
String str = "Hello"+"World"+"!!!"+"\t"+"Welcome"+"To"+"MLDN"+"~";
System.out.println(str);
for (int i = 0; i < 100; i++) {//循環(huán)修改Sting,產(chǎn)生多個垃圾,會占用內(nèi)存
str+=i;
}
System.out.println("操作String之后的,JVM空閑內(nèi)存量:"+run.freeMemory());//觀察有多個垃圾空間產(chǎn)生之后的內(nèi)存空閑量
run.gc();//進行垃圾收集,釋放空間
System.out.println("垃圾回收之后的,JVM空閑內(nèi)存量:"+run.freeMemory());//垃圾收集之后的內(nèi)存空閑量。
}
}
結(jié)果:
JVM最大內(nèi)存量:66650112
JVM空閑內(nèi)存量:4934616
HelloWorld!!! WelcomeToMLDN~
操作String之后的,JVM空閑內(nèi)存量:4877968
垃圾回收之后的,JVM空閑內(nèi)存量:5015840
1.GC(Garbage Collector,垃圾收集器)指的是釋放無用的內(nèi)存空間。
2.GC會由系統(tǒng)不定期進行自動回收,或者調(diào)用Runtime類中的gc()方法手工回收。
Runtime類與Process類
調(diào)用本機可執(zhí)行程序
package library;
import java.io.IOException;
/**
* 調(diào)用本機可以執(zhí)行程序
* 讓記事本進程5s后消失
*/
public class RuntimeDemo2 {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();//通過Runtime類的靜態(tài)方法為其進行實例化操作
Process pro = null;//聲明一個Process對象,接受啟動的進程
try {
pro = run.exec("notepad.exe");//調(diào)用本機程序,必須進行異常處理
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();//打印異常信息
}
try {
Thread.sleep(5000);//讓此線程存活5s
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();//打印異常信息
}
pro.destroy();//結(jié)束此進程
}
}
3):國際化程序
國際化操作是指程序可以同時適應(yīng)多門語言。
實現(xiàn)國際化光靠Locale類是不夠的,還需要屬性文件和ResourceBundle類的支持。屬性文件是指擴展名為.properties的文件,文件中的內(nèi)容保存結(jié)構(gòu)是一種“key=value”的形式,因為國際化的程序只顯示語言的不同,那么就可以根據(jù)不同的國家定義不同的屬性文件,屬性文件中保存真正要使用的文字信息,要訪問這些屬性文件,可以使用ResourceBundle類來完成。
實現(xiàn)java程序國際化操作必須通過一下3各類完成:
java.util.Local-----java.util.ResourceBundle---MessageFormat
通過Locale類所指定的區(qū)域碼,然后ResourceBundle根據(jù)Locale類所指定的區(qū)域碼找到相應(yīng)的資源文件,如果資源文件(屬性文件)中存在動態(tài)文本,子使用MesssageFormat進行格式化。
屬性文件定義時,必須要按照“名稱_國家代碼”的形式命名,即所有的相關(guān)屬性文件的名稱全部一樣,只有國家的代碼不一樣,代碼如下
(處理動態(tài)文本:以中文為例是:”你好,xxx!“,其中“xxx”的內(nèi)容是由程序動態(tài)設(shè)置的,那么就需要使用占位符清楚地表示出動態(tài)文本的位置,占位符使用“{編號}”的格式出現(xiàn)。使用占位符之后,程序可以使用MessageFormat對信息進行格式化。為占位符動態(tài)設(shè)置文本的內(nèi)容。)
1.中文的屬性代碼文件:Message_zh_CN.propertiesinfo = \u4f60\u597d\uff01
以上信息就是中文:你好,{0}!
2.英語屬性文件:Message_en_US.properties
info = Hello,{0}!
3.法語屬性文件:Message_fr_FR.properties
info = Bonjour,{0}!
通過Locale類和ResourceBundle類讀取屬性文件的內(nèi)容,代碼如下:
package library;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class InterDemo {
public static void main(String[] args) {
Locale zhLoc = new Locale("zh","CN");//表示中國地區(qū)
Locale enLoc = new Locale("en","US");
Locale frLoc = new Locale("fr","FR");
ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc);//找到中文的屬性文件(.getBundle(文件名稱,區(qū)域碼))
ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc);
ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc);
String str1 = zhrb.getString("info");
String str2 = enrb.getString("info");
String str3 = frrb.getString("info");
System.out.println("中文:"+MessageFormat.format(str1, "你好"));//通過鍵值讀取屬性文件的類容
System.out.println("英文:"+MessageFormat.format(str2, "nihao"));
System.out.println("法文:"+MessageFormat.format(str3, "nihao"));
}
}
結(jié)果:
中文:你好,你好!
英文:Hello,Hello!
法文:Bonjour,Hello!
多個占位符設(shè)置多個動態(tài)文本:
MessageFormat.format(str1,"你好",“hello”,"hello")
info = Hello,{0},{1},{2}!
4):System類、
System類是一些與系統(tǒng)相關(guān)的屬性和方法的集合,而且在System類中所有的書信給都是靜態(tài)的,要引用這些屬性和方法,直接使用System類調(diào)用即可。
System.gc():垃圾對象的回收,如果在一個對象被回收之前要進行某些操作,那么該怎么辦呢,實際上,在Object類中有一個finalize()方法,此方法定義如下:
protected void finalize() throws Throwable
package library.finalize;
public class Person {
private String name;
private int age ;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "年齡:age=" + age + ",姓名: name=" + name ;
}
public void finalize()throws Throwable{//對象釋放空間時默認調(diào)用此方法
System.out.println("對象被釋放 -->"+this);//直接打印對象調(diào)用toString
}
public static void main(String[] args) {
Person per = new Person("張三",30);
per = null;//斷開引用釋放空間
//以上代碼不會在顯示器顯示輸出
System.gc();//強制性釋放空間,,會調(diào)用fianlize()方法
}
}
結(jié)果:
對象被釋放 -->年齡:age=30,姓名: name=張三
5):日期操作類
Date類:實例化對象 Date date = new Date();------輸出當前日期
Calendar類,可以將取得的時間精確到毫秒,但是他是一個抽象類,依靠其子類GregorianCalendar類。
Dateformat類
SimpleDateFormat類
6)Math類
7):Random類
8):NumberFormat類
9):BigInteger類
10):Bigdecimal類
11):對象克隆技術(shù)
12):Arrays類
package library;
import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int temp[] = {3,5,7,9,1,2,6,8};
Arrays.sort(temp); //數(shù)組排序
System.out.println("排序后數(shù)組:");
System.out.println(Arrays.toString(temp));//以字符串輸出數(shù)組
int point = Arrays.binarySearch(temp, 3);//檢索數(shù)據(jù)位置
System.out.println("元素3的位置在:"+point);
Arrays.fill(temp, 3); //填充數(shù)組
System.out.println("數(shù)組填充:");
System.out.println(Arrays.toString(temp));//一字符串輸出數(shù)組
}
}
結(jié)果:
排序后數(shù)組:
[1, 2, 3, 5, 6, 7, 8, 9]
元素3的位置在:2
數(shù)組填充:
[3, 3, 3, 3, 3, 3, 3, 3]
13):Comparable接口
比較器主要是針對對象數(shù)組的操作
package library.comparabledemo;
import java.util.Arrays;
public class Student implements Comparable<Student> {
private String name;
private int age;
private float score;
public Student(String name, int age, float score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", score=" + score
+ "]";
}
@Override
public int compareTo(Student o) {
if (this.score>o.score) {
return -1;
}else if (this.score<o.score) {
return 1;
} else {
if (this.age>o.age) {
return 1;
}else if (this.age<o.age) {
return -1;
}else {
return 0;
}
}
}
public static void main(String[] args) {
Student stu[] = {new Student("張三",20,90.0f),new Student("王五", 20, 99.0f),
new Student("孫七", 22, 100.0f),new Student("李四", 22, 9.0f),
new Student("趙六", 20, 70.0f),};
Arrays.sort(stu);
for (int i = 0; i < stu.length; i++) {
System.out.println(stu[i]);
}
}
}
結(jié)果:
Student [age=22, name=孫七, score=100.0]
Student [age=20, name=王五, score=99.0]
Student [age=20, name=張三, score=90.0]
Student [age=20, name=趙六, score=70.0]
Student [age=22, name=李四, score=9.0]
分析比較器的排序原理
使用的是二叉樹排序方法,即通過二叉樹進行排序,然后利用中序遍歷的方式把內(nèi)容依次讀取出來。
二叉樹排序的基本原理就是:將第1個內(nèi)容作為根節(jié)點保持,如果后面的值比根節(jié)點的值小,則放在根節(jié)點的左子樹,如果后面的值比根節(jié)點的值大,則放在根節(jié)點的右子樹。
找這樣的思路,如果給出了一下數(shù)字:8、3、10、14、6、4、7、1、13
在根據(jù)中序遍歷的原理(左子樹---根節(jié)點---右子樹的方式),排序后的結(jié)果:1、3、4、6、7、8、10、13、14

package library.comparabledemo;
public class BinaryTree {
class Node{ //申明一個節(jié)點類
private Comparable data; //保存具體類容
private Node left; //保存左子樹
private Node right; //保存右子樹
public void addNode(Node newNode){
if(newNode.data.compareTo(this.data)<0){
if(this.left==null){ //放在左子樹
this.left = newNode;
}else {
this.left.addNode(newNode); //遞歸
}
}
if(newNode.data.compareTo(this.data)>=0){
if (this.right==null) { //放在右子樹
this.right = newNode;
}else {
this.right.addNode(newNode); //遞歸
}
}
}
public void printNode(){ //輸出時采用中序遍歷
if(this.left!=null){ //如果左子樹有值,則遞歸調(diào)用該方法,該操作會將中序,root.data左邊的數(shù)字現(xiàn)輸出,而且時從小到大的順序
this.left.printNode();
}
System.out.print(this.data+"\t"); //輸出root.data--->根節(jié)點
if (this.right!=null) { //如果右子樹有值,則遞歸調(diào)用該方法,該操作會將中序,root.data左邊的數(shù)字現(xiàn)輸出,而且時從小到大的順序
this.right.printNode();
}
}
}
private Node root; //根元素
public void add(Comparable data){
Node newNode = new Node(); //每傳入一個數(shù)值,就聲明一個新的根節(jié)點
newNode.data = data;
if (root == null) {
root = newNode; //如果是第1個元素,設(shè)置根節(jié)點
}else {
root.addNode(newNode); //確定結(jié)點是放在左子樹還是右子樹
}
}
public void print(){ //輸出節(jié)點
this.root.printNode();
}
public static void main(String[] args) {
BinaryTree bt = new BinaryTree();
bt.add(8);
bt.add(7);
bt.add(14);
bt.add(10);
bt.add(4);
bt.add(1);
bt.add(13);
bt.add(6);
bt.add(3);
System.out.println("排序后的結(jié)果:");
bt.print();
}
}
結(jié)果:
排序后的結(jié)果:
1 3 4 6 7 8 10 13 14
15):Observable類和Observer接口
他們可實現(xiàn)觀察者模式
16):正則表達式
常用正則規(guī)則
| 序號 | 規(guī)范 | 描述 | 序號 | 規(guī)范 | 描述 |
|---|---|---|---|---|---|
| 1 | \\ | 表示反斜線(\)字符 | 9 | \w | 字母、數(shù)字、下劃線 |
| 2 | \t | 制表符 | 10 | \W | 非字母、數(shù)字、下劃線 |
| 3 | \n | 換行 | 11 | \s | 所有的空白字符(如:換行,空格等) |
| 4 | [abc] | 字符a、b 或c | 12 | \S | 所有非空白字符 |
| 5 | [^abc] | 除了abc以外的任意字符 | 13 | ^ | 行的開頭 |
| 6 | [a-zA-Z0-9] | 由字母、數(shù)字組成 | 14 | $ | 行的結(jié)尾 |
| 7 | \d | 數(shù)字 | 15 | . | 匹配除換行符之外的任意字符 |
| 8 | \D | 非數(shù)字 |
數(shù)量表示(X表示一組規(guī)范)
| 序號 | 規(guī)范 | 描述 | 序號 | 規(guī)范 | 描述 |
|---|---|---|---|---|---|
| 1 | X | 必須出現(xiàn)依次 | 5 | X{n} | 必須出現(xiàn)n次 |
| 2 | X? | 出現(xiàn)0或1次 | 6 | X{n,} | 必須出現(xiàn)n次以上 |
| 3 | X* | 出現(xiàn)0、1次或多次 | 7 | X{n,m} | 必須出現(xiàn)n~m次 |
| 4 | X+ | 可以出現(xiàn)1次或多次 |
邏輯運算符(X、Y表示一組規(guī)范)
| 序號 | 規(guī)范 | 描述 | 序號 | 規(guī)范 | 描述 |
|---|---|---|---|---|---|
| 1 | XY | X規(guī)范后跟著Y規(guī)范 | 5 | (X) | 作為一個捕獲組規(guī)范 |
| 2 | X|Y | X規(guī)范或Y規(guī)范 |
package library.regex;
public class RegexDemo1 {
public static void main(String[] args) {
String info = "LXH:98|MLDN:90|LI:100";
String s[] = info.split("|"); //按照“|”拆分
System.out.println("字符串的拆分:");
for (int i = 0; i < s.length; i++) {
System.out.print(s[i]+"、");
}
}
}
結(jié)果:
字符串的拆分:
、L、X、H、:、9、8、|、M、L、D、N、:、9、0、|、L、I、:、1、0、0、
package library.regex;
public class RegexDemo2 {
public static void main(String[] args) {
String info = "LXH:98|MLDN:90|LI:100";
String s[] = info.split("\\|"); //按照“|”拆分,需要轉(zhuǎn)義
System.out.println("字符串的拆分:");
for (int i = 0; i < s.length; i++) {
String s2[] = s[i].split(":");
System.out.println("\t|--"+s2[0]+"\t"+s2[1]);
}
}
}
字符串的拆分:
|--LXH 98
|--MLDN 90
|--LI 100
17):定時調(diào)度---Timer類、TimerTask類
Timer類是一個線程設(shè)施,可以用來實現(xiàn)在某一個時間或某一段時間后按排某一個任務(wù)執(zhí)行一次或定期重復(fù)執(zhí)行。該功能要與TimerTask配合使用。
package library.timer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask { //任務(wù)調(diào)度類要繼承TimmerTask類
@Override
public void run() {
// TODO Auto-generated method stub
SimpleDateFormat sdf = null;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSSS");
System.out.println("當前系統(tǒng)時間:"+sdf.format(new Date()));
}
}
package library.timer;
import java.util.Timer;
public class TestTask {
public static void main(String[] args) {
Timer t = new Timer(); //建立Timer對象
MyTask mt = new MyTask(); //定義任務(wù)
t.schedule(mt, 1000,2000); //設(shè)置任務(wù)的執(zhí)行,1秒后開始,每2秒重復(fù)
}
}
部分結(jié)果:
當前系統(tǒng)時間:2018-11-22 00:09:27:0842
當前系統(tǒng)時間:2018-11-22 00:09:29:0816
當前系統(tǒng)時間:2018-11-22 00:09:31:0826
當前系統(tǒng)時間:2018-11-22 00:09:33:0840
要點:
- 字符串頻繁修改使用StringBuffer類,線程安全
- Runtime表示運行時,在JVM中只有一個Runtime,所以想取得Runtime類的對象,直接使用Runtime類中提供的靜態(tài)方法getRuntime()即可
- 國際化程序?qū)崿F(xiàn)的基本原理:所有的語言信息已key-->value的形式保存在資源文件中,程序通過key找到相應(yīng)的value,根據(jù)其所設(shè)置國家的Locale對象不同,找到的資源文件也不同,要想實現(xiàn)國際化必須依靠Locale、ResourceBundle兩類共同完成
- System是系統(tǒng)類,可以取得系統(tǒng)的相關(guān)信息,使用System.gc()方法可以強制性進行垃圾回收操作,調(diào)用此方法實際上就是調(diào)用Runtime類中的gc()方法
- Format類為格式操作類,主要的3個子類是Messageformat、NumberFormat、DateFormat。
- 使用Date類可以方便的取得時間,但取得時間格式不符合低于的習(xí)慣,所有可以使用SimpleDateFormat類進行日期的格式化操作
- 處理大數(shù)字可以使用BigInteger、BigDecimal,當需要精確小數(shù)點操作位數(shù)時,使用Bigdecimal類即可
- 通過Random類可以取得指定范圍的隨機數(shù)字
- 如果一個類的對象要箱被克隆,則此對象所在的類必須實現(xiàn)Cloneable接口
- 要箱對一組對象進行排序,則必須使用比較器。比較器接口Comparable中定義了一個compareTo()的比較方法,用來設(shè)置比較規(guī)則。
- 正則表達式是在開發(fā)中最常使用的一種驗證方法,String類中的replaceAll()、split()、matches()方法都是對正則有所支持
- 可以使用Timer類和TimerTask類完成系統(tǒng)的定時操作。
- java中String StringBuffer和StringBuilder的區(qū)別詳解
- java中String、StringBuffer與StringBuilder的區(qū)別
- JAVA基礎(chǔ)類庫之String類,StringBuffer類和StringBuilder類
- java中StringBuffer的length()和capacity()方法對比
- Java基礎(chǔ)之StringBuffer詳解
- Java利用StringBuffer替換特殊字符的方法實現(xiàn)
- java中stringbuffer線程安全分析實例詳解
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- Java 基礎(chǔ)全面講解StringBuffer類的使用
相關(guān)文章
Springboot下RedisTemplate的兩種序列化方式實例詳解
這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過定義一個配置類,自定義RedisTemplate的序列化方式,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
MyBatis中resultType和parameterType和resultMap使用總結(jié)
這篇文章主要介紹了MyBatis中resultType和parameterType和resultMap使用總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
解決nacos啟動報錯Server check fail, please che
這篇文章主要介紹了nacos啟動 Server check fail, please check server localhost ,port 9848 is available的錯誤原因以及解決方法,需要的朋友可以參考下2023-09-09
Mybatis基于xml配置實現(xiàn)單表的增刪改查功能
這篇文章主要介紹了Mybatis基于xml配置實現(xiàn)單表的增刪改查,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
基于Idea+Jconsole實現(xiàn)線程監(jiān)控步驟
這篇文章主要介紹了基于Idea+Jconsole實現(xiàn)線程監(jiān)控功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04

