Java基礎(chǔ)3-常用的API

常用的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)存圖


image.png

區(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
image.png

字符串拼接的小知識

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日
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市较店,隨后出現(xiàn)的幾起案子士八,更是在濱河造成了極大的恐慌,老刑警劉巖梁呈,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚度,死亡現(xiàn)場離奇詭異,居然都是意外死亡官卡,警方通過查閱死者的電腦和手機蝗茁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寻咒,“玉大人哮翘,你說我怎么就攤上這事∶兀” “怎么了饭寺?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叫挟。 經(jīng)常有香客問我艰匙,道長,這世上最難降的妖魔是什么抹恳? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任员凝,我火速辦了婚禮,結(jié)果婚禮上奋献,老公的妹妹穿的比我還像新娘绊序。我一直安慰自己,他們只是感情好秽荞,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布骤公。 她就那樣靜靜地躺著,像睡著了一般扬跋。 火紅的嫁衣襯著肌膚如雪阶捆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音洒试,去河邊找鬼倍奢。 笑死,一個胖子當(dāng)著我的面吹牛垒棋,可吹牛的內(nèi)容都是我干的卒煞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叼架,長吁一口氣:“原來是場噩夢啊……” “哼畔裕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乖订,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扮饶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乍构,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甜无,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年哥遮,在試婚紗的時候發(fā)現(xiàn)自己被綠了岂丘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡眠饮,死狀恐怖奥帘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情君仆,我是刑警寧澤翩概,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布牲距,位于F島的核電站返咱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牍鞠。R本人自食惡果不足惜咖摹,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望难述。 院中可真熱鬧萤晴,春花似錦、人聲如沸胁后。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀芯。三九已至屯断,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殖演。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工氧秘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趴久。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓丸相,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彼棍。 傳聞我的和親對象是個殘疾皇子灭忠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354