日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)

發(fā)布時(shí)間:2024/7/23 java 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第1節(jié) 常用類庫(kù)(上)

面向?qū)ο蟾嗍撬枷肷系臇|西,常用類庫(kù)更多是工具上的東西,熟能生巧,多整理筆記。

一、泛型

1.1 概述

泛型,即“參數(shù)化類型”。就是將類型由原來(lái)具體類型進(jìn)行參數(shù)化 ,類似于方法中的變量參數(shù),此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參 ),然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參) 。

1.2 泛型的使用

泛型一般在類、接口和方法中使用,其中主要是類中用的更多。

1.2.1 泛型在類中的使用

先來(lái)看定義的時(shí)候的格式: package com.kaikeba.coreclasslibrary;public class Person<A> {private String name;private int age;//這里是形參,實(shí)際使用該類時(shí)需要給定實(shí)參,在該類中可以用A來(lái)代替一種不確定的類型private A data;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public A getData() {return data;}public void setData(A data) {this.data = data;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", data=" + data +'}';} } 再看使用時(shí)的格式: package com.kaikeba.coreclasslibrary;public class genericParadigm {public static void main(String[] args) {//實(shí)際使用時(shí)指定具體的類型給泛型,那么該類中所有的A全部替換為IntegerPerson<Integer> p = new Person<>();} }

看下面?zhèn)魅氩煌念愋?#xff0c;setData方法的參數(shù)列表中data的類型也隨之變化:


1.2.2 泛型在接口中的使用

定義時(shí)格式如下所示,和類中基本一致: public interface 接口名<T> {T getData(); }

接口都是要被類實(shí)現(xiàn)才有意義,實(shí)現(xiàn)接口時(shí),可以選擇指定泛型類型,也可以選擇不指定,如下所示:

1、指定類型

//指定類型:這樣的類使用時(shí)無(wú)需再給泛型具體的類型,直接使用即可 public class 類名 implements 接口名<String> {private String text;@Overridepublic String getData() {return text;} }

具體的使用案例:

package com.kaikeba.coreclasslibrary;public class genericParadigm2 {public static void main(String[] args) {Apple a = new Apple();a.text = "123";System.out.println(a.getData());}}interface Fruit<T>{T getData(); }//實(shí)現(xiàn)接口時(shí)指定類型 class Apple implements Fruit<String>{String text;@Overridepublic String getData() {return text;} }結(jié)果為:123

2、不指定類型:

//不指定類型:使用類時(shí)需要給定具體的類型 public class 類名<T> implements 接口名<T> {private T text;@Overridepublic T getData() {return text;} }

具體的使用案例:

package com.kaikeba.coreclasslibrary;public class genericParadigm2 {public static void main(String[] args) {Apple<String> a = new Apple<>();a.text = "123";System.out.println(a.getData());}}interface Fruit<T>{T getData(); }//實(shí)現(xiàn)接口時(shí)不指定類型 class Apple<T> implements Fruit<T>{T text;@Overridepublic T getData() {return text;} }結(jié)果:123

1.2.3 泛型在方法中的使用

泛型方法的格式如下,注意位置與類和接口不一樣: private static <T> T 方法名(T a, T b) {} 想用T的地方可以用T,不想用的地方就用自己想用的類型即可,上述的格式案例中全用了T,下面看個(gè)例子: package com.kaikeba.coreclasslibrary;public class genericParadigm {public static void main(String[] args) {//根據(jù)傳入的實(shí)際參數(shù)類型,自動(dòng)獲取泛型的類型print(123);}public static <A> void print(A a) {System.out.println(a);} }結(jié)果:123

1.3 泛型限制類型

在使用泛型的時(shí)候,可以指定泛型的限定區(qū)域,例如:必須是某某類的子類 或 某某接口的實(shí)現(xiàn)類,格式:

<T extends 類或接口1 & 接口2>

注意:這里不論是類還是接口,都是使用extends關(guān)鍵字。

package com.kaikeba.coreclasslibrary;public class genericParadigm2 {public static void main(String[] args) {// 如果傳入的不是水果的實(shí)現(xiàn)類,會(huì)報(bào)錯(cuò)// Plate<String> p = new Plate<>();// p.data = "String";// 如果傳入的符合要求,則正確Plate<Apple> p = new Plate<>();} }//定義一個(gè)水果接口 interface Fruit<T>{T getData(); }//實(shí)現(xiàn)水果接口的蘋果類 class Apple<T> implements Fruit<T>{T text;@Overridepublic T getData() {return text;} }//泛型限制只能傳入水果接口的實(shí)現(xiàn)類 class Plate<T extends Fruit>{T data; }

1.4 泛型中的通配符——?

類型通配符是使用 ? 代替方法具體的類型實(shí)參。

  • <? extends Parent>指定了泛型類型的上界,必須是Parent或其子類;

  • <? super Child>指定了泛型類型的下界,必須是Child或其父類;

  • <?>指定了沒有限制的泛型類型。

  • package com.kaikeba.coreclasslibrary;public class genericParadigm3 {public static void main(String[] args) {//不能將一個(gè)裝著蘋果的盤子看成一個(gè)裝著水果的盤子//多態(tài)建立的基礎(chǔ):左右對(duì)象是父子關(guān)系,此時(shí)是同級(jí)別類,只是泛型是父子類關(guān)系而已//多態(tài)不能用在容器的內(nèi)容上Plate3<? extends Fruit3> p1 = new Plate3<Apple3>();Plate3<? super Apple3> p2 = new Plate3<Fruit3>();}}interface Fruit3{}class Apple3 implements Fruit3{}class Plate3<T>{//也可以多個(gè)泛型T data; }

    1.5 泛型的作用以及注意事項(xiàng)

    作用:

  • 提高代碼的復(fù)用率

  • 泛型中的類型在使用時(shí)指定,不需要強(qiáng)制類型轉(zhuǎn)換(類型安全,編譯器會(huì)檢查類型)

  • 注意事項(xiàng):

    在編譯之后程序會(huì)采取去泛型化的措施,也就是Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗(yàn)泛型結(jié)果后,會(huì)將泛型的相關(guān)信息擦除,并且在對(duì)象進(jìn)入和離開方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法,也就是說(shuō),泛型信息不會(huì)進(jìn)入到運(yùn)行時(shí)階段。

    二、java.util.Objects類

    Objects類以及下面介紹的每一種類庫(kù),最好的學(xué)習(xí)方法就是看源碼以及注釋,其次可以配合中文手冊(cè),下面就是對(duì)其的整理。

    簡(jiǎn)介: 此類由靜態(tài)實(shí)用程序方法組成,用于對(duì)對(duì)象進(jìn)行操作,或在操作前檢查某些條件。這些實(shí)用程序包括空安全 (null-safe) 或空容忍 (null-tolerant) 方法,用于計(jì)算對(duì)象的哈希代碼、返回對(duì)象的字符串、比較兩個(gè)對(duì)象以及檢查索引或子范圍值是否超出范圍等等。

    2.1 checkFromIndexSize

    2.2 checkFromToIndex

    2.3 checkIndex

    上面這三個(gè)判斷索引范圍,自己寫也很簡(jiǎn)單。。。

    2.4 compare

    注意不是返回o,是返回0,還是看源碼注釋比較靠譜。。。

    2.5 deepEquals

    這個(gè)暫時(shí)用不到,用到了再來(lái)補(bǔ)充筆記。

    2.6 euqals

    這個(gè)目前比較重要,翻譯的實(shí)在不太行,以后還是多看源碼吧。

    它的作用在于,如果一個(gè)對(duì)象為null,那么它調(diào)用默認(rèn)Object的equals方法,會(huì)報(bào)空指針異常:

    package com.kaikeba.coreclasslibrary.objects;import java.util.Objects;/*** Objects*/ public class Demo {public static void main(String[] args) {String s1 = null;String s2 = "456";System.out.println(s1.equals(s2));} }結(jié)果為: Exception in thread "main" java.lang.NullPointerExceptionat com.kaikeba.coreclasslibrary.objects.Demo.main(Demo.java:12)

    因?yàn)閚ull對(duì)象沒有equals方法。

    但是如果使用Objects.equals則不會(huì):

    package com.kaikeba.coreclasslibrary.objects;import java.util.Objects;/*** Objects*/ public class Demo {public static void main(String[] args) {Person p1 = null;Person p2 = new Person();System.out.println(Objects.equals(p1, p2));} }結(jié)果為: false

    看一下equals的源碼就知道了:

    public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b)); }

    首先判斷a和b是否指向同一個(gè)對(duì)象,是則返回true,不是則看右邊的括號(hào),如果a為null,直接返回false,不空才調(diào)用Object.equals方法進(jìn)行比較,這樣可以避免因?yàn)榭諏?duì)象導(dǎo)致的異常拋出。

    2.7 hash


    哈希值目前還沒介紹,后續(xù)補(bǔ)充。。。

    2.8 hashCode

    返回一個(gè)非空對(duì)象的哈希碼,空對(duì)象返回0。

    源碼如下:

    public static int hashCode(Object o) {return o != null ? o.hashCode() : 0; }

    2.9 isNull,nonNull

    public static boolean isNull(Object obj) {return obj == null; }

    public static boolean nonNull(Object obj) {return obj != null; }

    2.10 requireNonNull、requireNonNullElse、requireNonNullElseGet





    2.11 toString


    三、java.lang.Math

    Math類包含用于執(zhí)行基本數(shù)值運(yùn)算的方法,如初等指數(shù)、對(duì)數(shù)、平方根和三角函數(shù)。




    看幾個(gè)較常用的:

    package com.kaikeba.coreclasslibrary.math;/*** Math*/ public class Demo {public static void main(String[] args) {System.out.println(Math.abs(-100));System.out.println(Math.min(100, 200));//返回最接近的整數(shù)System.out.println(Math.round(100.55));System.out.println(Math.round(-100.55));//返回小于等于參數(shù)的最大整數(shù)System.out.println(Math.floor(3.5));System.out.println(Math.floor(-3.5));//返回大于等于參數(shù)的最大整數(shù)System.out.println(Math.ceil(3.5));System.out.println(Math.ceil(-3.5));} }結(jié)果如下: 100 100 101 -101 3.0 -4.0 4.0 -3.0

    四、java.util.Arrays

    該類包含用于操作數(shù)組的各種方法(例如排序和搜索)。 此類還包含一個(gè)靜態(tài)工廠,允許將數(shù)組視為列表。
    如果指定的數(shù)組引用為null,則此類中的方法都拋出NullPointerException ,除非另有說(shuō)明。

    4.1 binarySearch


    除此之外,還有各種其他類型的二分查找,都是在一個(gè)數(shù)組中查找指定的值,返回找到的索引。

    4.2 compare

    比較兩個(gè)數(shù)組

    4.3 copyOf


    將一個(gè)數(shù)組里的內(nèi)容復(fù)制到一個(gè)新的長(zhǎng)度的數(shù)組中。

    4.4 copyOfRange

    將指定數(shù)組的指定范圍內(nèi)容復(fù)制到新數(shù)組中。

    4.5 equals

    比較兩個(gè)數(shù)組是否相同。

    4.6 fill

    將指定的元素分配給數(shù)組中每一個(gè)元素。

    4.7 mismatch

    查找并返回兩個(gè)數(shù)組中第一個(gè)不匹配的索引。

    4.8 sort

    按升序?qū)?shù)組進(jìn)行排序。

    4.9 toString

    返回?cái)?shù)組內(nèi)容的字符串表示形式。

    上述的方法并沒有全部總結(jié),還有一些不常用的方法沒有整理。

    下面看一個(gè)例子:

    package com.kaikeba.coreclasslibrary.arrays;import java.util.Arrays;public class Demo {public static void main(String[] args) {int[] arr = {8,1,2,3,4,5,6,7};//直接輸出arr是地址信息System.out.println(arr);//下面可以輸出數(shù)組的內(nèi)容,但是很麻煩for(int i=0; i<arr.length; i++) {if(i == arr.length - 1) {System.out.print(arr[i]);}else {System.out.print(arr[i] + ", ");}}System.out.println();//Arrays中的方法都是靜態(tài)的,直接用類名調(diào)用,無(wú)需新建對(duì)象//toString方法可以直接輸出數(shù)組內(nèi)每個(gè)元素System.out.println(Arrays.toString(arr));//sort方法可以升序排序Arrays.sort(arr);System.out.println(Arrays.toString(arr));//二分查找指定元素的索引,前提:數(shù)組必須有序System.out.println(Arrays.binarySearch(arr, 6));//動(dòng)態(tài)擴(kuò)容arr = Arrays.copyOf(arr, 15);System.out.println(Arrays.toString(arr));} }結(jié)果如下所示: [I@7c30a502 8, 1, 2, 3, 4, 5, 6, 7 [8, 1, 2, 3, 4, 5, 6, 7] [1, 2, 3, 4, 5, 6, 7, 8] 5 [1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0]

    五、java.math.BigDecimal

    5.1 概念

    通過在控制臺(tái)運(yùn)行0.1+0.2,會(huì)發(fā)現(xiàn)float和double的運(yùn)算誤差:

    package com.kaikeba.coreclasslibrary.bigdecimal;import java.math.BigDecimal;public class Demo {public static void main(String[] args) {System.out.println(0.1+0.2);} }結(jié)果: 0.30000000000000004

    雖然誤差很小,但是在類似于銀行這種地方,這些小誤差累計(jì)起來(lái)還是很嚴(yán)重的,所以需要一種嚴(yán)格準(zhǔn)確的計(jì)算類。為了實(shí)現(xiàn)精確運(yùn)算就需要借助java.math.BigDecimal類對(duì)要計(jì)算的對(duì)象加以描述。

    5.2 常用構(gòu)造方法

    有很多構(gòu)造方法,最常用字符串來(lái)指定精確值: public BigDecimal(String val) { }

    如:

    BigDecimal b1 = new BigDecimal("0.1"); BigDecimal b2 = new BigDecimal("0.2");

    5.3 常用方法

    有很多關(guān)于數(shù)學(xué)運(yùn)算的方法,最常用的還是加減乘除四個(gè)。下述所有的運(yùn)算方法,不會(huì)影響參與運(yùn)算的數(shù)據(jù)本身,運(yùn)算的結(jié)果會(huì)被封裝為一個(gè)新的BigDecimal對(duì)象,這個(gè)對(duì)象會(huì)通過return返回出去。

  • public BigDecimal add(BigDecimal augend):加法運(yùn)算

  • public BigDecimal subtract(BigDecimal augend):減法運(yùn)算

  • public BigDecimal multiply(BigDecimal augend):乘法運(yùn)算

  • public BigDecimal divide(BigDecimal augend):除法運(yùn)算

  • 看一個(gè)例子:

    package com.kaikeba.coreclasslibrary.bigdecimal;import java.math.BigDecimal;public class Demo {public static void main(String[] args) {BigDecimal b1 = new BigDecimal("0.1");BigDecimal b2 = new BigDecimal("0.2");BigDecimal b3 = b1.add(b2);System.out.println(b1);System.out.println(b2);System.out.println(b3);} }結(jié)果: 0.1 0.2 0.3

    總結(jié)

    以上是生活随笔為你收集整理的JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。