面試復習(二) Java篇

  • 三大框架

    • MVC(Model、View奈搜、Controller)參考

      image

      • 原理:view層發(fā)送指令到controller層,由controller去通知model層更新數(shù)據(jù),model層更新完數(shù)據(jù)以后直接顯示在view層上应媚。

      • 對于安卓:View-》各類layout文件;Model-》數(shù)據(jù)邏輯操作猜极,包括java bean及其他repository中姜、API等;Controller-》activity等

      • 缺點:

        xml對view層控制力差跟伏,不能直接進行動態(tài)修改進行顯示或隱藏丢胚,只能交給controller(activity等)進行

        view與model層可以相互感知,存在耦合關系
        * MVP(Model受扳、View携龟、Presenter)


        image

        * 原理:用于操作view層發(fā)出的事件傳遞到presenter層中,presenter層去操作model層勘高,并且將數(shù)據(jù)返回給view層峡蟋,完全由presenter作為橋梁坟桅,通過接口與view連接
        * MVVM(Model、View蕊蝗、ViewModel)

      image
      • 與MVP相似仅乓,應具體分析優(yōu)劣,使用了谷歌data Binding框架
  • Collection框架

    • 存儲蓬戚、復用對象夸楣。特點:
      • 集合大小動態(tài)可變
      • 存儲引用類型數(shù)據(jù)(可以不同類型)
      • 提供迭代器對元素進行高效訪問
    • 六大接口:
      • Collection
      • Set、List子漩、SortedSet(繼承Collection接口)
      • Map豫喧、SortedMap
    • List:有序可重復,包括
      • ArrayList線程不安全痛单,底層數(shù)組實現(xiàn)嘿棘,容量不足長度擴大一倍。插入數(shù)據(jù)效率低旭绒,查找效率高
      • LinkedList線程不安全鸟妙,底層鏈表實現(xiàn)。插入數(shù)據(jù)位置越靠前效率越高挥吵,查找效率較低
      • Vector線程安全重父,底層數(shù)組實現(xiàn),容量不足長度擴大一倍忽匈。java1.5后不推薦
    • Set:元素不能重復房午,相當于只存儲了map的key值
      • HashSet底層HashMap實現(xiàn),無序
      • TreeSet底層TreeMap實現(xiàn)
    • Map:
      • HashMap
      • TreeMap丹允,排序郭厌,紅黑樹
      • HashTable
    • 遍歷:
  • hashmap 參考

    • Entry數(shù)組+鏈表組成,每個數(shù)組元素保存一個鏈表頭結點


      image

      HashMap中每個元素的HashCode%數(shù)組長度的值即為其所在鏈表對應的數(shù)組編號

    • 鏈表中結點保存 key雕蔽、value折柠、Entry<K,V> next、hashCode
    • 實現(xiàn)Collection的Map接口批狐,不允許重復鍵扇售,可以空鍵空值
    • 存入元素
      • 獲取該元素hashCode對應的鏈表數(shù)組編號,再調(diào)用equals()方法在鏈中遍歷查找正確結點嚣艇。

      • 該元素next指針指向該鏈表中棧頂鍵值對對象承冰,然后將該對象賦給數(shù)組值

          int hashCode = key.hasCode();
          int index = hashCode % Entry[].length;
          value.next = Entry[index];
          Entry[index] = element;
        
    • 優(yōu)化
      • 隨著map數(shù)據(jù)量增大,某個鏈表可能會很長食零,超過其負載因子所代表的容積時則創(chuàng)建一個兩倍大小的數(shù)組困乒,將原存儲的對象重新計算位置后放入到新的數(shù)組中。
      • 減少碰撞:采用不可變對象做鍵值
      • 多線程下條件競爭慌洪,多個線程寫入新的頭結點顶燕,造成操作覆蓋
      • equals()比hashCode()方法更全面復雜凑保,hashCode只用生成hashCode進行比較,效率更高涌攻。因此全部使用equals效率稍低欧引,可以先使用hashCode對比,若hashCode相同再采用equals
    • 碰撞檢測
      • hashCode相同但不equal時恳谎,兩個對象存儲在統(tǒng)一鏈表中芝此,
      • 鍵的hashCode相同時,首先找到對應的鏈表位置因痛,在調(diào)用key.equals()找到鍵在鏈表中的正確結點婚苹,從而找到對應的值對象
    • 不可變對象的好處:
      • 適合采用String、Interger鸵膏、Double這樣的封裝類做鍵膊升,其值是不可變的,并且重寫了hashCode()與equals()方法
      • 保證存入與獲取時通過鍵值計算的HashCode是不變的谭企,從而保證可以在HashMap中找到正確的對象
      • 線程安全
      • 采用自定義對象作為鍵時廓译,需要保證遵守hashCode()與equals()方法定義規(guī)則以減少碰撞,且對象插入后不會再改變(聲明為final)债查。
    • ConcurrentHashMap非区,相對HashTable在多線程時同步性能更好,效率更高盹廷,采用鎖分段技術征绸,將數(shù)據(jù)分段存儲,每段配一把鎖俄占,可以代替HashTable
    • synchronized Map:使用synchronized關鍵字保證map的操作是線程安全的
    • LinkedHashMap:HashMap子類管怠,采用了雙向鏈表,時間空間開銷增大缸榄,但是能保證插入與訪問順序
      • 節(jié)點中保存:before排惨、(hashCode、key碰凶、value、next)鹿驼、after欲低。
        • before、after用于維護雙向鏈表畜晰,指明了插入(或訪問)的前后順序
      • 構造函數(shù)中accessOrder置為true砾莱,使雙向鏈表按訪問先后順序排列,每次put或get時將當前entry放在鏈表尾部凄鼻。
    • hashCode()與equals()方法重寫
      • hashCode:
        • Object類中:根據(jù)內(nèi)存地址計算hashCode腊瑟,因此同一個類的不同對象會不一樣
        • String重寫方法:根據(jù)字符串內(nèi)容計算聚假,字符串所在堆空間相同,則hashCode相同
        • Integer重寫方法:數(shù)值相同返回hashCode相同
      • equals:
        • Object類中:通過對象內(nèi)存地址判斷

            public boolean equals(Object obj){
                return (this == obj);
            }
          
        • String重寫方法:對地址與內(nèi)容進行比較

            public boolean equals(Object anObj){
                if (this == anObj){return true;}
                if (anObj instanceof String){
                    String anotherStr = (String)anObj;
                    int n = count;
                    if (n == anotherStr.count){
                        char v1[] = this.value;
                        char v2[] = anotherStr.value;
                        int i = 0;//offset
                        int j = 0;//anotherStr.offset
                        while(n- != 0){
                            if(v1[i++] != v2[j++]){return false;}
                        }
                        return true;
                    }
                }
                return false;
            }
          
  • HashSet

    • 實現(xiàn)Collection的Set接口闰非,保存“值”膘格。
    • 不允許重復元素(通過hashCode()與equals()確定)
  • HashTable

    • 繼承Dictionary,實現(xiàn)Map财松、Cloneable瘪贱、Serializable接口
    • 多線程下synchronized同步,鍵值不能為空
    • 多線程下線程競爭鎖導致效率低
  • ArrayList

    • 內(nèi)部結構為Object[]數(shù)組
    • 非線程安全
  • 線程辆毡、四種線程池區(qū)別菜秦;run()與start()區(qū)別 1 2

    • 進程:一個獨立的運行環(huán)境,一個程序舶掖、應用球昨。不同進程使用不同內(nèi)存空間

    • 線程:進程中負責程序執(zhí)行的單元,是進程的子集主慰。同一進程的不同線程使用同一塊內(nèi)存

      • 時間片輪轉搶占式調(diào)度:每個線程執(zhí)行一段時間后強行暫停執(zhí)行下一個,使每個任務輪流執(zhí)行期犬。由于CPU執(zhí)行頻率高河哑,任務切換非常快龟虎,因此感覺是多個任務同時進行璃谨。

      • 線程任務按實現(xiàn)的接口劃分,可以繼承Runnable接口(重寫run())與Callable接口(重寫call())鲤妥,將任務提交給其它線程(Thread類或線程池)執(zhí)行

        1.new Thread(task).start();

        2.FutureTask<V> result = ThreadPoolExecutor.submit(task);

        3.new Thread(new FutureTask(V){callable}).start();

      • 創(chuàng)建線程的方法

        • 繼承Thread并重寫run()佳吞,通過start()開啟

            Thread thread = new Thread(){run(){...}};
            thread.start();
          
        • 實現(xiàn)Runnable并重寫run(),通過start()開啟

            Runnable r = new Runnable(){run(){...}};
            Thread thread = new Thread(r);
            thread.start;
          
        • Callable與FutureTask

          • Callable接口與Runnable接口類似棉安,但是可以返回值與異常底扳,重寫方法call(),任務返回FutureTask對象贡耽,其中攜帶了操作結果
          • FutureTask實現(xiàn)了RunnableFuture接口衷模,RunnableFuture接口實現(xiàn)了Future接口(包括取消操作、判斷是非取消或完成蒲赂、獲取結果抽象函數(shù))與Runnable接口阱冶,可以在Thread及ExecutorService中執(zhí)行。
        • 線程池

          • 新建線程池提交任務

            1.ThreadPoolExecutor.execute(task);

            2.線程池構造函數(shù)重要參數(shù):線程池核心線程數(shù)最大值滥嘴、線程最大總數(shù)木蹬、非核心線程最大閑置時長、任務隊列若皱、創(chuàng)建線程Factory等

            3.當有任務被提交時镊叁,若線程數(shù)小于核心線程數(shù)尘颓,則新建一個線程執(zhí)行任務

            若線程數(shù)大于核心線程數(shù),則將任務加入任務隊列晦譬,隊列裝滿后新建非核心線程執(zhí)行隊列任務

            若隊列也滿疤苹,則拋出異常
            * 選取四種現(xiàn)成的線程池直接提交任務

            ExecutorService threadPool = Executors.new .....ThreadPool(params);

            ExecutorService.newCachedThreadPool(2).submit(task);
            * 優(yōu)點:提高程序執(zhí)行效率、提高資源(CPU蛔添、內(nèi)存)利用率
            * 缺點:占用內(nèi)存空間痰催、線程越多CPU調(diào)度開銷越大、程序復雜
            * wait()與sleep()
            * wait:線程暫停執(zhí)行迎瞧,釋放同步鎖夸溶,直到被notify()通知喚醒
            * sleep:線程休眠,不釋放同步鎖凶硅,直到線程休眠時間結束或被interupt()打斷
            * thread.join()該thread內(nèi)run方法執(zhí)行完成后再進行下一步代碼或線程缝裁,保證了多線程間的執(zhí)行順序
            * thread.yield()線程放棄執(zhí)行,將CPU讓出足绅,等待下次被系統(tǒng)調(diào)度運行捷绑。
            * thread.stop()已過時,強制性氢妈,破壞線程原子邏輯粹污,不提倡使用
            * 保證安全停止線程的方法:

          stop = false
          while(!stop){
          synchronized{
          ....//需要保證運行邏輯完整的原子代碼
          }
          }

          public void terminate(){stop = true;}

    • 線程池:一塊存放多個為死亡線程的內(nèi)存空間,由線程池管理器管理調(diào)度首量,當有開辟線程的任務時即從池中獲取一個線程執(zhí)行任務壮吩,完成后再返回給線程池,從而

      1.節(jié)省了反復創(chuàng)建線程對象的性能開銷加缘。

      2.控制最大并發(fā)數(shù)鸭叙,避免大量線程相互搶占系統(tǒng)資源導致阻塞

      3.能夠對線程進行簡單的管理、定時執(zhí)行拣宏、間隔執(zhí)行等功能

      • Executor框架:調(diào)度沈贝、執(zhí)行、控制異任務對框架勋乾。利用Executor框架可以方便的創(chuàng)建線程池宋下,可以控制線程數(shù)量并對空閑線程進行回收利用,避免了無限制創(chuàng)建線程導致程序內(nèi)存溢出辑莫。

      • Executor接口——》ThreadPoolExecutor實現(xiàn)類

      • newCachedThreadPool:無限大小線程池杨凑,有任務添加且無空閑線程時可創(chuàng)建新線程,之前構造的空閑線程可用時能過進行重用

        對于較多的短期異步任務可以提高程序性能

        現(xiàn)有線程都不可用時將創(chuàng)建添加一個新的線程摆昧,并移除超過60s未被使用的線程。
        * newSingleThreadExecutor:池內(nèi)只有一個線程工作蜒程,所有任務串形執(zhí)行绅你。若該線程因異常而結束伺帘,則會構造一個新的線程代替。

        保證所有任務按提交順序執(zhí)行
        * newFixedThreadPool:固定大小的線程池忌锯。每接受一個任務即創(chuàng)建一個線程直到線程數(shù)量達到上限伪嫁。若其中有線程因異常結束則創(chuàng)建新的代替
        * newScheduledThreadPool:無限大小的線程池,支持定時偶垮、周期性任務
        * start()與run()
        * 繼承Thread類或重寫Runnable接口時在run中重寫線程中的操作张咳,對線程實例調(diào)用start,從而開辟新的線程并執(zhí)行run內(nèi)操作
        * 若直接調(diào)用run似舵,并不能開辟出新的線程脚猾,還是在原線程中執(zhí)行

  • synchronized同步塊、lock

    • 針對多條線程同時操作共享數(shù)據(jù)的安全問題砚哗,采用互斥鎖保證被鎖上的線程在運行時讓其他試圖訪問的線程處于等待狀態(tài)龙助,直到當前線程結束并釋放鎖。

    • synchronized保證同一時刻只有一個線程可以操作被其修飾的代碼塊或方法蛛芥,同時保證當前線程上數(shù)據(jù)的變化可以被其他線程看到提鸟。

    • synchronized鎖定代碼塊:該對象在synchronized塊內(nèi)的內(nèi)容在運行時不允許其他線程訪問,其所在線程結束后才能執(zhí)行另一個線程仅淑;若不同線程執(zhí)行該類的不同對象称勋,則鎖定失效

        class SynThread implements Runnable{
            public void run(){
                synchronized(this){....}
            }
        }   
      
    • synchronized鎖定對象:其他線程試圖訪問該對象時會被阻塞,直到對象所在的當前線程結束

        public void run(){
            synchronized(obj){...}
        }
      
    • synchronized鎖定實例方法

        public synchronized void run(){}
      
    • synchronized修飾的對象涯竟、方法不能被繼承或實現(xiàn)

    • 每個對象有一個鎖赡鲜,線程拿到鎖則可以對對象進行操作

  • 死鎖可以發(fā)生在不同線程、進程昆禽,甚至不同機器之間

    • 形成原因:
      • 競爭不能搶占到的資源 T1蝗蛙、T2分別占據(jù)a、b資源醉鳖,并等待對方釋放資源捡硅,形成了無限的等待從而造成死鎖
      • 競爭可消耗的資源 T1、T2分別需要先接收對方消息才能發(fā)送消息
      • 進程推進順序不當 T1盗棵、T2都需要a壮韭、b資源,正確順序應當是T1運行a纹因、b完成后再進行T2線程喷屋,但是若運行順序不當易造成第一種死鎖
    • 必要條件:
      • 資源只能被一個線程使用
      • 資源未被使用完,不能被搶占瞭恰,只能由當前獲取資源的線程自己釋放(主動釋放)
      • 線程占用了資源但是又提出了新的資源請求屯曹。而該資源已被其他線程占用,導致請求的線程被阻塞,同時不釋放自己已有的資源
      • 循環(huán)等待條件恶耽,存在一條占用資源與請求資源的循環(huán)鏈
    • 處理方法
      • 線程開始前一次性申請所有資源
      • 加鎖順序密任,使線程按照一定順序加鎖
      • 加上鎖時限,線程嘗試獲取鎖時偷俭,超過時限則放棄對該鎖的請求浪讳,并釋放自己占用的鎖
      • 死鎖檢測,針對不能實現(xiàn)按序加鎖或鎖時限的情況涌萤。記錄線程獲取鎖的情況以及請求記錄淹遵,每當存在請求失敗的情況時,則遍歷該記錄(鎖的關系圖)查看是否有死鎖發(fā)生负溪。若發(fā)現(xiàn)死鎖透揣,則釋放所有鎖,回退笙以,并在一段時間后重試淌实;或給各線程隨機設置優(yōu)先級,較低級的線程回退猖腕,其他較高的線程繼續(xù)保持鎖
  • 內(nèi)存泄漏拆祈、溢出、ANR倘感、

    • JVM內(nèi)存環(huán)境:
      • 堆heap:存放new創(chuàng)建的對象和數(shù)組(對象本身)放坏,由JVM垃圾回收器管理,被所有線程共享
      • 棧stack:后進先出老玛,只存放基本類型與對象的引用(不是對象)淤年。每個線程擁有一個棧,其中內(nèi)存單元為幀frame蜡豹,存放線程內(nèi)使用到的方法(參數(shù)麸粮、局部變量、返回地址等)
      • 方法區(qū)method:靜態(tài)區(qū)镜廉,存放所有class弄诲、static變量。被所有線程共享
    • 泄漏:程序向系統(tǒng)申請分配內(nèi)存娇唯,使用完畢后未釋放齐遵,(當程序不再需要這個對象時仍保留了這個對象的引用)一直占據(jù)該內(nèi)存單元直到程序結束,使得該內(nèi)存無法再被使用塔插。大量的泄漏會導致內(nèi)存溢出梗摇,如未注銷的receiver、eventbus等
      • 形成原因:
        • 棧:方法運行結束時想许,對應的frame會從棧中刪除伶授,空間被釋放断序,線程回到原方法繼續(xù)執(zhí)行,而所有棧都被清空則程序結束運行谎砾,很少導致泄漏逢倍。
        • :存放普通變量,不會隨著方法結束而清空景图。隨著對象的不停創(chuàng)建而耗盡空間以及長期持有,若一直不被GC回收(存在于引用鏈上)則造成泄漏碉哑。
      • 影響:
        • 浪費內(nèi)存
        • 內(nèi)存泄漏導致可用內(nèi)存越來越少挚币,最終導致oom
        • 隨著內(nèi)存減少,GC被頻繁觸發(fā)影響性能造成程序卡頓
      • 常見情況:
        • context:activity被強引用后扣典,隨著其生命周期短結束妆毕,本該被GC回收的activity對象因為該引用一直不被回收,存活在生命周期之外贮尖。因此最好采用application.context代替activity.context或及時清除對activity的引用
        • 內(nèi)部類:內(nèi)部類持有一個靜態(tài)(static)變量的引用笛粘,就需要在銷毀時將靜態(tài)變量置空
        • handler內(nèi)部類存在于activity中,activity結束后湿硝,handler對象中有message還在循環(huán)薪前,handler生命周期沒有結束,因此activity無法被回收
          • handler聲明為static靜態(tài)內(nèi)部類关斜,不再持有外部類的引用從而可以釋放activity
          • 內(nèi)部類引用外部對象時采用弱應用
      • 解決方法:在對象生命周期結束的時候解除綁定示括,將引用置為空或使用弱引用。
    • 溢出oom:程序向系統(tǒng)申請的內(nèi)存空間超過系統(tǒng)所能分配的
      • 導致原因:
        • 大量長期保存資源不釋放的內(nèi)存泄漏問題
        • 對象過大超出內(nèi)存限制痢畜,如bitmap垛膝、xml等
        • static變量過多
      • 加載圖片導致oom解決方法:
        • 只加載縮略圖
        • 讀取時適當壓縮
        • 使用軟引用對bitmap進行引用,及時recycle丁稀,并對經(jīng)常需要加載的圖片進行緩存避免反復加載
        • 及時銷毀不需要的bitmap對象
    • ANR(application not responding)
      • 導致原因:
        • 主線程太多耗時操作
        • CPU滿負荷吼拥,導致IO阻塞
      • 解決方法:
        • 開辟子線程進行耗時操作或IO操作
        • 排查內(nèi)存泄漏、增大VM內(nèi)存等
        • activity onCreate和onResume中盡量避免耗時操作
        • BroadCastReceiver onReceive盡量避免耗時操作线衫,交給IntentService處理
  • Java類加載機制

  • Java內(nèi)存模型

    • 可見性:線程間凿可,一個線程修改的狀態(tài)對另一個線程數(shù)可見的,可以使用volatile桶雀、synchronized矿酵、final修飾變量使其具有可見性,直接在內(nèi)存中被修改矗积,不允許其在線程內(nèi)緩存與重排序
    • 原子性:操作不可分割全肮,如a=0。非原子操作棘捣,如a++會存在線程安全問題辜腺。使用同步技術如synchronized、lock將其封為一個原子操作。
    • 有序性:持有同一對象鎖的兩個同步塊只能串形執(zhí)行评疗。通過volatile测砂、synchronized保證
  • Java同步機制:

    • JVM中臨界區(qū)內(nèi)資源可被共享,同一時間內(nèi)只能被一個線程訪問
    • 同步機制保證了每次一個線程需要訪問臨界區(qū)時首先檢查區(qū)內(nèi)是否正有線程訪問百匆,有則將線程掛起等待區(qū)內(nèi)線程執(zhí)行完
  • Volatile

    • 一種稍弱的同步機制砌些,將變量的更新操作通知到其它線程,保證線程間操作有序性的關鍵字加匈。聲明的變量被共享存璃,其他線程讀取時獲取其被操作后最新的值
    • 訪問volatile變量時不會進行加鎖操作,不會使執(zhí)行線程阻塞雕拼,比sychronized更加輕型
    • 非volatile對象被操作時纵东,由操作線程拷貝從內(nèi)存將其拷貝到cpu上,可能隨著處理線程的cpu不同而拷貝到不同cpu cache上啥寇,造成操作的不可見
    • volatile對象每次直接從內(nèi)存中讀取偎球,不經(jīng)過CPU cache,修改后立即同步到內(nèi)存辑甜,因此下一個進行操作的線程即對此操作可見
    • 讀取性能與普通變量幾乎相同衰絮,寫入稍慢
  • lock

  • final

  • 垃圾回收

  • Java反射:java程序對在運行時才知道名稱的類進行加載,獲取到它的完整定義與成員

    • 運行時判斷一個對象所屬類
    • 運行時構造任意類的對象
    • 運行時判斷一個類的成員變量和方法
    • 運行時調(diào)用對象的方法
    • 動態(tài)代理
    • java.lang.Class類栈戳,類被加載后岂傲,jvm產(chǎn)生一個Class對象,并通過這個class對象獲取到其對應的方法子檀、成員等信息
  • Java裝箱拆箱

    • 裝箱:基本數(shù)據(jù)類型轉為封裝類镊掖,如Integer a = 1(而不用Integer a = new Integer(1))、(Array<Integer>) list.add(3);
      • 調(diào)用Integer.valueOf(int)
    • 拆箱:封裝類轉換為基本數(shù)據(jù)類型褂痰,如int n = Integer i
      • 調(diào)用Integer.intValue
    • Integer在[-128亩进,127]內(nèi)數(shù)值相同則保存在同一對象中
    • Boolean值保存為類靜態(tài)常量中,值相同則對象相同
  • Java封裝缩歪、繼承归薛、多態(tài)

    • 封裝:面向對象特征之一,類封裝了數(shù)據(jù)及操作的邏輯實體匪蝙,私有不能被外界訪問主籍。為內(nèi)部數(shù)據(jù)提供不同級別的保護,防止無意改變對象私有部分
    • 繼承:某個類型對象獲取另一個類型對象屬性的方法逛球,使用現(xiàn)有類的所有功能千元,并且在不重新編寫原類的前提下進行擴展,實現(xiàn)從一般到特殊的過程颤绕。包括繼承和組合
    • 多態(tài):一個類對象的相同方法在不同情形下有不同的表現(xiàn)形式幸海,使不同內(nèi)部結構的對象共享相同的外部接口祟身,讓父對象根據(jù)賦值的子對象特性進行運作。必要條件:
      • 繼承
      • 重寫
      • 父類引用指向子類對象
  • Java內(nèi)部類

    • 特點:
      • 提供了更好的封裝物独,只有外部類可以訪問內(nèi)部類
      • 內(nèi)部類可以獨立于外部類實現(xiàn)接口
      • 外部類不能直接訪問非靜態(tài)內(nèi)部類袜硫,非靜態(tài)內(nèi)部類可以訪問外部類屬性與方法:非靜態(tài)內(nèi)部類依賴于外部類對象,因此保存有外部類對象的引用挡篓,從而可以訪問外部類的成員婉陷。外部類需要訪問非靜態(tài)內(nèi)部類必須顯示創(chuàng)建內(nèi)部類對象
      • 非靜態(tài)內(nèi)部類中不能定義靜態(tài)方法變量等
    • 編譯時內(nèi)部類編譯成一個單獨的class文件
    • 成員內(nèi)部類
    • 靜態(tài)內(nèi)部類:用static修飾內(nèi)部類,則這個內(nèi)部類屬于外部類類本身
    • 局部內(nèi)部類
    • 匿名內(nèi)部類:只使用一次的內(nèi)部類官研,如setOnClickListener(new OnClickListener(){onClick(){}})
  • for,foreach

    • for: for(int i=0 ; i<length ; I++)
    • foreach: for(Integer i : integers)對集合采用了迭代器效率更高憨攒,對數(shù)組采用for循環(huán)
    • 遍歷過程中若有其它線程對對象進行修改,for會導致不可知的錯誤阀参,而foreach可以拋出錯誤信息
  • 范性、類擦除機制

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞻坝,一起剝皮案震驚了整個濱河市蛛壳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌所刀,老刑警劉巖衙荐,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浮创,居然都是意外死亡忧吟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門斩披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溜族,“玉大人,你說我怎么就攤上這事垦沉』褪悖” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵厕倍,是天一觀的道長寡壮。 經(jīng)常有香客問我,道長讹弯,這世上最難降的妖魔是什么况既? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮组民,結果婚禮上棒仍,老公的妹妹穿的比我還像新娘。我一直安慰自己邪乍,他們只是感情好降狠,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布对竣。 她就那樣靜靜地躺著,像睡著了一般榜配。 火紅的嫁衣襯著肌膚如雪否纬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天蛋褥,我揣著相機與錄音临燃,去河邊找鬼。 笑死烙心,一個胖子當著我的面吹牛膜廊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淫茵,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼爪瓜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匙瘪?” 一聲冷哼從身側響起铆铆,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丹喻,沒想到半個月后薄货,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡碍论,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年谅猾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳍悠。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡税娜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贼涩,到底是詐尸還是另有隱情巧涧,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布遥倦,位于F島的核電站谤绳,受9級特大地震影響,放射性物質發(fā)生泄漏袒哥。R本人自食惡果不足惜缩筛,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堡称。 院中可真熱鬧瞎抛,春花似錦、人聲如沸却紧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至断凶,卻和暖如春盅藻,著一層夾襖步出監(jiān)牢的瞬間么鹤,已是汗流浹背筑辨。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工纯蛾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人却嗡。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓舶沛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窗价。 傳聞我的和親對象是個殘疾皇子如庭,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Java8張圖 11、字符串不變性 12撼港、equals()方法柱彻、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,709評論 0 11
  • 從三月份找實習到現(xiàn)在餐胀,面了一些公司,掛了不少瘤载,但最終還是拿到小米否灾、百度、阿里鸣奔、京東墨技、新浪、CVTE挎狸、樂視家的研發(fā)崗...
    時芥藍閱讀 42,274評論 11 349
  • 一:java概述: 1扣汪,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境锨匆,java的開發(fā)...
    慕容小偉閱讀 1,796評論 0 10
  • 冬天是思念的季節(jié)崭别。 我喜歡冬天,盡管她寒冷恐锣,干燥茅主,陰沉,時有雨雪土榴,間或有狂風诀姚,一旦出門在外,總是畏首畏尾玷禽,縮頭縮腦...
    小芒果暮歌閱讀 294評論 1 0
  • 豆同學住院已經(jīng)10天了赫段,隨著他的腹痛完全消失呀打,人變得有精神了;同時也越來越有胃口吃飯菜糯笙,只是吃的飯菜還需要避免油膩...
    鄭海玲Irene閱讀 440評論 1 2