JAVA基礎(五)

集合的由來?

面向對象語言對事務的體現都是以對象的形式,所以為了方便對多個對象的操作,JAVA就提供了集合類

集合和數組的區(qū)別?

數組 集合
長度固定 長度可變
存儲基本數據類型 只可以存儲對象

Collection集合的功能概述?

Collection表示一組對象,這些對象也成為collection元素。
一些collection允許有重復的元素,另一些不允許有重復的元素。
一些collection是有序的,另一些是無序的。

Collection集合存儲字符串并遍歷?(迭代器)

public static void collectiontest() {
Collection<String> col=new ArrayList();
col.add("eee");
col.add("cvv");
col.add("nvj");
Iterator it = col.iterator(); //迭代器
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}

Collection集合存儲自定義對象并遍歷?(迭代器)

public static class Person{
        private String name;

        public Person() {
            super();
        }
        public Person(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection c=new ArrayList();
        Person p1=new Person("呵呵噠");
        Person p2=new Person("萌萌噠");
        c.add(p1);
        c.add(p2);
        Iterator It=c.iterator();
        while(It.hasNext()) {
            Person s=(Person)It.next();
            System.out.println(s.getName());
        }

List集合的特有功能?

List是有序的collection??梢詫α斜碇忻總€元素的插入位置進行精確地控制。用戶可以根據元素的證書索引訪問元素,并搜索列表中的元素。

List接口成員方法

void add(int index,E element)//添加元素
E remove(int index)//刪除元素
E get(int index)//獲得元素
E set(int index,E element)//修改元素
ListIterator listIterator()//迭代器
boolean hasPrevious()//ListIterator的方法,用于反向遍歷鏈表,與hasNaxt()方法相同
E previous()//ListIterator的方法,用于反向遍歷鏈表,與next()方法相同返回越過的對象
ConcurrentModificationException//在每個迭代器的方法開始處檢查自己改寫操作的計數值是否與集合的改寫操作計數值一致;如果不一致,拋出ConcurrentModificationException

List集合存儲字符串并遍歷?(迭代器和普通for)

public static void ListTest() {
    List list=new ArrayList();
    list.add("呵呵呵");
    list.add("好累啊");
    list.add("努力吧");
    for(int i=0;i<list.size();i++) {
        System.out.println("這是for循環(huán)的:"+list.get(i));
    }
    ListIterator litor=list.listIterator();
    while(litor.hasNext()) {
        String s=(String)litor.next();
        System.out.println("這是ListIterator的:"+s);
    }
}

并發(fā)修改異常出現的原因?解決方案?

A: 出現的現象
迭代器遍歷集合,集合修改集合元素
B: 原因
迭代器是依賴于集合的,而集合的改變迭代器并不知道。
C: 解決方案
a:迭代器遍歷,迭代器修改(ListIterator)
元素添加在剛才迭代的位置
b:集合遍歷,集合修改(size()和get())
元素添加在集合的末尾

常見的數據結構的特點?

棧:Stack<T> 后進先出。
隊列:Queue<T> 先進先出。隊列在聲明的時候可以是泛型。
數組:只合適查詢比較頻繁,增刪較少的情況,對于int類型數據,默認初始值為1;
鏈表:單鏈表和雙鏈表,LinkedList list=new LinkedList(),出了頭結點,每個節(jié)點包含一個數據域和一個指針域,除了頭、尾節(jié)點,每個節(jié)點的指針指向下一個節(jié)點。

List集合的子類特點

ArrayList:底層數據結構是數組,查詢快,增刪慢。線程不安全,效率高。
Vector:底層數據結構是數組,查詢快,增刪慢。線程安全,效率低。特有addElement(E obj),E elementAt(int index),Enumeration element()三種方法。
LinkedList:底層數據結構是鏈表,查詢慢,增刪快,線程不安全,效率高。特有addFirst(E e)、addLast(E e),getFirst()、getLast(),removeFirst()、removeLast() 6中方法。

LinkedList練習

A:LinkedList存儲字符串并遍歷
B:LinkedList存儲自定義對象并遍歷

public static void main(String[] args) {
    // TODO Auto-generated method stub
    LinkedList<String> lt=new LinkedList<String>();
    lt.add("String");
    lt.add("interstring");
    Oo oo=new Oo("不好玩","找工作好累");
    lt.add(oo.getIi());
    lt.add(oo.getMm());
    for(int i=0;i<lt.size();i++) {
        System.out.println(lt.get(i));
    }

}

泛型是什么?格式是?好處是?

  • 泛型是一種特殊的類型,它把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候進行。
    也被稱作為參數化類型,可以把類型當作參數一樣傳遞過來,在傳遞過來之前并不明確,但在使用的時候就變得明確。

  • 格式:

  1. 泛型類
    public class 類名<泛型類型,……>
  2. 泛型方法
    public<泛型類型>返回類型 方法名(泛型類型)
  3. 泛型接口
    public interface 接口名<泛型類型1……>
  • 好處:
  1. 提高了程序的安全性
  2. 將運行期遇到的問題轉移到了編譯期
  3. 省去了類型強轉的麻煩

增強for的格式是?好處是?弊端是?

  • 作用:簡化數組和Collection集合的遍歷
  • 格式:
    for(元素類型變量 變量:數組或者Collection集合){
    使用變量即可,該變量就是元素
    }
  • 好處:簡化遍歷
  • 弊端:增強for的目標要判斷是否為null

靜態(tài)導入的格式是?注意事項是?

  • 格式:improt static 包名……類名.方法名;
  • 注意事項:
    方法必須是靜態(tài)
    如果有多個同名的靜態(tài)方法,必須加前綴

可變參數的作用是?格式是?注意事項是?

  • 作用:
    定義方法時候不知道該定義多少個參數
  • 格式:
    修飾符 返回值類型 方法名(數據類型…… 變量名){}
  • 注意事項:
    這里的變量其實是一個數組。
    如果一個方法有可變參數,并且有多個參數,那么可變參數肯定是最后一個

用下列集合完成代碼

Collection
List
ArrayList
Vector
LinkedList

存儲字符串并遍歷
存儲自定義對象并遍歷

要求加入泛型,并有增強for遍歷。
public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkedList<String> lt=new LinkedList<String>();
        Collection<String> l1=new ArrayList<String>();
        ArrayList<String> l2=new ArrayList<String>();
        Vector<String> l3=new Vector<String>();
        lt.add("String");
        lt.add("interstring");
        Oo oo=new Oo("不好玩","找工作好累");
        lt.add(oo.getIi());
        lt.add(oo.getMm());
        for(String s:lt) {
            System.out.println("LinkedList:"+s);
        }
        l1.addAll(lt);
        for(String s:l1) {
            System.out.println("Collection:"+s);
        }
        l2.addAll(l1);
        for(String s:l2) {
            System.out.println("ArrayList:"+s);
        }
        l3.addAll(l2);
        for(String s:l3) {
            System.out.println("LinkedLis:"+s);
        }
        
    }   
class Oo{
    public Oo(String ii, String mm) {
        super();
        this.ii = ii;
        this.mm = mm;
    }
    public String getIi() {
        return ii;
    }
    public void setIi(String ii) {
        this.ii = ii;
    }
    public String getMm() {
        return mm;
    }
    public void setMm(String mm) {
        this.mm = mm;
    }
    private String ii;
    private String mm;
}

Set接口

一個不包含重復元素的collection

HasSet類

不保證set的迭代順序,特別是它不保證該順序恒久不變。
底層數據結構是哈希表,元素是鏈表的數組。哈希表依賴于哈希值存儲。

LinkedHashSet類

元素有序唯一,由鏈表保證元素有序,由哈希表保證元素唯一。

TreeSet

使用元素的自然順序對元素進行排序,或者根據創(chuàng)建set時提供的Comparator進行排序,
底層數據結構是紅黑樹

編寫一個程序,獲取10個1至20的隨機數,要求隨機數不能重復。

Random r=new Random();
        int h;
        TreeSet<Integer> tst=new TreeSet<Integer>();
        for(int i=0;tst.size()<10;i++) {
            h=r.nextInt(20);
                tst.add(h);//TreeSet不允許重復元素,所有不需要判斷重復
        }
        for(Integer m:tst) {
            System.out.println(m);
        }

什么是異常

異常就是Java程序在運行過程中出現的錯誤   

異常的分類

異常分為三類
  • Error //編譯時異常,運行時候可以不顯示處理
  • Exception //編譯時異常
  • RuntimeExeption //所有RuntimeExeption都成為運行時異常,必須顯示處理

如何處理異常

  • JVM默認把異常的名稱,錯誤原因以及一場出現的位置等信息輸出在控制臺

  • 程序停止運行

  • 異常的進行過程:
    列如:jvm發(fā)現運算是已經違反了數學運算規(guī)則,java將這種常見的問題進行描述,并封裝成了對象叫做ArithmeticException
    當除0運算發(fā)生后,jvm將該問題打包成了一個異常對象.
    并將對象拋給調用者main函數,new ArithmeticException("/by zero");

    main函數收到這個問題時,有兩種處理方式:
    1,自己將該問題處理,然后繼續(xù)運行
    2,自己沒有針對的處理方式,只有交給調用main的jvm來處理
    jvm有一個默認的異常處理機制,就將該異常進行處理.并將該異常的名稱,異常的信息.異常出現的位置打印在了控制臺上
    同時將程序停止運行

  • 異常處理方案

  1. try……catch……finally
    其中try用于檢測異常,catch用于捕獲異常,finally使用結束資源

  2. throw、throws、Throwable

throw throws Throwable
只用在方法體內 用在方法聲明后面,跟的是異常類名 它是接口
只能拋出一個異常對象名 可以跟多個異常類名 getMessage()獲取異常信息,返回字符串
拋出異常由方法體內的語句處理 拋出異常由方法調用者來處理 printStackTrace()獲取異常類名和異常信息,以及異常位置,返回void
執(zhí)行throw則一定拋出了某種異常 throws表示出現異常的一種可能性,不一定發(fā)生 printStackTrace(PrintStram s)通常保存在文檔中
  1. 當異常發(fā)生時候,后續(xù)程序需要執(zhí)行就用try,不需要就用throws

編譯時期異常和運行時期異常的區(qū)別

編譯時期異常,JAVA程序必須顯示處理,否則程序會發(fā)生錯誤。
運行時期異常,JAVA程序無需顯示處理,也可以和編譯時期異常一樣處理。

finally關鍵字的特點

被finally控制的語句體一定會執(zhí)行
特殊情況:在執(zhí)行到finally之前jvm退出了。
  • 作用:用于釋放資源,在IO流操作和數據庫操作中會見到

finally相關的面試題

final,finally和finalize的區(qū)別
final用于修飾類和變量,修飾過的類不能被繼承,修飾過的變量就變成個常量
finally是異常處理中使用的。用于不管初步出現異常都必須處理的事情,列如關閉連接。
finalize是方法名,是JAVA的垃圾清理機制,用于清理對象內存,在垃圾收集器刪除對象之前調用。

如果catch里面有return語句,請問finally的代碼還會執(zhí)行嗎?如果會,請問是在return前還是return后。
會執(zhí)行,在return之前

File的構造方法

Public File(String pathname)
Public File(String parent,String child)
Public File(File parent,String child)

File的成員方法

  • 創(chuàng)建功能
    public boolean createNewFile()
    public boolean mkdir()
    public boolean mkdirs()
  • 刪除功能
    public boolean delete()
  • 重命名功能
    public boolean renameTo(File dest)
  • 判斷功能
    public boolean isDirectory()
    public boolean isFile()
    public boolean exists()
    public boolean canRead()
    public boolean canWrite()
    public boolean isHidden()
  • 基本獲取功能
    public String getAbsolutePath()
    public String getPath()
    public String getName()
    public long length()
    public long lastModified()
  • 高級獲取功能
    public String[] list()
    public File[] listFiles()

獲取指定目錄下指定后綴名的文件名稱

判斷E盤目錄下是否有后綴名為.jpg的文件,如果有,就輸出此文件名稱
File file=new File("E:\\");
        String[] arr=file.list();
        for(String s:arr) {
            if(s.endsWith(".jpg")) {
                System.out.println(s);
            }
        }
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一、基礎知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,565評論 0 4
  • 在經過一次沒有準備的面試后,發(fā)現自己雖然寫了兩年的android代碼,基礎知識卻忘的差不多了。這是程序員的大忌,沒...
    猿來如癡閱讀 3,117評論 3 10
  • Set 接口 前面我們學了 List 集合。我們知道 List 是一個有序的集合,可以根據元素的整數索引訪問元素,...
    Anonymous___閱讀 546評論 1 0
  • 冬夜,要睡覺啦。莽莽套在她的睡袋里,乖乖躺在我身邊。最近她喜歡跟我睡一個被窩,我只能等她睡熟后,才好把她挪到自己...
    xunbeinini閱讀 294評論 0 0
  • 重新拾起讀書的日子 庭外風帶來消息 講你的離別,臉色平和 我猜想,你昔日的樣子 我再一次為你寫詩 我明白此后不再為...
    惜遲閱讀 190評論 0 2

友情鏈接更多精彩內容