常用的API介紹
Object
位于java.lang.Object媳友。所有類都是直接或者間接繼承Object
Object類的方法:
public int hashCode()
:返回對象的hash碼值斯议,hash值是根據(jù)哈希算法計算出來的一個值,這個值根地址有關(guān)醇锚,但是不是實際的地址值哼御。public final class getClass()
:返回此對象的運行時類(與反射有關(guān))。
Student c = new Student();
Class c = s.getClass();
String str = c.getName();
System.out.println(str); // Student
-
public String toString()
:返回對象的字符串表示(與Python中的__str__
類似)焊唬。 -
public boolean equals(Object obj)
:指示其他某個對象是否與此對象“相等”恋昼。默認(rèn)的Object的equals是比較的地址值。
==
基本類型:比較的就是值
引用類型:比較的就是地址值是否相等
class Student{
int age;
String name;
public Student(int age,String name){
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
Student s = (Student) obj;
if (this.name.equals(s.name) && this.age == s.age) {
return true;
} else {
return false;
}
}
}
class HelloWorld{
public static void main(String[] args) {
Student s1 = new Student(20,"Liang");
Student s2 = new Student(20,"Liang");
System.out.println(s1.equals(s2));
}
}
注意:String類的equals方法是重寫Object類的赶促,比較的是字符串的內(nèi)容是否相同
-
protected void finalize()
:當(dāng)垃圾回收器確定不存在對該對象的更多引用時液肌,由垃圾回收器調(diào)用此方法,用于垃圾回收鸥滨。但是什么時候回收不確定嗦哆。(一般不會用到) -
protected Object clone()
:相當(dāng)于Python中的copy.deepcopy()
String
字符串就是由多個字符組成的一串?dāng)?shù)據(jù)⌒鲎遥可以看成是一個字符數(shù)組老速。
字符串是常量,他們的值一旦創(chuàng)建之后就不能更改凸主。
String str = "abc";
類似于
char data[] = {'a','b','c'};
String str = new String(data)
構(gòu)造方法:
-
public String()
:空構(gòu)造 -
public String(char[] value)
:把字符數(shù)組轉(zhuǎn)成字符串 -
public String(char[] value,int index,int count)
:把字符數(shù)組的一部分轉(zhuǎn)為字符串
注意:
String s = "hello";
s += "world";
sout(s); // helloworld
內(nèi)存圖
區(qū)別橘券?
String s = new String("abc"); // 創(chuàng)建了2個對象, abc存在方法區(qū)的常量池中卿吐,堆中開辟了存放abc的地址
String s = "abc"; // abc存在方法區(qū)的常量池中
String s1 = new String("abc"); // 創(chuàng)建了2個對象
String s2 = "abc";
String s3 = "abc";
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); //true
System.out.println(s1.equals(s2)); // true
字符串拼接的小知識
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1+s2); // flase
System.out.println(s3 == "hello"+"world"); // true
結(jié)論:
字符串如果是變量相加约郁,先開空間,再拼接
字符串如果是常量相加但两,是先加鬓梅,然后在常量池找,如果有就直接返回谨湘,否則就創(chuàng)建
常用方法:
- boolean equals(Object obj);
- blloean equalsIngoreCase(String str):比較字符串的內(nèi)容绽快,區(qū)分大小寫
- boolean contains(String str):判斷大字符串是否包含小字符串
- boolean startsWith(String str):判斷字符串是否以某個字符串開頭
- boolean endsWith(String str):判斷字符串是否以某個字符串結(jié)尾
- boolean isEmpty():判斷字符串是否為空
- int length():獲取字符串的長度
- char charAt(int index):獲取指定索引位置的字符
- int indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引(為什么是int類型,原因是char可以轉(zhuǎn)成int紧阔,'a'和97是一致的坊罢,這里可以寫'a'或者97)
- int indexOf(String str):返回指定字符串在此字符串中第一次出現(xiàn)處的索引
- int indexOf(int ch,int fromIndex):
- int indexOf(String str,int fromIndex):
- String substring(int start):從指定位置開始截取字符串,默認(rèn)到結(jié)尾
- String substring(int start,int end)
- char[] toStringArray():將字符串轉(zhuǎn)換為字符數(shù)組
- String toLowerCase():
- int compareTo(String str):
StringBuffer
我們?nèi)绻麑ψ址M行拼接操作擅耽,每次拼接活孩,都會構(gòu)建一個新的String對象,既耗時乖仇,又浪費空間憾儒。而StringBuffer就可以解決這個問題询兴。
StringBuffer是線程安全的可變字符序列。
StringBuffer默認(rèn)開辟16長的空間起趾,可以理解成數(shù)組的擴容操作诗舰。可以自己看元源碼训裆。
StringBuffer sb1 = new StringBuffer();
System.out.println(sb1.capacity()); // 16
StringBuffer sb2 = new StringBuffer(50);
System.out.println(sb2.capacity()); // 50
// 添加數(shù)據(jù)
System.out.println(sb1.append("hello")); // hello
System.out.println(sb1.append("world")); // helloworld
System.out.println(sb1); // helloworld
StringBuilder
此類提供一個與StringBuffer兼容的API眶根,但不能保證同步。該類被設(shè)計用作StringBuffer的一個簡單替換边琉,用在字符串緩存區(qū)被單個線程使用的時候(這種情況很普遍)属百。如果可能,建議優(yōu)先采用該類变姨,因為在大多數(shù)實現(xiàn)中族扰,它比StringBuffer要快。
String钳恕,StringBuffer和StringBuilder區(qū)別?
- String是內(nèi)容不變的蹄衷,而StringBuffer和StringBuilder都是內(nèi)容可變的
- StringBuffer是同步的忧额,數(shù)據(jù)安全,效率低愧口;StringBuilder是不同步的睦番,數(shù)據(jù)不安全,效率高
String和StringBuffer作為形參傳遞的問題
String作為形參傳遞耍属,效果跟基本類型傳遞一樣
StringBuffer作為形參傳遞托嚣,仍是引用傳遞
public class StringBufferDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println(s1 + "---" + s2);// hello---world
change(s1, s2);
System.out.println(s1 + "---" + s2);// hello---world
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println(sb1 + "---" + sb2);// hello---world
change(sb1, sb2);
System.out.println(sb1 + "---" + sb2);// hello---worldworld
}
public static void change(StringBuffer sb1, StringBuffer sb2) {
sb1 = sb2;
sb2.append(sb1);
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}
}
Arrays
針對數(shù)組進行操作的工具類,比如排序和查找厚骗。
java.util.Arrays
-
public static String toString(int[] a)
:將數(shù)組轉(zhuǎn)換為字符串 -
public static void sort(int[] a)
:對數(shù)組進行升序排列 -
public static int binarySearch(int[] a,int key)
:二分查找
基本數(shù)據(jù)類型和對應(yīng)的包裝類
為了對基本數(shù)據(jù)類型進行更多的操作示启,更方便的操作,Java針對每一種基本數(shù)據(jù)類型提供了對應(yīng)的類類型领舰。稱為包裝類類型夫嗓。
基本數(shù)據(jù)類型 | 包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Integer
- public Integer(int value):將一個int包裝成Integer類
- public Integer(String s):將一個可以轉(zhuǎn)成int的字符串包裝成Integer類,例如"100"
- public static String toBinaryString(int i):將10進制轉(zhuǎn)為二進制
- public static final int MAX_VALUE:獲取Integer最大值
String和int之間轉(zhuǎn)換
String->int:public static int parseInt(String s)
int->String:public static String toString(int i)
自動裝箱和自動拆卸
自動裝箱:把基本類型轉(zhuǎn)換為包裝類類型
自動拆箱:把包裝類類型轉(zhuǎn)換為基本類型
Integer i = 100;
i+=200;
等價于
Integer i = Integer.valueOf(100); // 自動裝箱
i = Integer.valueOf(i.intValue()+200); // 先自動拆箱冲秽,再自動裝箱
小整數(shù)常量池
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); // false
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4); // false
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6); // false
Integer i7 = 127; // Integer i7 = Integer.valueOf(127);
Integer i8 = 127;
System.out.println(i7 == i8); // true
通過查看源碼舍咖,調(diào)用valueOf,針對-128~127之間的數(shù)據(jù)锉桑,做了一個緩沖池排霉,如果數(shù)據(jù)是該范圍,每次并不創(chuàng)建新的空間
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Character
用于判斷字符的類
public static boolean isUpperCase(char ch)
public static boolean isLowerCase(char ch)
public static char toUpperCase(char ch)
public static char toLowerCase(char ch)
Random
- public Random():沒有種子民轴,用的是默認(rèn)種子攻柠,即當(dāng)前系統(tǒng)時間的毫秒值
- public Random(long seed):給定指定的種子球订,每次得到的隨機數(shù)相同
System
- public static void gc():運行垃圾回收器。
- public static void exit(int status):終止當(dāng)前的java虛擬機(直接退出程序)辙诞。參數(shù)用作狀態(tài)碼辙售;根據(jù)慣例,非0的狀態(tài)碼表示異常終止飞涂。
- public static long currentTimeMillis():返回以毫秒為單位的當(dāng)前時間(用于統(tǒng)計程序運行時間)
- public static void arraycopy(Object src,int srcPos,Object dest,int length):從指定源數(shù)組中復(fù)制一個數(shù)組
BigInteger
支持更大的整數(shù)
BigInteger bi = new BigInteger(100000000000);
BigDecimal
任意精度的有符號的數(shù)
System.out.println(0.09+0.01); // 0.09999999999999999
System.out.println(1.0-0.32); // 0.6799999999999999
BigDecimal bd1 = new BigDecimal("0.09");
BigDecimal bd2 = new BigDecimal("0.01");
System.out.println(bd1.add(bd2));
Date
java.util.Date
import java.util.Date;
class HelloWorld {
public static void main(String[] args) {
long time = System.currentTimeMillis();
Date d = new Date(time); // 將毫秒值轉(zhuǎn)為date
System.out.println(d); // Fri Nov 09 15:56:11 CST 2018
System.out.println(d.getTime()); // 獲取當(dāng)前時間的毫秒值旦部,1541750217767
}
}
DateFormat
java.text.DateFormat
格式化日期
import java.util.Date;
import java.text.DateFormat;
class HelloWorld {
public static void main(String[] args) throws ParseException {
// Date -> String
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("YYYY年MM月dd日 HH:mm:ss");
String s = sdf.format(d);
System.out.println(s); // 2018年11月09日 17:02:33
// String -> Date
String str = "2008-08-08 12:12:12";
SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
Date dd = sdf2.parse(str);
System.out.println(dd); // Sun Dec 30 12:12:12 CST 2007
}
}
Calendar
抽象類
import java.util.Calendar;
class HelloWorld {
public static void main(String[] args) {
Calendar rightNow = Calendar.getInstance(); // 獲取子類對象(多態(tài)實現(xiàn))
int year = rightNow.get(Calendar.YEAR);
int month = rightNow.get(Calendar.MONTH);
int date = rightNow.get(Calendar.DATE);
System.out.println(year+"年"+(month+1)+"月"+date+"日"); // 2018年11月9日
}
}