java常用類 Object類 基類,超類,所有類的直接或間接父類 object類定義的方法是所有對象都具有的方法 object類型可以存儲任何對象 作為參數,可以接受任何對象 作為返回值,可以返回任何對象 getClass() 返回引用中存儲的實際對象類型 public class Student ...
java常用類
Object類
基類,超類,所有類的直接或間接父類
object類定義的方法是所有對象都具有的方法
object類型可以存儲任何對象
- 作為參數,可以接受任何對象
- 作為返回值,可以返回任何對象
getClass()
返回引用中存儲的實際對象類型
public class Student {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.getClass());
System.out.println(student.getClass().getName());
System.out.println(student.getClass().getSimpleName());
}
}
/* out:
class com.xxx.Student
com.xxx.Student
Student
hashCode()
返回該對象的哈希碼值(int)
哈希值:根據對象的地址或字元串或數字使用hash演算法計算出來的int類型的數值。
一般情況下相同對象返回相同哈希碼
Student student = new Student();
System.out.println(student.hashCode());
Student student1 = new Student();
System.out.println(student.hashCode()==student1.hashCode());
/*
1435804085
false
toString()
返回對象的字元串表現形式
可以進行重寫,自己來覺得展示的字元串形式
Student student = new Student();
System.out.println(student.toString());
//com.xxx.Student@5594a1b5
equals()
比較兩個對象地址是否相同
也可以重寫,自己覺得比較方式
Student student = new Student();
Student student1 = new Student();
System.out.println(student.equals(student1));
//false
finalize()
當對象被判定為垃圾對象時,由JVM自動調用此方法,用來標記,進入回收隊列
垃圾對象:沒有有效引用指向此對象,
垃圾回收:釋放數據存儲空間
自動回收機制:JVM記憶體耗盡,一次性回收所有垃圾對象
手動回收機制:使用System.gc();通知JVM回收
垃圾回收時調用finalize(),本身為空需要重寫
public static void main(String[] args) {
Student student = new Student();
//後兩者為垃圾
new Student();
new Student();
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("一個垃圾被回收了");
}
/*一個垃圾被回收了
一個垃圾被回收了
包裝類
為解決基本數據類型沒有相應方法,設計了基本數據類型對應的引用數據類型,這就是包裝類
包裝類預設值:null
基本數據類型 | 包裝數據類型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
包裝類的方法可以自行查閱java的官方文檔
類型轉換和裝箱、拆箱
裝箱:基本類型轉換成引用類型
拆箱:引用類型轉換為基本類型
Number類
Number類是六個包裝類以及一些其他類的子類
基本類型轉引用類型
int a = 2;
Integer integer = new Integer(a);
Integer integer1 = Integer.valueOf(2);
自動裝箱(jdk1.5之後)
int a = 2;
Integer integer = a;
引用類型轉基本類型
int b = integer.intValue();
自動拆箱(jdk1.5之後)
int a = 2;
Integer integer = a;
Integer integer1 = integer;
parseXXX()靜態方法
基本類型轉字元串
int n1=100;
String s1 = n1+"";
//或者
String s2 = Integer.toString(n1);
//十六進位
String s2 = Integer.toString(n1,16);
字元串轉基本類型
字元串轉int:Integer.parseInt(String)
字元串轉其他:包裝類.praseXXX(String)
boolean字元串轉基本類型,除了"true"是true全是false
Integer緩衝區
//因為左邊創建變數在棧,棧存放堆里地址,兩者地址不同不相等
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2);
//自動裝箱,自動裝箱本質是調用Integer.ValueOf方法,可以直接看一下Integer.ValueOf方法,因為該方法中有判斷條件為:如果值大於等於-128,小於等於127直接返回緩衝區(堆中)對象值,否則new一個新的Integer返回。綜上所以後兩者結果不同
integer1 =100;
integer2 =100;
System.out.println(integer1==integer2);
integer1 =200;
integer2 =200;
System.out.println(integer1==integer2);
//地址相等了
Integer integer3 = new Integer(100);
Integer integer4 = integer3;
System.out.println(integer3==integer4);
/*
false
true
false
true
String類
String的一些特性
字元串是常量,創建之後不可改變:
什麼意思呢?當我們修改字元串時並不是把舊的字元串的值改成了新的值,而是在字元串池開闢新空間存儲新增,並且把棧中的聲明地址指向新的值。舊的值成了“垃圾”。
與此同時,當我們再次什麼一個新的字元串變數,並且把他賦值為和剛纔已有變數相同的值,那麼直接指向已有變數值的字元串池空間,不再開闢新的空間存值
使用new創建字元串時又有所不同,他是在堆中創建了的空間存儲對象然後堆中空間又指向(可能說指向不對但可以這樣理解)字元串池(相同值依舊指向同一個字元串池空間),總的來說創建了兩個對象分別在方法區和堆中
String s = "name";
String s1 = "name";
System.out.println(s==s1);
//true
String s = "name";
String s1 = new String("name");
System.out.println(s==s1);
//equals比較的是數據
System.out.println(s.equals(s1));
//false
//true
字元串字面值(右邊)存儲在字元串池(在方法區中(方法區邏輯上獨立,物理上屬於堆))中,可以共用
java常用方法
這些方法應該不用我一行行的演示吧
可變字元串
由於上面描述的String的不可變性質,我們需要通過其他的類來解決這個特性帶來的一些問題(效率低等)
StringBuffer類:可變長字元串在String的基礎上加上了緩衝區,運行效率慢、線程安全
StringBuilder:可變長字元串,運行效率快、線程不安全
兩者相對於String,效率更高,更加節省記憶體
StringBuffer sb = new StringBuffer();
//追加
sb.append("hello");
System.out.println(sb.toString());
sb.append("world");
System.out.println(sb.toString());
//添加
sb.insert(0,"最前面");
System.out.println(sb.toString());
//replace();左閉右開
sb.replace(0,3,"hello");
System.out.println(sb.toString());
//delete()
sb.delete(0,5);
System.out.println(sb.toString());
//其他方法如翻轉清空自己搜索
/*
hello
helloworld
最前面helloworld
hellohelloworld
helloworld
//StringBuider和StringBuffer相同,單線程用前者,否則後者
BigDecimal
關於double存在精度丟失(存儲的實際上是近似值)
double d1 = 1.0;
double d2 = 0.9;
double d3 = d1-d2;
System.out.println(d3);
//0.09999999999999998
需要精確計算或是小數比較時用BigDecimal類,可以精確計算浮點數
BigDecimal bigDecimal = new BigDecimal("1.0");
BigDecimal bigDecimal1 = new BigDecimal("0.9");
//減法
System.out.println(bigDecimal.subtract(bigDecimal1));
//加法
bigDecimal.add(bigDecimal1);
// 乘法
bigDecimal.multiply(bigDecimal1);
// 除法
bigDecimal.divide(bigDecimal1);
bigDecimal.subtract(bigDecimal1).divide(bigDecimal1);
//+保留幾位,四捨五入
bigDecimal.subtract(bigDecimal1).divide(bigDecimal1,1,BigDecimal.ROUND_HALF_EVEN);
//0.1
Data
很多方法已經過時或者被Calendar類替代
不想多說自己看文檔
Date date = new Date();
System.out.println(date.toString());
//Thu May 18 19:41:35 CST 2023
Calendar
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
//2023年5月18日 下午7:46:33
//年
int year = Calendar.get(Calendar.YEAR);
//月,比實際小1
calendar.get(Calendar.MONTH);
// 日
calendar.get(Calendar.DAY_OF_MONTH);
// 小時
calendar.get(Calendar.HOUR_OF_DAY);//HOUR12小時,HOUR_OF_DAY24小時
// 分鐘
calendar.get(Calendar.MINUTE);
// 秒
calendar.get(Calendar.SECOND);
其他自己查文檔
SimpleDataFormat
與語言環境有關的方式來格式化和解析日期的具體類
實現日期-->文本或者文本-->日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
Date date = new Date();
//格式化
String string = sdf.format(date);
System.out.println(string);
//解析
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date2 = sdf1.parse("1990-05-01");
System.out.println(date2);
/*2023年05月18日20:09:03
Tue May 01 00:00:00 CDT 1990
System類
構造方法私有,方法是靜態的
int[] arr={20,18,15,8,45,90,1,65};
int[] dest=new int[8];
//源數組-開始複製位置下標-目標數組-目標數組的位置-複製長度
System.arraycopy(arr,0,dest,0,arr.length);
for(int i=0;i<dest.length;i++){
System.out.println(dest[i]);
}
/*
20
18
15
8
45
90
1
65
currentTimeMillis():現在到1970毫秒數
後兩者用過不多說