java常用的類庫
主要內容:
1、StringBuffer的使用。
2、正則表示式、大數操作、日期格式化、Random類的使用。
3、System、Runtime、Process、Math、Calendar類的使用。
4、反射機制在程式中的應用。
一丶StringBuffer。
1、StringBuffer的簡介。
String表示一個字串的操作,但是String本身有如下特點:
兩種宣告的方式,而且比較的時候靠equals()比較內容。
一個字串的內容宣告之後則不可改變。
當字串的內容需要被改變的時候就使用StringBuffer。
在String中如果要想完成兩個字串的連線,依靠"+"。
但是在StringBuffer類中要想完成連線則需要使用的是append()方法。
此方法被過載過多次,而且每個方法返回型別都是StringBuffer:
public StringBuffer append(char c)。
根據這種返回型別的特性,可以採用程式碼鏈的形式,例如:StringBuffer物件.append().append()。
範例
:進行字串的連線。
package org.study.RebortChao;
public class StringBufferDemo01 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("hello"); //增加內容
buf.append("world").append("!!!");
System.out.println(buf);
}
}/*hello world !!!*/
如果現在需要將一個StringBuffer的型別變成String的話:
必須依靠 toString()方法完成。
String和StringBuffer不能夠直接轉換的。
package org.study.RebortChao;
public class StringBufferDemo02{
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("hello"); //增加內容
buf.append(" world").append("!!!");
String str = buf.toString() ; //StringBuffer --> String
System.out.println(str);
}
}
StringBuffer的內容是允許改變的:
所以在進行引用傳遞的時候,可以將方法中對StringBuffer操作的結果返回。
package org.study.RebortChao;
public class StringBufferDemo03{
public static void main(String[] args) {
StringBuffer buf=new StringBuffer();
buf.append("hello"); //增加內容
buf.append("world").append("!!!");
fun(buf);
System.out.println(buf);
}
public static void fun(StringBuffer temp){
temp.append("\n").append(1).append(" + ").append(2).append(" = ").append(1 + 2);
}
}
/*從程式中的最終結果來看,StringBuffer的內容是完全允許改變的。*/
2、StringBuffer的應用。
需要經常【改變字串的內容】要使用StringBuffer。
【內容不需要隨時改變】的話,使用String就夠了。
範例:
以下情況下就必須使用StringBuffer
package org.study.RebortChao;
public class StringBufferDemo04 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
for (int x = 0; x < 1000; x++) {
buf.append(x);
}
System.out.println(buf);
}
}
3、StringBuffer的方法。
StringBuffer本身也是一個類,有著許多的方法,大多同String一樣。
但是StringBuffer也有著屬於自己的方法。
①、字串的反轉。
public StringBuffer reverse()
package org.study.RebortChao;
public class ReverseDemo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("hello world!!!");
System.out.println(buf.reverse());//呼叫reverse反轉函式
}
}
②、字串的替換。
在String類中依靠replaceAll()方法完成替換
public StringBuffer replace(int start,int end,String str)
需要指定替換的開始和結束位置
package org.study.RebortChao;
public class ReplaceDemo{
public static void main(String[] args){
StringBuffer buf = new StringBuffer();
buf.append("hello world!!!");
System.out.println(buf.replace(0, buf.length(), "XXX"));//從0開始到最後都將被XXX所取代。
}
}
③、插入內容
append()採用順序的方式依次連線到後面的位置。
可以使用insert()方法完成在指定位置上的增加:
public StringBuffer insert(int offset,char c)
此方法被過載過很多次,可以插入各種資料型別。
package org.study.RebortChao;
public class InsertDemo{
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("world!!!").insert(0, "hello");
//從0的位置開始插入
System.out.println(buf);
}
}
二丶Runtime-表示的是執行時的狀態物件。
每當有一個JVM程序產生的時候都會自動生成一個被私有化的Runtime類的物件。
那麼一旦構造方法被私有化,則內部一定會存在一個方法,可以取得本類的例項化物件:
public static Runtime getRuntime()。
只要沒有發現構造方法,則構造方法一定被私有化了,屬於【單例設計】,則此時一定可以從類的內部找到一個static 方法,取得本類的例項。
Runtime run = Runtime.getRuntime() ;
Runtime類可以取得一些系統的資訊或者是建立一個新的程序。
1、取得系統的資訊。
總共可以使用的記憶體:public long totalMemory();
取得最大可用的記憶體:public long maxMemory();
取得當前空餘的記憶體:public long freeMemory();
範例:
觀察系統的記憶體的使用情況。
package org.study.RebortChao;
public class RuntimeDemo01{
public static void main(String[] args){
Runtime run = Runtime.getRuntime();
System.out.println("** 1、maxMemory:" + run.maxMemory());
System.out.println("** 1、totalMemory:" + run.totalMemory());
System.out.println("** 1、freeMemory:" + run.freeMemory());
String str = "";
for (int x = 0; x < 10000; x++) { // 將產生大量的垃圾
str += x;
}
System.out.println("========= 產生垃圾之後 ============");
System.out.println("** 2、maxMemory:" + run.maxMemory());
System.out.println("** 2、totalMemory:" + run.totalMemory());
System.out.println("** 2、freeMemory:" + run.freeMemory());
}
}
/*for迴圈產生大量的垃圾,freeMemory()的空間明顯減少。*/
垃圾的回收。
package org.study.RebortChao;
public class RuntimeDemo02 {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();
System.out.println("========= 產生垃圾之前 ============");
System.out.println("** 1、maxMemory:" + run.maxMemory());
System.out.println("** 1、totalMemory:" + run.totalMemory());
System.out.println("** 1、freeMemory:" + run.freeMemory());
String str = "";
for (int x = 0; x < 10000; x++) { //將產生大量的垃圾
str += x;
}
System.out.println("========= 產生垃圾之後 ============");
System.out.println("** 2、maxMemory:" + run.maxMemory());
System.out.println("** 2、totalMemory:" + run.totalMemory());
System.out.println("** 2、freeMemory:" + run.freeMemory());
run.gc() ; //垃圾收集
System.out.println("========= 垃圾收集之後 ============");
System.out.println("** 2、maxMemory:" + run.maxMemory());
System.out.println("** 2、totalMemory:" + run.totalMemory());
System.out.println("** 2、freeMemory:" + run.freeMemory());
}
}
2、執行本機程式。
public Process exec(String command) throws IOException
此方法返回一個Process類的物件例項,那麼此類可以用於程序的控制。
銷燬程序:public void destroy()
範例:
執行程式notepad.exe。
package org.study.RebortChao;
public class RuntimeDemo03{
public static void main(String[] args) throws Exception {
Runtime run = Runtime.getRuntime();
Process pro = run.exec("notepad.exe"); //執行程式
Thread.sleep(2000); //延時2秒。
pro.destroy();
}
}
三丶System類
System.out.println();
System是一個類。
out是一個靜態屬性。
println()是out物件所提供的一個方法。
1、取得計算的時間
①、System類本身可以取得一個系統的當前時間,只是返回的時候按照long返回。
取得當前時間的方法:public static long currentTimeMillis()
package org.study.RebortChao;
public class SystemDemo01{
public static void main(String[] args) {
long start = System.currentTimeMillis();
String str = "";
for (int x = 0; x < 10000; x++) { // 將產生大量的垃圾
str += x;
}
long end = System.currentTimeMillis();
System.out.println("花費的時間:"+(end - start));
}
}
2、垃圾回收與物件生命週期
public static void gc()。
當呼叫此方法的時候實際上就等同於呼叫了Runtime類中提供的gc()方法,兩個是一樣的。
方法:protected void finalize() throws Throwable
當一個物件被回收之前都會預設呼叫此方法,但是此方法上丟擲的異常是 Throwable。Throwable 表示 Error 和Exception,證明此方法有可能產生錯誤或者是異常,但是此方法的好處即便是產生了問題也不會影響程式的執行。一般一個物件都要經歷以下的生命週期:
載入-->【初始化】-->【使用】-->【回收】-->解除安裝
範例:
觀察物件的回收。
package org.study.RebortChao;
class Person {
public Person(){
System.out.println("我出生了。。。");
}
@Override
protected void finalize() throws Throwable {
System.out.println("我完了,我被回收了。。。");
}
}
public class ObjectGCDemo {
public static void main(String[] args) {
Person per = new Person();
per = null;
System.gc(); //手工回收
}
}
四丶math類-數學的操作類。
1、常用值與函式:
Math.PI 記錄的圓周率
Math.E 記錄e的常量
2、Math中還有一些類似的常量,都是一些工程數學常用量。
Math.abs求絕對值 .
Math.sin正弦函式Math.asin反正弦函式 .
Math.cos餘弦函式 Math.acos反餘弦函式 .
Math.tan正切函式 Math.atan反正切函式Math.atan2商的反正切函式 .
Math.toDegrees弧度轉化為角度Math.toRadians角度轉化為弧度 .
Math.ceil得到不小於某數的最大整數 .
Math.floor得到不大於某數的最大整數 .
Math.IEEEremainder求餘 .
Math.max求兩數中最大 .
Math.min求兩數中最小 .
Math.sqrt求開方 .
Math.pow求某數的任意次方, 丟擲ArithmeticException處理溢位異常 .
Math.exp求e的任意次方 .
Math.log10以10為底的對數 .
Math.log自然對數 .
Math.rint求距離某數最近的整數(可能比某數大,也可能比它小).
Math.round同上,返回int型或者long型(上一個函式返回double型) .
Math.random返回0,1之間的一個隨機數.
五丶大數操作類。
1、大整數操作類BigInteger
package org.study.RebortChao;
import java.math.BigInteger;
public class BigIntegerDemo{
public static void main(String[] args) {
BigInteger bi1 = new BigInteger(Long.MAX_VALUE + "");
BigInteger bi2 = new BigInteger(Long.MAX_VALUE + "");
System.out.println("加法:"+bi1.add(bi2));
System.out.println("減法:"+bi1.subtract(bi2));
System.out.println("乘法:"+bi1.multiply(bi2));
System.out.println("除法:");
BigInteger res[]=bi1.divideAndRemainder(new BigInteger("333"));
System.out.println("整數部分:" + res[0]);
System.out.println("小數部分:" + res[1]);
}
}
2、大小數操作類:BigDecimal
package org.study.RebortChao;
import java.math.BigDecimal;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);
BigDecimal bd2 = new BigDecimal(Double.MAX_VALUE);
System.out.println("加法:"+bd1.add(bd2));
System.out.println("減法:"+bd1.subtract(bd2));
System.out.println("乘法:"+bd1.multiply(bd2));
System.out.println("除法:"+bd1.divide(bd2));
}
}
在BigDecimal類中除法操作可以指定小數的保留位數:
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
範例:
四捨五入操作
package org.study.RebortChao;
import java.math.BigDecimal;
class MyMathRound{
public static double round(double num, int scale){
BigDecimal bd = new BigDecimal(num);
return bd.divide(new BigDecimal(1),scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static BigDecimal round(String num, int scale){
BigDecimal bd = new BigDecimal(num);
return bd.divide(new BigDecimal(1), scale, BigDecimal.ROUND_HALF_UP);
}
}
public class RoundDemo{
public static void main(String[] args){
System.out.println("四捨五入:" + MyMathRound.round(98.56137, 2));
System.out.println("四捨五入:" + MyMathRound.round(98.56637, 2));
System.out.println("四捨五入:" + MyMathRound.round("98.56637", 2));
}
}
六丶隨機數
在java.util.Random類中主要的功能是用於產生隨機數的。
範例:
產生10個數字,都不大於100
package org.study.RebortChao;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random rand = new Random();
for (int x = 0; x < 10; x++) {
System.out.println(rand.nextInt(100));
}
}
}
七丶日期操作。
1、Date類
java.util.Date類是一個專門取得日期的操作類,直接例項化物件輸出即可。
package org.study.RebortChao;
import java.util.Date;
public class DateDemo{
public static void main(String[] args) {
System.out.println(new Date());
}
}
輸出的時間資訊是:
Sat Dec 02 15:03:17 CST 2017
/*確實是取得了一個日期,但是日期的格式並不符合日常習慣。*/
2、Calendar類
Calendar類是採用手工的方式取得日期,可以通過此類精確到毫秒。
此類的定義如下:
public abstract class Calendar extends Object
implements Serializable, Cloneable, Comparable<Calendar>
這個類本身是一個抽象類,抽象類要想例項化肯定使用子類:GregorianCalendar
package org.study.RebortChao;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarDemo{
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
System.out.println("YEAR:"+calendar.get(Calendar.YEAR));
System.out.println("MONTH:"+(calendar.get(Calendar.MONTH) + 1));
System.out.println("DATE:"+calendar.get(Calendar.DATE));
System.out.println("HOUR_OF_DAY:"+calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE:"+calendar.get(Calendar.MINUTE));
System.out.println("SECOND:"+calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
}
}
設計如下的一個介面:
package org.study.RebortChao;
public interface DateTime{
/**
* 取得日期
* @return 日期的字串,例如:2009-12-22
*/
public String getDate() ;
/**
* 取得日期時間
* @return 日期時間的字串,例如:2009-12-22 11:06:23.345
*/
public String getDateTime() ;
/**
* 取得時間戳
* @return 返回時間戳的字串,例如:20091222110623345
*/
public String getTimeStamp() ;
}
前面需要補0的問題需要注意,例如:01。
package org.study.RebortChao;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class DateTimeImpl implements DateTime {
private Calendar calendar;
public DateTimeImpl() {
this.calendar = new GregorianCalendar();
}
@Override
public String getDate() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR)).append("-");
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("-");
buf.append(this.addZero(calendar.get(Calendar.DATE), 2));
return buf.toString();
}
@Override
public String getDateTime() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR)).append("-");
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("-");
buf.append(this.addZero(calendar.get(Calendar.DATE), 2)).append(" ");
buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append(":") ;
buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)).append(":") ;
buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)).append(".") ;
buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)) ;
return buf.toString();
}
@Override
public String getTimeStamp() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR));
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2));
buf.append(this.addZero(calendar.get(Calendar.DATE), 2));
buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2));
buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)) ;
buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)) ;
buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)) ;
return buf.toString();
}
private String addZero(int num, int len) {
StringBuffer buf = new StringBuffer();
buf.append(num);
while (buf.length() < len) {
buf.insert(0, 0);
}
return buf.toString();
}
}
3、SimpleDateFormat類
依靠SimpleDateFormat可以成完成String和Date型資料的轉換。
日期的格式化: java.text.SimpleDateFormat 類
格式化日期的模板:
年yyyy、月MM、日dd、時HH、分mm、秒ss、毫秒SSS
範例:
格式化日期。
package org.study.RebortChao;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo{
public static void main(String[] args){
//準備好了一個要格式化的模板
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = new Date();
String str = sdf.format(date);
System.out.println("格式化後的日期:"+str);
}
}
通過SimpleDateFormat類可以將一個Date型的資料變為String型的資料。
範例:
將String變回Date型
package org.study.RebortChao;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo02{
public static void main(String[] args) throws Exception {
String str = "2009-12-24 11:51:57.500" ;
// 準備好了一個要格式化的模板
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = sdf.parse(str) ; // 將String --> Date
System.out.println("格式化後的日期:" + date);
}
}
SimpleDateFormat類還可以完成日期格式的轉換。
package org.study.RebortChao;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo03{
public static void main(String[] args) throws Exception{
String oldDate = "2009-12-24 11:51:57.500";
String newDate = null;
// 準備好了一個要格式化的模板
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
SimpleDateFormat sdf2 = new SimpleDateFormat(
"yyyy年MM月dd日HH時mm分ss秒SSS毫秒");
Date date = sdf1.parse(oldDate);
//從原日期字串中取出日期數字
newDate = sdf2.format(date);
//新的日期格式
System.out.println("格式化後的日期:" + newDate);
}
}
DateTime介面的實現類通過SimpleDateFormat類完成應該是最方便的。
package org.study.RebortChao;
import java.text.SimpleDateFormat;
public class DateTimeImpl implements DateTime {
private SimpleDateFormat sdf;
@Override
public String getDate() {
String str = null;
this.sdf = new SimpleDateFormat("yyyy-MM-dd");
str = this.sdf.format(new java.util.Date());
return str;
}
@Override
public String getDateTime() {
String str = null;
this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
str = this.sdf.format(new java.util.Date());
return str;
}
@Override
public String getTimeStamp() {
String str = null;
this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
str = this.sdf.format(new java.util.Date());
return str;
}
}
八丶Arrays類-陣列的操作類。
import java.util.Arrays;
①、實現對陣列的從小到大的排序:Arrays.sort(a);
②、陣列元素的定位查詢find=Arrays.binarySearch(a,8);
· //括號中前面的a為你將要查詢的陣列名稱,8為想要查詢的數字。
· //find的值為查詢的數字在陣列中的下標。
③、String aString =Arrays.toString(a);
// String前的a和括號中的a均表示陣列名稱。
System.out.println(aString);//String前的a表示陣列名稱。
④、boolean b=Arrays.asList(a).contains(1);
System.out.println(b);//注意:b的值只可能是true或false
九丶比較器。
兩種比較介面的區別:
Comparable屬於定義類的時候使用,而Comparator屬於挽救的比較器,所在的包不同。
Comparable只有一個方法,而Comparator有兩個方法。
1、Comparable介面
Comparable介面主要是用於執行比較器操作的介面,定義如下:
public interface Comparable<T>{
public int compareTo(T o);
}
Comparable介面中僅有一個compareTo()方法,此方法返回一個int型的資料,此值會返回三種結果:
①、0:兩個物件相等。②、1:大於。③、-1:小於
如果物件陣列要排序,則物件所在的類必須現實現Comparable介面。
/*如果要使用Arrays.sort()進行排序的話,則肯定要在物件所在的類中進行編寫比較器的操作。*/
package org.study.RebortChao;
import java.util.Arrays;
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:" + this.name + ",年齡:" + this.age;
}
@Override
public int compareTo(Person o) {
if(this.age > o.age) {
return 1;
}else if(this.age < o.age) {
return -1;
}else{
return 0;
}
}
}
public class SortObjectArray{
public static void main(String[] args) {
Person per[] = {new Person("張三", 20), new Person("李四", 19),new Person("王五", 23)};
Arrays.sort(per);
for (int x = 0; x < per.length; x++) {
System.out.println(per[x]);
}
}
}
Comparable排序的原理實際上就屬於BinaryTree(二叉樹)排序的形式。
範例:
package org.study.RebortChao;
class BinaryTree{
class Node {
private Comparable data;
private Node left; //儲存左子樹
private Node right; //儲存右子樹
public Node(Comparable data){
this.data = data;
}
public void addNode(Node newNode){
if(this.data.compareTo(newNode.data)>= 0){ //放在左子樹
if(this.left == null){
this.left = newNode;
}else{
this.left.addNode(newNode);
}
}
if(this.data.compareTo(newNode.data) < 0) { //放在右子樹
if(this.right == null) {
this.right = newNode;
}else{
this.right.addNode(newNode);
}
}
}
public void printNode(){ //左-根-右
if(this.left != null){
this.left.printNode();
}
System.out.println(this.data);
if(this.right != null){
this.right.printNode();
}
}
}
private Node root; //根節點
public void add(Comparable data){
Node newNode = new Node(data);
if(this.root == null){
this.root = newNode;
}else{
this.root.addNode(newNode);
}
}
public void print(){
if(this.root != null){
this.root.printNode();
}
}
}
public class BinaryTreeDemo{
public static void main(String[] args){
BinaryTree bt = new BinaryTree();
bt.add("B");
bt.add("A");
bt.add("C");
bt.print();
}
}
2、Comparator
一個封裝好的類可以通過Comparator挽救一個排序的規則。
package org.study.RebortChao;
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
if(o1.getAge() > o2.getAge()) {
return -1;
}else if(o1.getAge() < o2.getAge()) {
return 1;
}else{
return 0;
}
}
}
之後就可以繼續使用Arrays類提供的sort()方法進行排序。
package org.study.RebortChao;
import java.util.Arrays;
public class Demo{
public static void main(String[] args){
Person per[] = { new Person("張三", 20), new Person("李四", 19),
new Person("王五", 23) };
Arrays.sort(per, new PersonComparator());
for(int x = 0; x < per.length; x++) {
System.out.println(per[x]);
}
}
}
十丶正則表示式。
十一丶反射機制。
十二丶物件克隆
克隆就是將一個物件直接複製。
一個類的物件要完成物件的克隆操作的話,則必須實現一個介面:Cloneable。
且必須依靠Object類中的clone()方法:
protected Object clone() throws CloneNotSupportedException
此方法屬於受保護的訪問許可權,所以如果一個非本包的非子類,要訪問肯定不能訪問。
package org.study.RebortChao;
class Person implements Cloneable{
private String name ;
public Person(String name){
this.name = name ;
}
public void setName(String name){
this.name = name ;
}
public String getName(){
return this.name ;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneDemo{
public static void main(String[] args) throws Exception {
Person per = new Person("張三");
Person cp = (Person) per.clone(); //克隆
System.out.println(per + "," + per.getName());
System.out.println(cp + "," + cp.getName());
}
}
/*Cloneable是一個標識介面,用於表示一種能力。*/