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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java学习笔记2——常用类

發布時間:2023/12/10 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java学习笔记2——常用类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1 內部類
    • 1.1 成員內部類
    • 1.2 靜態內部類
    • 1.3 局部內部類
    • 1.4 匿名內部類
  • 2 Object類
    • 2.1 getClass()方法
    • 2.2 hashCode()方法
    • 2.3 toSring()方法
    • 2.4 equals()方法
    • 2.5 finalize()方法
  • 3 包裝類
    • 3.1 類型轉換與裝箱、拆箱
    • 3.2 整數緩沖區
  • 4 String類
    • 4.1 常用方法
    • 4.2 可變字符串
  • 5 BigDecimal類
  • 6 時間類型
    • 6.1 Date類
    • 6.2 Calendar類
    • 6.3 SimpleDateFormat類
    • 6.4 System類

1 內部類

  • 成員內部類
  • 靜態內部類
  • 局部內部類
  • 匿名內部類

內部類特點:
1.編譯之后會生成獨立的字節碼文件
2.內部類可直接訪問外部類的私有成員,而不破壞封裝
3.內部類可以為外部類提供必要的內部功能組件

1.1 成員內部類

在類的內部定義,與實例變量、實例方法同級別的類。

創建內部類對象時,必須依賴外部類對象。
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
或者一步到位:Outer.Inner inner = new Outer().new Inner();

當外部類、內部類存在同名屬性時,會優先訪問內部類屬性。如果需要調用外部類屬性,需要使用Outer.this.屬性

成員內部類不能定義靜態成員,但是可以定義靜態常量。

1.2 靜態內部類

不依賴外部類對象,可直接創建或通過類名訪問,可聲明靜態成員。(相當于外部類)

直接創建靜態內部類對象:
Outer.Inner Inner = new Outer.Inner();注意new Outer后面沒有括號,即沒有創建對象,表明Outer和Inner只是包含關系。

只有靜態內部類才能被static修飾,普通類不能被static修飾。

靜態內部類調用外部類對象的屬性需要使用Outer.屬性。
靜態內部類自己的的屬性和方法直接調用。

1.3 局部內部類

定義在外部類方法中,作用范圍和創建對象范圍僅限于當前方法。
不能加任何訪問修飾符。

如果需要在其他普通類調用局部內部類里面的方法(方法2),要在外部類的包含了局部內部類的局部方法(方法1)中創建局部內部類對象:

class Outer{方法1(){class Inner{方法2(){}}Inner inner = new Inner();inner.方法2(); } } class OtherClass{Outer outer = new Outer();outer.方法1();//這樣就可以調用到方法2了 }

局部內部類訪問外部類當前方法中的局部變量時,因無法保障變量的生命周期與自身相同,變量必須修飾為final。
訪問局部變量 jdk1.7要求局部方法中的變量必須為常量final、jdk1.8自動添加final修飾(只是不顯示而已)

1.4 匿名內部類

沒有類名的局部內部類(一切特征都與局部內部類相同)。

必須繼承一個父類或者實現一個接口。

定義類、實現類、創建對象的語法合并,只能創建一個該類的對象。

優點:減少代碼量;缺點:可讀性較差。

// 使用匿名內部類優化(相當于創建了一個局部內部類) Usb usb = new Usb(){ // Usb為一個接口/抽象類/父類(多態)@Overridepublic void service(){sout("連接電腦成功,fan開始工作")} }; usb.service();

2 Object類

  • 超類、基類,所有類的直接或間接父類,位于繼承樹的最頂層
  • 任何類,如沒有書寫extends顯示繼承某個類,都默認直接繼承Object類,否則為間接繼承
  • Object類中所定義的方法,是所有對象都具備的方法
  • Object類型可以存儲任何對象
    作為參數,可接受任何對象
    作為返回值,可返回任何對象

2.1 getClass()方法

public final Class<?> getClass(){}

返回引用中存儲的實際對象類型。
應用:通常用于判斷兩個引用中實際存儲對象類型是否一致。

Class class1 = s1.getClass(); Class class2 = s2.getClass(); // getClass返回 class類型 if(class1==class2){ // 判斷s1 和 s2是不是同一個類型 }

2.2 hashCode()方法

public int hashCode(){}

返回該對象的哈希碼值。

哈希值根據對象的地址或字符串或數字使用hash算法計算出來的int類型的值。

一般情況下相同對象返回相同哈希碼。

2.3 toSring()方法

public String toSring(){}

返回該對象的字符串表示(表現形式)
可以根據程序需求覆蓋該方法,如:展示對象各個屬性值

2.4 equals()方法

public boolean equals(Object obj){}

默認實現為(this == obj), 比較兩個對象地址是否相同。

可進行覆蓋,比較兩個對象的內容是否相同。

// 判斷兩個對象是否相等 Student s4 = new Strudent("小明", 17); Student s5 = new Strudent("小明", 17); sout(s4.equals(s5)); // false 堆中地址不同// 重寫 改變其比較內容 /* 步驟 1. 比較兩個應用是否指向同一個對象2. 判斷obj是否為null3. 判斷兩個引用只想的實際對象類型是否一致4. 強制類型轉換5. 依次比較各個屬性值是否相同 */ @override public boolean equals(Object obj){// 1.判斷兩個對象是否是同一個引用if(this == obj){return true;}// 2.判斷obj是否為nullif(obj == null){return false;}// 3.判斷是否是同一個類型// if(this.getClass() == obj.getClass()){//// }//最好使用instanceof 判斷對象是否是某種類型if(obj instanceof Student){// 4.強制類型轉換Student s = (Student)obj;// 5. 比較屬性if(this.name.equals(s.getName()) && this.age == s.getAge()){return true;}}return false; }

2.5 finalize()方法

當對象被判定為垃圾對象時,由JVM自動調用此方法,用以標記垃圾對象,進入回收隊列。

垃圾對象:沒有有效引用指向此對象時,為垃圾對象。

垃圾回收:由GC銷毀垃圾對象,釋放數據存儲空間。

自動回收機制:JVM的內存耗盡,一次性回收所有垃圾對象。

手動回收機制:使用System.gc();通知JVM執行垃圾回收。

3 包裝類

  • 基本數據類型所對應的引用數據類型。
  • Object 可統一所有數據,包裝類的默認值是null。
基本數據類型包裝類型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

3.1 類型轉換與裝箱、拆箱

8種包裝類提供不用類型間的轉換方式:

  • Number父類中提供的6個共性方法
  • parseXXX( )靜態方法
  • valueOf( )靜態方法
  • 注意:需保證類型兼容,否則拋出NumberFormatException異常

    //裝箱,基本類型轉成引用類型 //拆箱,引用類型轉成基本類型 // jdk1.5之后提供了自動裝箱拆箱int age = 30;//自動裝箱。自動完成了:Integer integer = Integer.valueOf(age);Integer integer = age;//// 自動拆箱。自動完成了該行代碼:int age2 = integer.intValue();int age2 = integer;

    基本類型和字符串之間轉換:

    // 1. 基本類型轉成字符串int n1 = 100;// 方法1 使用+號String s1 = n1 + "";// 方法2 使用Integer中的toString()方法String s2 = Integer.toString(n1);String s2 = Integer.toString(n1, x); // x為進制要求// 2. 字符串轉成基本類型String str = "150";// 使用Integer.parseXXX();int n2 = Integer.parseInt(str);// boolean 字符串形式轉成基本類型,"true" ---> true 非“true ———> falseString str2 = "true";boolean b1 = Boolean.parseBoolean(str2);

    3.2 整數緩沖區

    Java預先在堆內存中創建了256個常用的整數包裝類型對象,即[-128,127],當 Integer i =Integer.valueOf(x)處于這個區間之內,就直接將堆內存中的那個值的地址賦給i。如果x相同,i的地址都相同,如果不處于那個區間,則new一個對象。(此為源碼解讀)
    可以參考:低調的洋仔

    在實際應用當中,對已創建的對象進行復用(如下面的integer3和integer4例子)

    psvm(String[] args){// 面試題Integer integer1 = new Integer(100);Integer integer2 = new Integer(100);sout(integer1 == integer2); // falseInteger integer3 =100;// 自動裝箱// 相當于調用 Integer.valueOf(100);Integer integer4 =100;sout(integer3 == integer4); // trueInteger integer5 = 200;// 自動裝箱Integer integer6 = 200;sout(integer5 == integer6); // false// 因為緩存區數組 [-128, 127] 在這之內地址一樣 }

    4 String類

    • 字符串是常量,創建之后不可改變
    • 字符串字面值存儲在字符串池中,可以共享
    • String s = “Hello”;產生一個對象,字符串池中存儲
    • String s = new String(“Hello”); 產生兩個對象,堆、池各一個
      (由以上可知,因為產生了對象。可以直接用“字符串名.方法()”來調用方法)

    4.1 常用方法

    • public int length():返回字符串長度

    • public char charAt(int index):根據下標獲取字符

    • public boolean contains(String str):判斷當前字符串是否包含str

    • public char[] toCharArray():將字符串轉換成數組

    • public int indexOf(String str):查找str首次出現的下標,存在則返回該下標;不存在則返回-1。
      public int indexOf(String str, int fromIndex),從fromIndex下標開始查找。

    • public int lastIndexOf(String str):查找字符串在當前字符串中最后一次出現的下標索引

    • public String trim():去掉字符串前后的空格

    • public String toUpperCase():將小寫轉成大寫
      public String toLowerCase():將大寫轉成小寫

    • public boolean endsWith(String str):判斷字符串是否以str結尾
      public boolean starsWith(String str):判斷字符串是否以str開頭

    • public String replace(char oldChar, char newChar):將舊字符串替換成新字符串

    • public String[] split(String str):根據str做拆分,str可以是空格,如split(" “)。str可以是空格或逗號,如split(”[ ,]")。如果要將一個或多個空格或括號作為str,則醬紫寫split("[ ,]+")

    • public boolean equals(Object anObject):用于比較兩個字符串的內容是否相等

    • public boolean equalsIgnoreCase(String anotherString):用于將字符串與指定的對象比較,不考慮大小寫

    • public int compareTo(String
      anotherString):如果字符串的第一個字符和參數字符串的第一個字符不等,結束比較,返回兩字符的ASCII碼差值。

      如果字符串的第一個字符和參數字符串的第一個字符相等,則以兩者的第二個字符做比較,以此類推,直至不等為止,返回該字符的ASCII碼差值。
      如果兩個字符串不一樣長,可對應字符又完全一樣,則返回兩個字符串的長度差值。

    String str1 = "abc";String str2 = "aycccc";String str3 = "abc123";int result = str1.compareTo( str2 );sout(result);//-23result = str2.compareTo( str3 );sout(result);//23result = str3.compareTo( str1 );sout(result);//3

    4.2 可變字符串

    • StringBuffer : 可變長字符串,運行效率慢、線程安全
    • StringBuilder : 可變長字符串,運行快、線程不安全

    上面兩者效率都比String高且節省內存。

    psvm(String[] args){// StringBuffer 和 StringBuilder 用法一致StringBuffer sb = new StringBuffer();//StringBuilder sb = new StringBuilder();sb.append("java no1");// 1. append(); 在最后面追加sb.insert(0, "內容xx"); // 2. insert(); 插入內容sb.replace(0, 9, str); // 3.replace(); 替換(區間左閉右開)[0,9)sb.delete(0, 5); // 4. delete(); 刪除(左閉右開)[0,5)sb.delete(0, sb.length()); // 5. 清空 }

    5 BigDecimal類

    很多實際應用中需要用到精確運算,而double是近似值存儲,不符合要求。需要用到BigDecimal。

    位置:java.math包中
    作用:精確計算浮點數
    創建方式:BigDecimal bd = new BigDecimal(“x.xxx…”);(建議選擇字符串類型)

    • 加:BigDecimal add(BigDecimal bd)
    • 減:BigDecimal subtract(BigDecimal bd)
    • 乘:BigDecimal multiply(BigDecimal bd)
    • 除法:divide(BigDecimal bd, int scal, RoundingMode mode)
      參數scal:指定精確到小數點后幾位
      參數mode:指定小數部分的取舍模式,四舍五入模式為RoundingMode.HALF_UP
      例如:
    BigDecimal bd1 = new BigDecimal("1.0"); BigDecimal bd2 = new BigDecimal("0.9"); // 減法 BigDecimal r1 = bd1.subtract(bd2); sout(r1); // 0.1 BigDecimal r = new BigDecimal("14").subtract(new BigDecimal("4")).divide(new BigDecimal("3"), 3,RoundingMode.HALF_UP); //sout(r) 3.333 //(14-4)÷3,保留三位小數,使用四舍五入取舍

    6 時間類型

    6.1 Date類

    Date表示特定的瞬間,精確到毫秒。Date類中的大部分方法都已經被Calendar類中的方法所取代

    時間單位:1s = 1,000ms = 1,000,000 μs = 1,000,000,000 = ns

    psvm(String[] args){// 1 創建Date對象Date date1 = new Date();sout(date1.toString()); //WED Sept 02 22:25:23 CST 2020sout(date1.toLocaleString()); // 已過時,但也能用 2020-9-2// 創建昨天的Date date2 = new Date(date1.getTime() - (60*60*24*1000));sout(date2.toLocaleString());// 2 方法after beforeboolean b1 = date.after(date2);sout(b1); //trueboolean b2 = date1.before(date2);sout(b2); //false// 比較compareTo();int d = date1.compareTo(date2);sout(d); // 比較兩個日期的順序。date1比date2大則為正,否則負// 比較是否相等 equals()boolean b3 = date1.equals(date2);sout(b3); // false }

    6.2 Calendar類

    • Calendar提供了獲取或設置各種日歷字段的方法
    • 構造方法 protected Calendar(); 由于是protected 所以無法直接創建

    其他方法:

    方法名說明
    static Calendar getInstance()使用默認時區和區域獲取日歷
    void set(int year, int month, int date, int hourofday, int minute, int second)設置日歷的年、月、日、時、分、秒
    int get(int field)返回給定日歷字段的值。字段比如年、月、日
    void setTime(Date date)用給定的date設置此日歷時間
    Date getTime()返回一個date表示此日歷的時間
    void add(int field, int amount)按照日歷的規則,給指定字段添加或減少時間量
    long getTimeInMilles()毫秒為單位返回該日歷的時間值

    例子:

    psvm(String[] args){// 1. 創建 Calendar 對象Calendar calendar = Calendar.getInstance();sout(calendar.getTime().toLocaleString());// 2. 獲取時間信息// 獲取年int year = calendar.get(Calendar.YEAR);// 獲取月 從 0 - 11int month = calendar.get(Calendar.MONTH);// 日int month = calendar.get(Calendar.DAY_OF_MONTH);// 小時int hour = calendar.get(Calendar.HOUR_OF_DAY);// 分鐘int minute = calendar.get(Calendar.MINUTE);// 秒int second = calendar.get(Calendar.SECOND);// 3. 修改時間Calendar calendar2 = Calendar.getInstance();calendar2.set(Calendar.DAY_OF_MONTH, x);// 4. add修改時間calendar2.add(Calendar.HOUR, x); // x為正就加 負就減// 5. 補充方法int max = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);// 月數最大天數int min = calendar2.getActualMinimum(Calendar.DAY_OF_MONTH); }

    6.3 SimpleDateFormat類

    • SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類

    常用的時間模式字母:

    字母日期或時間示例
    y2019
    M年中月份08
    d月中天數10
    H一天中小時(0-23)22
    m分鐘16
    s59
    S毫秒356
    psvm(String[] args) throws ParseException{// 1. 創建對象SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");// 2. 創建DateDate date = new Date();// 格式化date(日期轉成字符串)String str = sdf.format(date);sout(str);// 解析(字符串轉成時間)Date date2 = sdf.parse("1948/03/12");//必須要與SimpleDateFormat()定義的格式一致sout(date2); }

    6.4 System類

    主要用于獲取系統的屬性數據和其他操作,構造方法私有的

    方法名說明
    static void arraycopy(…)復制數組
    static long currentTimeMillis();獲取當前系統時間,返回毫秒值
    static void gc();建議jvm趕快啟動垃圾回收期器回收垃圾
    static void exit(int status);退出jvm 如果參數是0表示正常退出jvm 非0表示異常退出
    //arraycopy 數組復制//src 源數組 //srcPos 從哪個位置開始復制0 //dest 目標數組 //destPos 目標數組的粘貼的開始位置 //length 復制的長度int[] arr = {20, 18, 39, 3};int[] dest = new int [4];System.arraycopy(arr, 0, dest, 1, 2);for (int s:dest) {System.out.println(s);// 輸出:0 20 18 0} }

    Arrays.copyOf(original, newLength)也可以復制數組,但這個的源碼其實還是用了System類的arraycopy方法

    currentTimeMillis()方法的一個應用:獲取程序運行用時

    long start = System.currentTimeMillis();//{程序}long end = System.currentTimeMillis();sout("用時:"+(end-start)); System.exit(0);//下面的代碼不再執行,因為JVM已經退出 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Java学习笔记2——常用类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。