1 Java基礎(chǔ)

1

class helloworld {
    public static void main (String[] args) {
    System.out.println("helloworld!");
    }
}

2 命名規(guī)則

  • 標(biāo)識(shí)符起名:不能以數(shù)字開頭,不能是java的關(guān)鍵字,區(qū)分大小寫

  • 標(biāo)識(shí)符組成規(guī)則:英文大小寫,數(shù)字,$和_

  • 包名要求全部小寫,一般是公司的域名倒著寫

  • 例如:com.heima.包的作用

  • 類或接口

  • 如果是一個(gè)單詞,要求首字母大寫,如果是多個(gè)單詞要求每個(gè)單詞首字母大寫(駝峰命名)

  • DemoStudent

  • 方法和變量

  • 如果是一個(gè)單詞,每個(gè)字母都小寫,如果是多個(gè)單詞,從第二個(gè)單詞開始首字母大寫
    getName setName maxValue

  • 常量

  • 如果是一個(gè)單詞,所有字母大寫,如果是多個(gè)單詞也是所有字母大寫,但是用_分開

  • MAX

  • MAX_VALUE

3 進(jìn)制

  • 1byte=8bit 1m=1024k 1g=1024m 1t=1024g
  • 0b110 表示二進(jìn)制的110
  • 0110 表示八進(jìn)制110
  • 0x110 表示十六進(jìn)制的22
  • 十進(jìn)制轉(zhuǎn)換任意進(jìn)制:除積倒取余數(shù)
  • 二進(jìn)制轉(zhuǎn)八進(jìn)制:每3位劃成一組
  • 二進(jìn)制轉(zhuǎn)十六進(jìn)制:每4位劃成一組
  • 8421碼二進(jìn)制快速轉(zhuǎn)任意進(jìn)制

4 原碼 反碼 補(bǔ)碼

  • 原碼
  • 最高位是符號(hào)位,“0”表示正,“1”表示負(fù)
  • 反碼
  • 正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
  • 補(bǔ)碼
  • 正數(shù)的反碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。

多態(tài)

  • 多態(tài)的前提
    • 要有繼承或?qū)崿F(xiàn)關(guān)系
    • 要有方法的重寫
    • 要有父類引用指向子類對(duì)象
  • 多態(tài)成員訪問特點(diǎn)
  • 成員變量:編譯看父類,運(yùn)行看父類
  • 成員方法:編譯看父類,運(yùn)行看子類
  • 向上轉(zhuǎn)型
  • 父類引用指向子類對(duì)象就是向上轉(zhuǎn)型
  • 向下轉(zhuǎn)型
  • 格式:子類型 對(duì)象名 = (子類型)父類引用;
  • 多態(tài)的好處:提高可擴(kuò)展性
  • 多態(tài)的弊端:無法調(diào)用子類特有的方法

抽象類

  • 抽象類和抽象方法必須使用abstract修飾
  • 抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
  • 抽象類通過子類,采用多態(tài)的形式實(shí)例化(不能直接實(shí)例化)
  • 抽象類的子類必須重寫抽象類中的所有抽象方法(抽象類的子類本身是個(gè)抽象類除外)
  • 抽象方法定義:public abstract 返回值類型 方法名();

接口

  • 接口就是一種規(guī)范

  • 接口的成員變量默認(rèn)被public static final修飾,是個(gè)常量,可以 接口名.變量名 直接調(diào)用。

  • 接口的成員方法默認(rèn)被 public abstract修飾。

  • 接口沒有構(gòu)造方法。

  • 接口內(nèi)不能有非抽象方法。

  • 接口和抽象類的區(qū)別?

  • 抽象類有局限性,只能繼承一次,唯一的繼承位一定是留給共性抽取的

  • 接口可以實(shí)現(xiàn)任意個(gè),接口可以定義規(guī)范

  • 接口不能直接實(shí)例化。接口如何實(shí)例化呢?

  • 參照多態(tài)的方式,通過實(shí)現(xiàn)類對(duì)象實(shí)例化,這叫接口多態(tài)。

    【多態(tài)的形式:具體類多態(tài),抽象類多態(tài),接口多態(tài)?!?/p>

  • 接口的子類

  • 要么重寫接口中的所有抽象方法

  • 要么子類也是抽象類

  • 接口和接口關(guān)系是繼承關(guān)系,可以多繼承

內(nèi)部類

  • 內(nèi)部類可分為兩種形式

  • 成員內(nèi)部類

  • 局部內(nèi)部類

  • 內(nèi)部類可以直接訪問外部類的成員,包括私有

  • 外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對(duì)象

  • 匿名內(nèi)部類

  • 前提:存在一個(gè)類或者接口,可以是具體類也可以是抽象類

  • 本質(zhì):是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象

  • 解釋: 匿名(匿了實(shí)現(xiàn)類的名字) 內(nèi)部類 (這個(gè)類是在main方法內(nèi)的局部內(nèi)部類)

  • 匿名內(nèi)部類的格式

    • 格式:new 類名 ( ) { 重寫方法 } new 接口名 ( ) { 重寫方法 }

    • 舉例:

java
    new Inter(){
    @Override
    public void method(){}
    } ;
  • 匿名內(nèi)部類直接調(diào)用方法
    例1
    java
    interface Inter{
    void method();
    }

    class Test{
    public static void main(String[] args){
    new Inter(){                //這是一個(gè)匿名內(nèi)部類,也是匿名對(duì)象
    @Override
    public void method(){
    System.out.println("我是匿名內(nèi)部類");
    }
    }.method();   // 直接調(diào)用方法
    }
    }
    

例2
java
interface Inter{
void method();
}

  class Test{
    public static void main(String[] args){
        Inter i=new Inter(){                //這是一個(gè)匿名內(nèi)部類,不是匿名對(duì)象
            @Override
             public void method(){
            System.out.println("我是匿名內(nèi)部類");
            }
        };
        i.method(); // 調(diào)用方法
    }
  }

常用API

  • Math()
  • Math類的常用方法
方法名 方法名 說明
public static int abs(int a) 返回參數(shù)的絕對(duì)值
public static double ceil(double a) 返回大于或等于參數(shù)的最小double值,等于一個(gè)整數(shù)
public static double floor(double a) 返回小于或等于參數(shù)的最大double值,等于一個(gè)整數(shù)
public static int round(float a) 按照四舍五入返回最接近參數(shù)的int
public static int max(int a,int b) 返回兩個(gè)int值中的較大值
public static int min(int a,int b) 返回兩個(gè)int值中的較小值
public static double pow (double a,double b) 返回a的b次冪的值
public static double random() 返回值為double的正值,[0.0,1.0)
  • System
    • System類的常用方法

| 方法名 | 說明 |
| ---------------------------------------- | --------------------------------------------- - |
| public static void exit(int status) | 終止當(dāng)前運(yùn)行的 Java 虛擬機(jī),非零表示異常終止 |
| public static long currentTimeMillis() | 返回當(dāng)前時(shí)間(以毫秒為單位) |

  • Object類
  • 重寫toString方法的方式
  1. Alt + Insert 選擇toString
  2. 在類的空白區(qū)域,右鍵 -> Generate -> 選擇toString
  • toString方法的作用:
    以良好的格式,更方便的展示對(duì)象中的屬性值

  • 重寫equals方法的場(chǎng)景
    不希望比較對(duì)象的地址值,想要結(jié)合對(duì)象屬性進(jìn)行比較的時(shí)候。

  • 重寫equals方法的方式
    alt + insert 選擇equals() and hashCode(),IntelliJ Default,一路next,finish即可

  • Arrays的常用方法

    方法名 說明
    public static String toString(int[] a) 返回指定數(shù)組的內(nèi)容的字符串表示形式
    public static void sort(int[] a) 按照數(shù)字順序排列指定的數(shù)組

基本包裝類

  • Integer 類
  • Integer的構(gòu)造方法
方法名 說明
public Integer(int value) 根據(jù) int 值創(chuàng)建 Integer 對(duì)象(過時(shí))
public Integer(String s) 根據(jù) String 值創(chuàng)建 Integer 對(duì)象(過時(shí))
public static Integer valueOf(int i) 返回表示指定的 int 值的 Integer 實(shí)例
public static Integer valueOf(String s) 返回一個(gè)保存指定值的 Integer 對(duì)象 String

int和String類型的相互轉(zhuǎn)換

  • int轉(zhuǎn)換為String
  • 轉(zhuǎn)換方式
    • 方式一:直接在數(shù)字后加一個(gè)空字符串
    • 方式二:通過String類靜態(tài)方法valueOf()
  • String轉(zhuǎn)換為int
  • 轉(zhuǎn)換方式
    • 方式一:先將字符串?dāng)?shù)字轉(zhuǎn)成Integer,再調(diào)用intValue()方法
      Integer i = Integer.valueOf(s);
      int x = i.intValue();
    • 方式二:通過Integer靜態(tài)方法parseInt()進(jìn)行轉(zhuǎn)換
      int y = Integer.parseInt(s);
  • StringBuilder類
  • 構(gòu)造方法
    StringBuilder sb = StringBuilder();
  • 常用方法
    append(String s) :在字符串后連接字符串s
    String toString() :返回字符串結(jié)果

自動(dòng)裝箱和拆箱

  • 自動(dòng)裝箱

    ? 把基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)的包裝類類型

  • 自動(dòng)拆箱

    ? 把包裝類類型轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型

  • 例子:
    Integer i = 100; // 自動(dòng)裝箱
    i += 200; // i = i + 200; i + 200 自動(dòng)拆箱;i = i + 200; 是自動(dòng)裝箱

時(shí)間、日期類

Date類

  • 構(gòu)造方法

    方法名 說明
    public Date() 分配一個(gè) Date對(duì)象,并初始化,默認(rèn)為創(chuàng)建對(duì)象時(shí)的時(shí)間,精確到毫秒
    public Date(long date) 分配一個(gè) Date對(duì)象,并將其初始化為表示從標(biāo)準(zhǔn)基準(zhǔn)時(shí)間起指定的毫秒數(shù)
  • 常用方法

    方法名 說明
    public long getTime() 獲取的是日期對(duì)象從1970年1月1日 00:00:00到現(xiàn)在的毫秒值
    public void setTime(long time) 設(shè)置時(shí)間,給的是毫秒值

    【getTime(long time)和System.currentTimeMillis()類似?!?/p>

SimpleDateFormat類

  • SimpleDateFormat類構(gòu)造方法

    方法名 說明
    public SimpleDateFormat() 構(gòu)造一個(gè)SimpleDateFormat,使用默認(rèn)模式和日期格式
    public SimpleDateFormat(String pattern) 構(gòu)造一個(gè)SimpleDateFormat使用給定的模式和默認(rèn)的日期格式
  • SimpleDateFormat類的常用方法

    • 格式化(從Date到String)
      • public final String format(Date date):將日期格式化成日期/時(shí)間字符串
    • 解析(從String到Date)
      • public Date parse(String source):從給定字符串的開始解析文本以生成日期
  • 示例代碼

    public class SimpleDateFormatDemo {
        public static void main(String[] args) throws ParseException {
            //格式化:從 Date 到 String
            Date d = new Date();
    //        SimpleDateFormat sdf = new SimpleDateFormat();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String s = sdf.format(d);
            System.out.println(s);
            System.out.println("--------");
    
            //從 String 到 Date
            String ss = "2048-08-09 11:11:11";
            //ParseException
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date dd = sdf2.parse(ss);
            System.out.println(dd);
        }
    }
    

Calendar類

  • 其日歷字段已使用當(dāng)前日期和時(shí)間初始化:Calendar rightNow = Calendar.getInstance();
    Calendar是一個(gè)抽象類,不能直接構(gòu)造,可以用.getInstance() 方法構(gòu)造(多態(tài)的形式)。

  • Calendar類常用方法

    public int get(int field) 返回給定日歷字段的值

    public abstract void add(int field, int amount) 根據(jù)日歷的規(guī)則,將指定的時(shí)間量添加或減去給定的日歷字段

    public final void set(int year,int month,int date) 設(shè)置當(dāng)前日歷的年月日

  • 注意:MONTH范圍是0~11,所以實(shí)際月份是MONTH+1

  • 例子
    Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR); //Calendar.YEAR =1;.get(1)代表返回年的值。
    int month = c.get(Calendar.MONTH)+1; //Calendar.MONTH=2;
    int date = c.get(Calendar.DATE); //Calendar.DATE=5;
    System.out.println(year + "年" + month + "月" + date + "日");
    //需求1:3年前的今天
    c.add(Calendar.YEAR,-3);
    year = c.get(Calendar.YEAR);
    month = c.get(Calendar.MONTH) + 1;
    date = c.get(Calendar.DATE);
    System.out.println(year + "年" + month + "月" + date + "日");
    //設(shè)置當(dāng)前日歷的年月日
    c.set(2050,10,10);
    year = c.get(Calendar.YEAR);
    month = c.get(Calendar.MONTH) + 1;
    date = c.get(Calendar.DATE);
    System.out.println(year + "年" + month + "月" + date + "日");

異常

異常的體系

  • Throwable
  • Error
  • Exception
    • RuntimeException
    • 非RuntimeException
  • Error嚴(yán)重問題,不需要處理
  • Exception 稱為異常類,它表示程序本身可以處理的問題
  • RuntimeException 在編譯器不檢查
  • 非RuntimeException 編譯器就必須處理,否則程序不能通過編譯

try-catch方式處理異常

  • 定義格式

    try {
      可能出現(xiàn)異常的代碼;
    } catch(異常類名 變量名) {
      異常的處理代碼;
    }
    
  • 執(zhí)行流程

    • 程序從 try 里面的代碼開始執(zhí)行
    • 出現(xiàn)異常,就會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的 catch 里面去執(zhí)行
    • 執(zhí)行完畢之后,程序還可以繼續(xù)往下執(zhí)行

Throwable成員方法(應(yīng)用)##

  • 常用方法

    方法名 說明
    public String getMessage() 返回此 throwable 的詳細(xì)消息字符串
    public String toString() 返回此可拋出的簡短描述
    public void printStackTrace() 把異常的錯(cuò)誤信息輸出在控制臺(tái)

throws方式處理異常(應(yīng)用)

  • 定義格式

public void 方法() throws 異常類名 {

}

  • 注意事項(xiàng)

    • 這個(gè)throws格式是跟在方法的括號(hào)后面的
    • 編譯時(shí)異常必須要進(jìn)行處理,兩種處理方案:try...catch …或者 throws,如果采用 throws 這種方案,將來誰調(diào)用誰處理
    • 運(yùn)行時(shí)異常可以不處理,出現(xiàn)問題后,需要我們回來修改代碼

throws和throw的區(qū)別

  • throws
  • 用在方法聲明后面,跟的是異常類名
  • 表示拋出異常,由該方法的調(diào)用者來處理
  • 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這些異常
  • throw
  • 用在方法體內(nèi),跟的是異常的對(duì)象名
  • 表示拋出異常,由方法體內(nèi)的語句處理
  • 執(zhí)行throw一定拋出了某種異常

自定義異常(應(yīng)用)

  • 例子
  • 自定義異常類
      public class ScoreException extends Exception {
      
          public ScoreException() {}
      
          public ScoreException(String message) {
              super(message);
          }
      
      }
  • 老師類

    public class Teacher {
        public void checkScore(int score) throws ScoreException {
            if(score<0 || score>100) {
    //            throw new ScoreException();
                throw new ScoreException("你給的分?jǐn)?shù)有誤,分?jǐn)?shù)應(yīng)該在0-100之間");
            } else {
                System.out.println("成績正常");
            }
        }
    }
    
  • 測(cè)試類

    public class Demo {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("請(qǐng)輸入分?jǐn)?shù):");
    
            int score = sc.nextInt();
    
            Teacher t = new Teacher();
            try {
                t.checkScore(score);
            } catch (ScoreException e) {
                e.printStackTrace();
            }
        }
    }
    
    

Collection集合

集合體系結(jié)構(gòu)

  • 集合
  • collection(單列)
    • list(可重復(fù),有序列)
      • ArrayList (查詢快,增刪慢)
      • LinkedList (查詢慢,增刪快)
    • set (不可重復(fù))
      • HashSet (無序)
        • LinkedHashSet (有序)
      • TreeSet (會(huì)按一定規(guī)則排序)
  • map(雙列)
    • HashMap

Collection集合基本使用

  • Collection集合概述

    • 是單例集合的頂層接口,它表示一組對(duì)象,這些對(duì)象也稱為Collection的元素
  • 創(chuàng)建Collection集合的對(duì)象
    Collection<String> c = new ArrayList<String>();

  • Collection集合的常用方法【應(yīng)用】

方法名 說明
boolean add(E e) 添加元素
boolean remove(Object o) 從集合中移除指定的元素
void clear() 清空集合中的元素
boolean contains(Object o) 判斷集合中是否存在指定的元素
boolean isEmpty() 判斷集合是否為空
int size() 集合的長度,也就是集合中元素的個(gè)數(shù)

Collection集合的遍歷

  • 迭代器的介紹
    • 迭代器,集合的專用遍歷方式

Collection<String> c = new ArrayList<>();
//返回此集合中元素的迭代器,地址指向it
Iterator<String> it = c.iterator();
//用while循環(huán)改進(jìn)元素的判斷和獲取
while (it.hasNext()) {
String s = it.next();
System.out.println(s);

List集合概述和特點(diǎn)

  • List集合概述
    • 有序集合(也稱為序列),用戶可以精確控制列表中每個(gè)元素的插入位置。用戶可以通過整數(shù)索引訪問元素,并搜索列表中的元素
    • 與Set集合不同,列表通常允許重復(fù)的元素
  • List集合特點(diǎn)
    • 有索引
    • 可以存儲(chǔ)重復(fù)元素
    • 元素存取有序

List集合的特有方法

方法名 描述
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 刪除指定索引處的元素,返回被刪除的元素
E set(int index,E element) 修改指定索引處的元素,返回被修改的元素
E get(int index) 返回指定索引處的元素

2.5列表迭代器【應(yīng)用】##

  • ListIterator介紹

    • 通過List集合的listIterator()方法得到,所以說它是List集合特有的迭代器
    • 用于允許程序員沿任一方向遍歷的列表迭代器,在迭代期間修改列表,并獲取列表中迭代器的當(dāng)前位置
  • 示例代碼

    public class ListIteratorDemo {
        public static void main(String[] args) {
            //創(chuàng)建集合對(duì)象
            List<String> list = new ArrayList<String>();
    
            //添加元素
            list.add("hello");
            list.add("world");
            list.add("java");
    
            //獲取列表迭代器
            ListIterator<String> lit = list.listIterator();
            while (lit.hasNext()) {
                String s = lit.next();     //用listIterator()方法獲得的列表迭代器在遍歷期間加元素
                                                    不會(huì)發(fā)生并發(fā)修改異常。
                if(s.equals("world")) {
                    lit.add("javaee");
                }
            }
    
            System.out.println(list);
    
        }
    }
    

增強(qiáng)for循環(huán)

for(String s : list) {
System.out.println(s);
}

List集合子類的特點(diǎn)##

  • ArrayList集合

    ? 底層是數(shù)組結(jié)構(gòu)實(shí)現(xiàn),查詢快、增刪慢

  • LinkedList集合

    ? 底層是鏈表結(jié)構(gòu)實(shí)現(xiàn),查詢慢、增刪快

LinkedList集合的特有功能##

  • 特有方法

    方法名 說明
    public void addFirst(E e) 在該列表開頭插入指定的元素
    public void addLast(E e) 將指定的元素追加到此列表的末尾
    public E getFirst() 返回此列表中的第一個(gè)元素
    public E getLast() 返回此列表中的最后一個(gè)元素
    public E removeFirst() 從此列表中刪除并返回第一個(gè)元素
    public E removeLast() 從此列表中刪除并返回最后一個(gè)元素

Set集合

Set集合概述和特點(diǎn)

  • Set集合的特點(diǎn)
    • 沒有索引、只能通過迭代器或增強(qiáng)for循環(huán)遍歷
    • 不能存儲(chǔ)重復(fù)元素
  • HashSet集合特點(diǎn)
    • 底層是哈希表
    • 儲(chǔ)存無序
  • LinkHashSet集合特點(diǎn)
    • 儲(chǔ)存有序

//創(chuàng)建集合對(duì)象
Set<String> set = new HashSet<String>();

哈希值

  • 哈希值簡介

    ? 是JDK根據(jù)對(duì)象的地址或者字符串或者數(shù)字算出來的int類型的數(shù)值

  • 如何獲取哈希值

    ? Object類中的public int hashCode():返回對(duì)象的哈希碼值

  • 哈希值的特點(diǎn)

    • 同一個(gè)對(duì)象多次調(diào)用hashCode()方法返回的哈希值是相同的
    • 默認(rèn)情況下,不同對(duì)象的哈希值是不同的。而重寫hashCode()方法,可以實(shí)現(xiàn)讓不同對(duì)象的哈希值相同

HashSet集合保證元素唯一性源碼分析

  • HashSet集合保證元素唯一性的原理

    ? 1.根據(jù)對(duì)象的哈希值計(jì)算存儲(chǔ)位置

    ? 如果當(dāng)前位置沒有元素則直接存入

    ? 如果當(dāng)前位置有元素存在,則進(jìn)入第二步

    ? 2.當(dāng)前元素的元素和已經(jīng)存在的元素比較哈希值

    ? 如果哈希值不同,則將當(dāng)前元素進(jìn)行存儲(chǔ)

    ? 如果哈希值相同,則進(jìn)入第三步

    ? 3.通過equals()方法比較兩個(gè)元素的內(nèi)容

    ? 如果內(nèi)容不相同,則將當(dāng)前元素進(jìn)行存儲(chǔ)

    ? 如果內(nèi)容相同,則不存儲(chǔ)當(dāng)前元素

HashSet集合存儲(chǔ)學(xué)生對(duì)象并遍歷

  • 案例需求

    • 創(chuàng)建一個(gè)存儲(chǔ)學(xué)生對(duì)象的集合,存儲(chǔ)多個(gè)學(xué)生對(duì)象,使用程序?qū)崿F(xiàn)在控制臺(tái)遍歷該集合
    • 要求:學(xué)生對(duì)象的成員變量值相同,我們就認(rèn)為是同一個(gè)對(duì)象
      【注意點(diǎn)】:要對(duì)對(duì)象的類的hashCode()和equals()方法重寫,才能保證集合內(nèi)對(duì)象唯一性
  • 代碼實(shí)現(xiàn)

    • 學(xué)生類

      public class Student {
          private String name;
          private int age;
      
          public Student() {
          }
      
          public Student(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          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;
          }
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              if (o == null || getClass() != o.getClass()) return false;
      
              Student student = (Student) o;
      
              if (age != student.age) return false;
              return name != null ? name.equals(student.name) : student.name == null;
          }
      
          @Override
          public int hashCode() {
              int result = name != null ? name.hashCode() : 0;
              result = 31 * result + age;
              return result;
          }
      }
      
    • 測(cè)試類

      public class HashSetDemo02 {
          public static void main(String[] args) {
              //創(chuàng)建HashSet集合對(duì)象
              HashSet<Student> hs = new HashSet<Student>();
      
              //創(chuàng)建學(xué)生對(duì)象
              Student s1 = new Student("林青霞", 30);
              Student s2 = new Student("張曼玉", 35);
              Student s3 = new Student("王祖賢", 33);
      
              Student s4 = new Student("王祖賢", 33);
      
              //把學(xué)生添加到集合
              hs.add(s1);
              hs.add(s2);
              hs.add(s3);
              hs.add(s4);
      
              //遍歷集合(增強(qiáng)for)
              for (Student s : hs) {
                  System.out.println(s.getName() + "," + s.getAge());
              }
          }
      }
      

LinkedHashSet集合概述和特點(diǎn)

  • LinkedHashSet集合特點(diǎn)

    • 哈希表和鏈表實(shí)現(xiàn)的Set接口,具有可預(yù)測(cè)的迭代次序
    • 由鏈表保證元素有序,也就是說元素的存儲(chǔ)和取出順序是一致的
    • 由哈希表保證元素唯一,也就是說沒有重復(fù)的元素

TreeSet集合概述和特點(diǎn)

  • TreeSet集合概述

    • 元素有序,可以按照一定的規(guī)則進(jìn)行排序,具體排序方式取決于構(gòu)造方法
      • TreeSet():根據(jù)其元素的自然排序進(jìn)行排序
      • TreeSet(Comparator comparator) :根據(jù)指定的比較器進(jìn)行排序
    • 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
    • 由于是Set集合,所以不包含重復(fù)元素的集合

自然排序Comparable的使用

  • 案例需求

    • 存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用無參構(gòu)造方法
    • 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
  • 實(shí)現(xiàn)步驟

    • 用TreeSet集合存儲(chǔ)自定義對(duì)象,無參構(gòu)造方法使用的是自然排序?qū)υ剡M(jìn)行排序的
    • 自然排序,就是讓元素所屬的類實(shí)現(xiàn)Comparable接口,重寫compareTo(T o)方法
    • 重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件來寫
  • 代碼實(shí)現(xiàn)

    • 學(xué)生類

      public class Student implements Comparable<Student> {          //繼承Comparable接口,接口帶泛型
          private String name;
          private int age;
      ....
          @Override
          public int compareTo(Student s) {                                      //重寫compareTo方法
      /* 
      如果返回值大于0,括號(hào)內(nèi)對(duì)象放在序列最后一個(gè)對(duì)象后面;
      如果返回值等于0,表示對(duì)象重復(fù),則對(duì)象不添加進(jìn)集合;
      如果返回值小于0,括號(hào)內(nèi)對(duì)象和序列最后一個(gè)對(duì)象對(duì)換位置;
      */
             int num = this.age - s.age;       //this.age在前-->正序;                     
      //        int num = s.age - this.age;    //this.age在后-->倒序;
              //年齡相同時(shí),按照姓名的字母順序排序
             int num2 = num==0?this.name.compareTo(s.name):num;
              return num2;
          }
      }
      
    • 測(cè)試類

      public class TreeSetDemo02 {
          public static void main(String[] args) {
              //創(chuàng)建集合對(duì)象
              TreeSet<Student> ts = new TreeSet<Student>();
      
              //創(chuàng)建學(xué)生對(duì)象
              Student s1 = new Student("xishi", 29);
             ....
              //把學(xué)生添加到集合
              ts.add(s1);
             ....
              //遍歷集合
              for (Student s : ts) {
                  System.out.println(s.getName() + "," + s.getAge());
              }
          }
      }
      

比較器排序Comparator的使用

  • 案例需求

    • 存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用帶參構(gòu)造方法
    • 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
  • 實(shí)現(xiàn)步驟

    • 用TreeSet集合存儲(chǔ)自定義對(duì)象,帶參構(gòu)造方法使用的是比較器排序?qū)υ剡M(jìn)行排序的
    • 比較器排序,就是讓集合構(gòu)造方法接收Comparator的實(shí)現(xiàn)類對(duì)象,重寫compare(T o1,T o2)方法
    • 重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件來寫
  • 代碼實(shí)現(xiàn)

    • 學(xué)生類

      public class Student {
          private String name;
          private int age;
      
         ....
      }
      
    • 測(cè)試類

      public class TreeSetDemo {
          public static void main(String[] args) {
              //創(chuàng)建集合對(duì)象,匿名內(nèi)部類重寫compare方法
              TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
                  @Override
                  public int compare(Student s1, Student s2) {                                                 //注意,這里重寫compare
                      //this.age - s.age
                      //s1,s2
                      int num = s1.getAge() - s2.getAge();
                      int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;       //注意,這里調(diào)用的是compareTo()方法
                      return num2;
                  }
              });
      
              //創(chuàng)建學(xué)生對(duì)象
              Student s1 = new Student("xishi", 29);
              ....
      
              //把學(xué)生添加到集合
              ts.add(s1);
              ....
      
              //遍歷集合
              for (Student s : ts) {
                  System.out.println(s.getName() + "," + s.getAge());
              }
          }
      }
      

泛型概述和好處

  • 泛型概述

    ? 是JDK5中引入的特性,它提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許在編譯時(shí)檢測(cè)到非法的類型

  • 泛型的好處

    • 把運(yùn)行時(shí)期的問題提前到了編譯期間
    • 避免了強(qiáng)制類型轉(zhuǎn)換

泛型類

  • 示例代碼

    • 泛型類

      public class Generic<T> {
          private T t;
      
          public T getT() {
              return t;
          }
      
          public void setT(T t) {
              this.t = t;
          }
      }
      
    • 測(cè)試類

      public class GenericDemo {
          public static void main(String[] args) {
              Generic<String> g1 = new Generic<String>();
              g1.setT("林青霞");
              System.out.println(g1.getT());
      
              Generic<Integer> g2 = new Generic<Integer>();
              g2.setT(30);
              System.out.println(g2.getT());
          }
      }
      
  • 示例代碼

    • 帶有泛型方法的類

      public class Generic {
          public <T> void show(T t) {
              System.out.println(t);
          }
      }
      

泛型接口

  • 示例代碼

    • 泛型接口

      public interface Generic<T> {
          void show(T t);
      }
      

類型通配符

  • 類型通配符的作用

    ? 為了表示各種泛型List的父類,可以使用類型通配符

  • 類型通配符的分類

    • 類型通配符:<?>
      • List<?>:表示元素類型未知的List,它的元素可以匹配任何的類型
      • 這種帶通配符的List僅表示它是各種泛型List的父類,并不能把元素添加到其中
    • 類型通配符上限:<? extends 類型>
      • List<? extends Number>:它表示的類型是Number或者其子類型
    • 類型通配符下限:<? super 類型>
      • List<? super Number>:它表示的類型是Number或者其父類型

可變參數(shù)

  • 可變參數(shù)介紹

    ? 可變參數(shù)又稱參數(shù)個(gè)數(shù)可變,用作方法的形參出現(xiàn),那么方法參數(shù)個(gè)數(shù)就是可變的了

  • 可變參數(shù)定義格式

  修飾符 返回值類型 方法名(數(shù)據(jù)類型… 變量名) {  }

   public void method(String... s){  }  //s是個(gè)數(shù)組

Map集合

Map集合概述和特點(diǎn)【理解】

  • Map集合概述

    interface Map<K,V>  K:鍵的類型;V:值的類型
    
  • Map集合的特點(diǎn)

    • 鍵值對(duì)映射關(guān)系
    • 一個(gè)鍵對(duì)應(yīng)一個(gè)值
    • 鍵不能重復(fù),值可以重復(fù)
    • 元素存取無序 !!!!!!!!!!!!!!!!!!!!!!

Map集合的基本功能【應(yīng)用】

  • 方法介紹

    方法名 說明
    V put(K key,V value) 添加元素 修改元素
    V remove(Object key) 根據(jù)鍵刪除鍵值對(duì)元素
    void clear() 移除所有的鍵值對(duì)元素
    boolean containsKey(Object key) 判斷集合是否包含指定的鍵
    boolean containsValue(Object value) 判斷集合是否包含指定的值
    boolean isEmpty() 判斷集合是否為空
    int size() 集合的長度,也就是集合中鍵值對(duì)的個(gè)數(shù)

Map集合的獲取功能【應(yīng)用】

  • 方法介紹

    方法名 說明
    V get(Object key) 根據(jù)鍵獲取值
    Set<K> keySet() 獲取所有鍵的集合
    Collection<V> values() 獲取所有值的集合
    Set<Map.Entry<K,V>> entrySet() 獲取所有鍵值對(duì)對(duì)象的集合

Map集合的遍歷(方式1)【應(yīng)用】

  • 遍歷思路

    • 我們剛才存儲(chǔ)的元素都是成對(duì)出現(xiàn)的,所以我們把Map看成是一個(gè)夫妻對(duì)的集合
      • 把所有的丈夫給集中起來
      • 遍歷丈夫的集合,獲取到每一個(gè)丈夫
      • 根據(jù)丈夫去找對(duì)應(yīng)的妻子
  • 步驟分析

    • 獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn)
    • 遍歷鍵的集合,獲取到每一個(gè)鍵。用增強(qiáng)for實(shí)現(xiàn)
    • 根據(jù)鍵去找值。用get(Object key)方法實(shí)現(xiàn)

Map集合的遍歷(方式2)【應(yīng)用】

  • 遍歷思路

    • 我們剛才存儲(chǔ)的元素都是成對(duì)出現(xiàn)的,所以我們把Map看成是一個(gè)夫妻對(duì)的集合
      • 獲取所有結(jié)婚證的集合
      • 遍歷結(jié)婚證的集合,得到每一個(gè)結(jié)婚證
      • 根據(jù)結(jié)婚證獲取丈夫和妻子
  • 步驟分析

    • 獲取所有鍵值對(duì)對(duì)象的集合
      • Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對(duì)對(duì)象的集合
    • 遍歷鍵值對(duì)對(duì)象的集合,得到每一個(gè)鍵值對(duì)對(duì)象
      • 用增強(qiáng)for實(shí)現(xiàn),得到每一個(gè)Map.Entry
    • 根據(jù)鍵值對(duì)對(duì)象獲取鍵和值
      • 用getKey()得到鍵
      • 用getValue()得到值

集合嵌套之ArrayList嵌套HashMap

  • 案例需求

    • 創(chuàng)建一個(gè)ArrayList集合,存儲(chǔ)三個(gè)元素,每一個(gè)元素都是HashMap
    • 每一個(gè)HashMap的鍵和值都是String,并遍歷。

集合嵌套之HashMap嵌套ArrayList

  • 案例需求

    • 創(chuàng)建一個(gè)HashMap集合,存儲(chǔ)三個(gè)鍵值對(duì)元素,每一個(gè)鍵值對(duì)元素的鍵是String,值是ArrayList
    • 每一個(gè)ArrayList的元素是String,并遍歷。

Collections集合工具類

Collections概述和使用【應(yīng)用】

  • Collections類的作用

    ? 是針對(duì)集合操作的工具類

  • Collections類常用方法

    方法名 說明
    public static void sort(List<T> list) 將指定的列表按升序排序
    public static void reverse(List<?> list) 反轉(zhuǎn)指定列表中元素的順序
    public static void shuffle(List<?> list) 使用默認(rèn)的隨機(jī)源隨機(jī)排列指定的列表

ArrayList集合存儲(chǔ)學(xué)生并排序【應(yīng)用】

  • 案例需求

    • ArrayList存儲(chǔ)學(xué)生對(duì)象,使用Collections對(duì)ArrayList進(jìn)行排序
    • 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
  • 代碼實(shí)現(xiàn)

    • 測(cè)試類

      public class CollectionsDemo02 {
          public static void main(String[] args) {
              //創(chuàng)建ArrayList集合對(duì)象
              ArrayList<Student> array = new ArrayList<Student>();
      
              //創(chuàng)建學(xué)生對(duì)象
              Student s1 = new Student("linqingxia", 30);
              ....
      
              //把學(xué)生添加到集合
              array.add(s1);
              ....
              //使用Collections對(duì)ArrayList集合排序
              //sort(List<T> list, Comparator<? super T> c)
              Collections.sort(array, new Comparator<Student>() {     //傳入array集合和Comparator方法并
          //重寫
                  @Override
                  public int compare(Student s1, Student s2) {
                      //按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
                      int num = s1.getAge() - s2.getAge();
                      int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
                      return num2;
                  }
              });
      
              //遍歷集合
              for (Student s : array) {
                  System.out.println(s.getName() + "," + s.getAge());
              }
          }
      }
      

File類

File類概述和構(gòu)造方法【應(yīng)用】

  • File類介紹

    • 它是文件和目錄路徑名的抽象表示
    • 文件和目錄是可以通過File封裝成對(duì)象的
    • 對(duì)于File而言,其封裝的并不是一個(gè)真正存在的文件,僅僅是一個(gè)路徑名而已。它可以是存在的,也可以是不存在的。將來是要通過具體的操作把這個(gè)路徑的內(nèi)容轉(zhuǎn)換為具體存在的
  • File類的構(gòu)造方法

    方法名 說明
    File(String pathname) 通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實(shí)例
    File(String parent, String child) 從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例
    File(File parent, String child) 從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例
  • 示例代碼

  public class FileDemo01 {
      public static void main(String[] args) {
          //File(String pathname):通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實(shí)例。
          File f1 = new File("E:\\itcast\\java.txt");
          System.out.println(f1);
  
          //File(String parent, String child):從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。
          File f2 = new File("E:\\itcast","java.txt");
          System.out.println(f2);
  
          //File(File parent, String child):從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例。
          File f3 = new File("E:\\itcast");
          File f4 = new File(f3,"java.txt");
          System.out.println(f4);
      }
  }

File類創(chuàng)建功能【應(yīng)用】

  • 方法分類

    方法名 說明
    public boolean createNewFile() 當(dāng)具有該名稱的文件不存在時(shí),創(chuàng)建一個(gè)由該抽象路徑名命名的新空文件
    public boolean mkdir() 創(chuàng)建由此抽象路徑名命名的目錄
    public boolean mkdirs() 創(chuàng)建由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄

File類判斷和獲取功能【應(yīng)用】

  • 判斷功能

    方法名 說明
    public boolean isDirectory() 測(cè)試此抽象路徑名表示的File是否為目錄
    public boolean isFile() 測(cè)試此抽象路徑名表示的File是否為文件
    public boolean exists() 測(cè)試此抽象路徑名表示的File是否存在
  • 獲取功能

    方法名 說明
    public String getAbsolutePath() 返回此抽象路徑名的絕對(duì)路徑名字符串
    public String getPath() 將此抽象路徑名轉(zhuǎn)換為路徑名字符串
    public String getName() 返回由此抽象路徑名表示的文件或目錄的名稱
    public String[] list() 返回此抽象路徑名表示的目錄中的文件和目錄的名稱字符串?dāng)?shù)組
    public File[] listFiles() 返回此抽象路徑名表示的目錄中的文件和目錄的File對(duì)象數(shù)組

File類刪除功能【應(yīng)用】

  • 方法分類

    方法名 說明
    public boolean delete() 刪除由此抽象路徑名表示的文件或目錄
  • 絕對(duì)路徑和相對(duì)路徑的區(qū)別

    • 絕對(duì)路徑:完整的路徑名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt
    • 相對(duì)路徑:必須使用取自其他路徑名的信息進(jìn)行解釋。例如:myFile\java.txt

遞歸

遞歸【應(yīng)用】

  • 遞歸的介紹

    • 以編程的角度來看,遞歸指的是方法定義中調(diào)用方法本身的現(xiàn)象
    • 把一個(gè)復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解
    • 遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算
  • 遞歸的基本使用

    public class DiGuiDemo {
        public static void main(String[] args) {
            //回顧不死神兔問題,求第20個(gè)月兔子的對(duì)數(shù)
            //每個(gè)月的兔子對(duì)數(shù):1,1,2,3,5,8,...
       
    
       //方法一(普通):    
      int[] arr = new int[20];
    
            arr[0] = 1;
            arr[1] = 1;
    
            for (int i = 2; i < arr.length; i++) {
                arr[i] = arr[i - 1] + arr[i - 2];
            }
            System.out.println(arr[19]);
    
       
       //方法二(遞歸):  
        System.out.println(f(20));    //調(diào)用下面定義的f()方法
       
       }
    
        /*
            遞歸解決問題,首先就是要定義一個(gè)方法:
                定義一個(gè)方法f(n):表示第n個(gè)月的兔子對(duì)數(shù)
                那么,第n-1個(gè)月的兔子對(duì)數(shù)該如何表示呢?f(n-1)
                同理,第n-2個(gè)月的兔子對(duì)數(shù)該如何表示呢?f(n-2)
    
            StackOverflowError:當(dāng)堆棧溢出發(fā)生時(shí)拋出一個(gè)應(yīng)用程序遞歸太深
         */
        public static int f(int n) {
            if(n==1 || n==2) {              //設(shè)定遞歸出口
                return 1;
            } else {
                return f(n - 1) + f(n - 2);
            }
        }
    }
    
  • 遞歸的注意事項(xiàng)

    • 遞歸一定要有出口。否則內(nèi)存溢出
    • 遞歸雖然有出口,但是遞歸的次數(shù)也不宜過多。否則內(nèi)存溢出

遞歸求階乘【應(yīng)用】

  • 案例需求

    ? 用遞歸求5的階乘,并把結(jié)果在控制臺(tái)輸出

  • 代碼實(shí)現(xiàn)

    public class DiGuiDemo01 {
        public static void main(String[] args) {
            //調(diào)用方法
            int result = jc(5);
            //輸出結(jié)果
            System.out.println("5的階乘是:" + result);
        }
    
        //定義一個(gè)方法,用于遞歸求階乘,參數(shù)為一個(gè)int類型的變量
        public static int jc(int n) {
            //在方法內(nèi)部判斷該變量的值是否是1
            if(n == 1) {
                //是:返回1
                return 1;
            } else {
                //不是:返回n*(n-1)!
                return n*jc(n-1);
            }
        }
    }
    

遞歸遍歷目錄【應(yīng)用】

  • 案例需求

    ? 給定一個(gè)路徑(E:\itcast),通過遞歸完成遍歷該目錄下所有內(nèi)容,并把所有文件的絕對(duì)路徑輸出在控制臺(tái)

  • 代碼實(shí)現(xiàn)

    public class DiGuiDemo02 {
        public static void main(String[] args) {
            //根據(jù)給定的路徑創(chuàng)建一個(gè)File對(duì)象
    //        File srcFile = new File("E:\\itcast");
            File srcFile = new File("E:\\itheima");
    
            //調(diào)用方法
            getAllFilePath(srcFile);
        }
    
        //定義一個(gè)方法,用于獲取給定目錄下的所有內(nèi)容,參數(shù)為第1步創(chuàng)建的File對(duì)象
        public static void getAllFilePath(File srcFile) {
            //獲取給定的File目錄下所有的文件或者目錄的File數(shù)組
            File[] fileArray = srcFile.listFiles();     //獲得目錄內(nèi)所有文件夾和文件的File對(duì)象組成的數(shù)組
            //遍歷該File數(shù)組,得到每一個(gè)File對(duì)象
            if(fileArray != null) {                       //防止目錄內(nèi)容為null,報(bào)錯(cuò)
                for(File file : fileArray) {
                    //判斷該File對(duì)象是否是目錄
                    if(file.isDirectory()) {
                        //是:遞歸調(diào)用
                        getAllFilePath(file);   
                    } else {
                        //不是:獲取絕對(duì)路徑輸出在控制臺(tái)
                        System.out.println(file.getAbsolutePath());
                    }
                }
            }
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,559評(píng)論 0 4
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • 面向?qū)ο笾饕槍?duì)面向過程。 面向過程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,220評(píng)論 0 4
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,424評(píng)論 0 2
  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 872評(píng)論 0 2

友情鏈接更多精彩內(nèi)容