Java EE 第五篇 核心類庫(kù)(二)常用類庫(kù)

要求:熟悉常用類庫(kù)的使用犀农,整理常用方法蛙埂。

一筑煮、objects類

示例方法:

  1. equals()

    public static boolean equals(Object a, Object b)
    /**
    返回true如果參數(shù)相等油啤,彼此false其他评凝。 因此,如果這兩個(gè)參數(shù)是null 外邓, true返回撤蚊,如果只有一個(gè)參數(shù)為null , false返回损话。 否則侦啸,通過使用第一個(gè)參數(shù)的equals方法確定相等性。 
    參數(shù) 
    a - 一個(gè)對(duì)象 
    b - 要與 a進(jìn)行比較以獲得相等性的對(duì)象 
    結(jié)果 
    true如果參數(shù)彼此相等丧枪,否則為 false 
    */
    
    //源碼
        public static boolean equals(Object a, Object b) {
            return (a == b) || (a != null && a.equals(b));
        }
    
  1. toString()

    1光涂、toString(Object o)
    /**
    返回調(diào)用的結(jié)果 toString對(duì)于非 null參數(shù), "null"為 null的說法拧烦。 
    參數(shù) 
    o - 一個(gè)物體 
    結(jié)果 
    調(diào)用的結(jié)果 toString對(duì)于非 null參數(shù)忘闻, "null"為 null的說法 
    */
    
    //源碼
    public static String toString(Object o) {
            return String.valueOf(o);
        }
    
    public static String valueOf(Object obj) {
            return (obj == null) ? "null" : obj.toString();
        }
    
    2、toString(Object o, String nullDefault)
    /**
    如果第一個(gè)參數(shù)不是 null 恋博,則返回在第一個(gè)參數(shù)上調(diào)用 toString的結(jié)果齐佳,否則返回第二個(gè)參數(shù)。 
    參數(shù) 
    o - 一個(gè)物體 
    nullDefault - 如果第一個(gè)參數(shù)是 null 债沮,則返回的字符串 
    結(jié)果 
    如果它不是 null 炼吴,則在第一個(gè)參數(shù)上調(diào)用 toString ,否則調(diào)用第二個(gè)參數(shù)
    */
    public static String toString(Object o, String nullDefault) {
            return (o != null) ? o.toString() : nullDefault;
        }
    
  2. compare()

    public static <T> int compare(T a, T b, Comparator<? super T> c)
    /**如果參數(shù)相同則返回0疫衩,否則返回c.compare(a, b) 缺厉。 因此,如果兩個(gè)參數(shù)都是null則返回0隧土。 
    請(qǐng)注意提针,如果其中一個(gè)參數(shù)為null , NullPointerException可能會(huì)或可能不會(huì)拋出null 曹傀,具體取決于訂購(gòu)策略(如果有)辐脖, Comparator選擇具有null值。 
    
    參數(shù)類型 
    T - 要比較的對(duì)象的類型 
    參數(shù) 
    a - 一個(gè)物體 
    b - 要與 a進(jìn)行比較的對(duì)象 
    c - 比較前兩個(gè)參數(shù)的 Comparator 
    結(jié)果 
    如果參數(shù)相同 c.compare(a, b) 0皆愉,否則為 c.compare(a, b) 嗜价。
    */
        
    //源碼
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
            return (a == b) ? 0 :  c.compare(a, b);
        }
    

二、Math類

方法:

  1. abs()

    //源碼幕庐,求參數(shù)的絕對(duì)值
    public static int abs(int a) {
            return (a < 0) ? -a : a;
        }
    
  2. min()

    //源碼久锥,返回兩個(gè)參數(shù)中的較小值
    public static int min(int a, int b) {
            return (a <= b) ? a : b;
        }
    
  3. max()

    //源碼,返回兩個(gè)參數(shù)中的較大值
    public static int max(int a, int b) {
            return (a >= b) ? a : b;
        }
    
  4. round() 四舍五入

  5. floor() 返回小于等于參數(shù)的最大整數(shù)

  6. ceil() 返回大于等于參數(shù)的最小整數(shù)

    //源碼較為復(fù)雜异剥,展示使用過程
    System.out.println(Math.floor(100.5));
    System.out.println(Math.ceil(100.5));
    System.out.println(Math.round(100.5));
    System.out.println(Math.floor(-3.5));
    System.out.println(Math.floor(-3.5));
    System.out.println(Math.ceil(-3.5));
    System.out.println(Math.round(-3.5));
    /**
    100.0
    101.0
    101
    -4.0
    -4.0
    -3.0
    -3
    */
    

三瑟由、Arrays

方法:

  1. binarySearch(int[] original, int key)

    public static int binarySearch(int[] a, int key)
    /**
    使用二進(jìn)制搜索算法在指定的int數(shù)組中搜索指定的值。 在進(jìn)行此調(diào)用之前冤寿,必須對(duì)數(shù)組進(jìn)行排序(如sort(int[])方法)歹苦。 如果未排序青伤,則結(jié)果未定義。 如果數(shù)組包含具有指定值的多個(gè)元素殴瘦,則無法保證找到哪個(gè)元素狠角。 
    參數(shù) 
    a - 要搜索的數(shù)組 
    key - 要搜索的值 
    結(jié)果 
    搜索鍵的索引,如果它包含在數(shù)組中; 否則蚪腋, (-(insertion point) - 1) 丰歌。 插入點(diǎn)定義為鍵將插入到數(shù)組中的點(diǎn):第一個(gè)元素的索引大于鍵,或者如果數(shù)組中的所有元素都小于指定鍵屉凯, a.length 立帖。 請(qǐng)注意,當(dāng)且僅當(dāng)找到密鑰時(shí)神得,這才能保證返回值> = 0厘惦。 
    */
        
    //源碼
    public static int binarySearch(int[] a, int key) {
            return binarySearch0(a, 0, a.length, key);
        }
    
    private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                         int key) {
            int low = fromIndex;
            int high = toIndex - 1;
    
            while (low <= high) {
                int mid = (low + high) >>> 1;
                int midVal = a[mid];
    
                if (midVal < key)
                    low = mid + 1;
                else if (midVal > key)
                    high = mid - 1;
                else
                    return mid; // key found
            }
            return -(low + 1);  // key not found.
        }
    
    
  2. sort()

    public static void sort(int[] a)
    /**將指定的數(shù)組按升序排序偷仿。 
    實(shí)施說明:排序算法是Vladimir Yaroslavskiy哩簿,Jon Bentley和Joshua Bloch的雙樞軸快速算法。 該算法在許多數(shù)據(jù)集上提供O(n log(n))性能酝静,導(dǎo)致其他快速排序降級(jí)為二次性能节榜,并且通常比傳統(tǒng)(單樞軸)Quicksort實(shí)現(xiàn)更快。 
    
    參數(shù) 
    a - 要排序的數(shù)組 
    */
    
  3. toString()

    public static String toString(int[] a)
    /**
    返回指定數(shù)組內(nèi)容的字符串表示形式别智。 字符串表示由數(shù)組元素的列表組成宗苍,用方括號(hào)括起來( "[]" )。 相鄰元素由字符", " (逗號(hào)后跟空格)分隔薄榛。 元素將轉(zhuǎn)換為字符串讳窟,如String.valueOf(int) 。 返回"null"如果a為null 敞恋。 
    參數(shù) 
    a - 要返回其字符串表示形式的數(shù)組 
    結(jié)果 
    字符串表示形式 a 
    */
    
    //源碼
    public static String toString(int[] a) {
            if (a == null)
                return "null";
            int iMax = a.length - 1;
            if (iMax == -1)
                return "[]";
    
            StringBuilder b = new StringBuilder();
            b.append('[');
            for (int i = 0; ; i++) {
                b.append(a[i]);
                if (i == iMax)
                    return b.append(']').toString();
                b.append(", ");
            }
        }
    
  4. copyOf()

    public static int[] copyOf(int[] original, int newLength)//使用零復(fù)制指定的數(shù)組丽啡,截?cái)嗷蛱畛洌ㄈ缬斜匾允垢北揪哂兄付ǖ拈L(zhǎng)度硬猫。 對(duì)于在原始數(shù)組和副本中都有效的所有索引补箍,這兩個(gè)數(shù)組將包含相同的值。 對(duì)于在副本中有效但不在原件中有效的任何索引啸蜜,副本將包含0 坑雅。 當(dāng)且僅當(dāng)指定的長(zhǎng)度大于原始數(shù)組的長(zhǎng)度時(shí),這些索引才會(huì)存在衬横。 
    /**參數(shù) 
    original - 要復(fù)制的數(shù)組 
    newLength - 要返回的副本的長(zhǎng)度 
    結(jié)果 
    原始數(shù)組的副本裹粤,用零截?cái)嗷蛱畛湟垣@得指定的長(zhǎng)度 
    異常 
    NegativeArraySizeException - 如果 newLength是負(fù)數(shù) 
    NullPointerException - 如果 original為空 
        
    //源碼
    public static int[] copyOf(int[] original, int newLength) {
            int[] copy = new int[newLength];
            System.arraycopy(original, 0, copy, 0,
                             Math.min(original.length, newLength));
            return copy;
        }
    
    應(yīng)用:
    public static void main(String[] args) {
            int[] arr = {8,1,2,3,4,5,6,7};
            System.out.println(arr.toString());//非Arrays靜態(tài)方法
            Arrays.sort(arr);
            System.out.println(Arrays.toString(arr));
            System.out.println(Arrays.binarySearch(arr,6));
            arr = Arrays.copyOf(arr,10);
            System.out.println(arr.length);
        }
    /**
    [I@7c30a502
    [1, 2, 3, 4, 5, 6, 7, 8]
    5
    10
    */
    

四、BigDecimal

解決double類型數(shù)據(jù)運(yùn)算的精度丟失問題

方法:分別對(duì)應(yīng)加減乘除蜂林,構(gòu)造方法接收一個(gè)字符串參數(shù)表示小數(shù)

  1. add()
  2. substract()
  3. multiply()
  4. divide()
應(yīng)用:
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
System.out.println(b1.add(b2));
System.out.println(b1.multiply(b2));
System.out.println(b1.divide(b2));
System.out.println(b1.subtract(b2));

//獲取值
b1 = b1.add(b2);
double res = b1.doubleValue();//轉(zhuǎn)為double結(jié)果
System.out.println(res);

/**
0.3
0.02
0.5
-0.1
0.3
*/

五蛹尝、Date

可以表示毫秒后豫,并解釋為年月日小時(shí)等,由于不適于國(guó)際化突那,故國(guó)際化的工作使用Calendar類完成挫酿。解釋為年月日、格式化解析字符串的功能使用DateFormat類完成愕难,故Date真正使用的場(chǎng)景僅在于獲取毫秒值早龟,表示特定的時(shí)刻。

方法

  1. getTime()

    /**
    public long getTime()
    返回自此 Date對(duì)象表示的1970年1月1日00:00:00 GMT以來的毫秒數(shù)猫缭。 
    結(jié)果 
    自1970年1月1日00:00:00 GMT以來的毫秒數(shù)葱弟。
    */
    
  2. 構(gòu)造方法Date()

    //獲取當(dāng)前的時(shí)間,返回毫秒值
    public Date()分配一個(gè) Date對(duì)象并對(duì)其進(jìn)行初始化猜丹,使其表示分配的時(shí)間芝加,測(cè)量 Date到毫秒。 
    

    構(gòu)造方法Date(long date)

    /**public Date(long date)分配 Date對(duì)象并將其初始化以表示自標(biāo)準(zhǔn)基準(zhǔn)時(shí)間(稱為“紀(jì)元”)以來的指定毫秒數(shù)射窒,即1970年1月1日00:00:00 GMT藏杖。 
    參數(shù) 
    date - 格林威治標(biāo)準(zhǔn)時(shí)間1970年1月1日00:00:00之后的毫秒數(shù) 
    */
    
  3. setTime()

    /**
    public void setTime(long time)
    將此 Date對(duì)象設(shè)置為表示格林威治標(biāo)準(zhǔn)時(shí)間1970年1月1日00:00:00之后的 time毫秒的時(shí)間點(diǎn)。 
    參數(shù) 
    time - 毫秒數(shù)脉顿。 
    */
    
    應(yīng)用:
    Date date = new Date();
    System.out.println(date);
    
    long time = date.getTime() - (1*60*60*1000);
    Date date2 = new Date(time);
    System.out.println(date2);
    
    //Wed Oct 07 10:53:13 CST 2020
    //Wed Oct 07 09:53:13 CST 2020
    

六蝌麸、DateFormat類

對(duì)Date進(jìn)行格式化工作

  • DateFormat是日期/時(shí)間格式化子類的抽象類艾疟,它以與語言無關(guān)的方式格式化和分析日期或時(shí)間来吩。日期/時(shí)間格式化子類(例如[SimpleDateFormat](SimpleDateFormat.html) )允許格式化(即,日期→文本)蔽莱,解析(文本“日期”)和規(guī)范化弟疆。日期表示為Date`對(duì)象或自1970年1月1日00:00:00 GMT以來的毫秒數(shù)。

    DateFormat提供了許多類方法盗冷,用于根據(jù)默認(rèn)或給定的區(qū)域設(shè)置和多種格式樣式獲取默認(rèn)日期/時(shí)間格式化程序怠苔。 格式化風(fēng)格包括FULLLONG 正塌, MEDIUMSHORT 嘀略。 在方法描述中提供了更多細(xì)節(jié)和使用這些樣式的示例。

    DateFormat可幫助您格式化和解析任何區(qū)域設(shè)置的日期乓诽。 您的代碼可以完全獨(dú)立于幾個(gè)月帜羊,一周中的日期,甚至是日歷格式的區(qū)域設(shè)置約定:月球與太陽能鸠天。

DateFormat是一個(gè)抽象類讼育,不能直接使用,需要使用子類SimpleDateFormat。

應(yīng)用:

  1. 將Date對(duì)象轉(zhuǎn)化為指定的字符串

    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm ss");
    String text = format.format(new Date());
    System.out.println(text);
    
  2. 將字符串轉(zhuǎn)為Date(獲得毫秒時(shí)間戳奶段,可以進(jìn)行運(yùn)算饥瓷,計(jì)算時(shí)間差,或換算小時(shí)痹籍、天數(shù)等)

    Date date = format.parse("2020年12月12日 12:12 40");
            System.out.println((new Date().getTime() - date.getTime())/1000/60/60/24);
    //-66
    

七呢铆、Calendar類

可以對(duì)Date對(duì)象轉(zhuǎn)換時(shí)區(qū),抽象類蹲缠,但是可以使用getInstance方法來返回子類對(duì)象棺克。

//常用方法 set、get线定、add getTime()
Calendar cl = Calendar.getInstance();//默認(rèn)獲得的是當(dāng)前日期
int year = cl.get(Calendar.YEAR);
System.out.println(year);
int month = cl.get(Calendar.MONTH);
System.out.println(month + 1);//日歷0-11
int day = cl.get(Calendar.DAY_OF_MONTH);
System.out.println(day);

//修改日期
cl.set(Calendar.MONTH,10);
System.out.println(cl.get(Calendar.MONTH) + 1);

//日期加減
cl.add(Calendar.YEAR,1);
cl.add(Calendar.MONTH,3);
cl.add(Calendar.MONTH,-3);

//getTime():獲取日歷時(shí)間表示的Date對(duì)象
System.out.println(cl.getTime());

//getActualAcrualMaxium():獲取參數(shù)字段的最大值
System.out.println(cl.getActualMaximum(Calendar.DAY_OF_WEEK));
System.out.println(cl.getActualMaximum(Calendar.DAY_OF_MONTH));

/**
2020
10
7
11
Sun Nov 07 12:20:27 CST 2021
7
30
*/

八娜谊、String類

  1. 類內(nèi)使用數(shù)組存放字符串中的各個(gè)字符,數(shù)組確定長(zhǎng)度之后無法改變斤讥,所以String是不可變類型纱皆。
  2. 由于String對(duì)象是不可變的,所以可以共享芭商,兩次創(chuàng)建相同的字符串派草,實(shí)際上僅在(字符串常量池)堆區(qū)分配一塊內(nèi)存,兩個(gè)變量指向同一個(gè)地址蓉坎。但是通過new方式創(chuàng)建的同內(nèi)容字符串澳眷,地址還是不一樣的胡嘿。區(qū)別=和new構(gòu)造的區(qū)別蛉艾。
  3. 字符串常量池之前在方法區(qū),之后JDK1.7之后衷敌,被拿到了堆區(qū)中勿侯,運(yùn)行時(shí)常量池還在方法區(qū),也就是永久代(不會(huì)被GC回收缴罗,只有關(guān)閉JVM才會(huì)被回收)助琐,永久代移到堆內(nèi)存中之后,自JDK1.8起面氓,方法區(qū)的實(shí)現(xiàn)改為元空間兵钮。永久代中存儲(chǔ)的都是加載一次的,所有定義方法的信息舌界,屬于共享區(qū)間掘譬,供多個(gè)線程共享(靜態(tài)變量、常量呻拌、類信息葱轩、運(yùn)行時(shí)常量池)。堆內(nèi)存中也分為新生代、老年代靴拱、永久代垃喊。
  4. String有final修飾,不能被繼承袜炕,方法也不能被重寫本谜。
  5. 大量字符串拼接,多次拼接的場(chǎng)景下偎窘,不要使用加號(hào)耕突,會(huì)導(dǎo)致在內(nèi)存中出現(xiàn)大量垃圾,由于處于永久代中评架,不會(huì)被GC回收眷茁,要使用StringBuffer類和StringBuilder中提供的append方法進(jìn)行尾部拼接。StringBuffer類是線程安全的和StringBuilder是線程不安全的纵诞。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末上祈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浙芙,更是在濱河造成了極大的恐慌登刺,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡呼,死亡現(xiàn)場(chǎng)離奇詭異纸俭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)南窗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門揍很,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人万伤,你說我怎么就攤上這事窒悔。” “怎么了敌买?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵简珠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我虹钮,道長(zhǎng)聋庵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任芙粱,我火速辦了婚禮祭玉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宅倒。我一直安慰自己攘宙,他們只是感情好屯耸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹭劈,像睡著了一般疗绣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铺韧,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天多矮,我揣著相機(jī)與錄音,去河邊找鬼哈打。 笑死塔逃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的料仗。 我是一名探鬼主播湾盗,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼立轧!你這毒婦竟也來了格粪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤氛改,失蹤者是張志新(化名)和其女友劉穎帐萎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胜卤,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆导,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葛躏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈段。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖紫新,靈堂內(nèi)的尸體忽然破棺而出均蜜,到底是詐尸還是另有隱情李剖,我是刑警寧澤芒率,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站篙顺,受9級(jí)特大地震影響偶芍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜德玫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一匪蟀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宰僧,春花似錦材彪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘁捷。三九已至,卻和暖如春显熏,著一層夾襖步出監(jiān)牢的瞬間雄嚣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工喘蟆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缓升,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓蕴轨,卻偏偏與公主長(zhǎng)得像港谊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橙弱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354