天天看點

JAVA基礎

JAVA流程控制

一定要讀取到有效字元後才可以結束輸入。

對輸入有效字元之前遇到的空白,next()方法會自動将其去掉

隻有輸入有效字後才将其後面輸入的空白作為分隔符或者結束符。

next() 不能得到帶有空格的字元串

以Enter為結束符,也就是說NextLine()方法傳回的時輸入回車之前的所有字元。

可以獲得空白。

隻要布爾表達式為true,循環就會一直執行下去

do while 循環和while類似 不同的是do while循環至少會執行一次

do while 循環是先循環在判斷

九九乘法表

break: 在任何循環語句的主體部分,均可用break控制循環的流程。用于強行退出循環,不執行循環中剩餘語句。

continue:用于在循環語句體中。用于終止某次循環過程,跳過循環體中尚未執行的語句,接着進行下一次是否執行循環的判定

goto: 标簽

<code>outer:for (int i=101;i&lt;150;i++){ for (int j=2;j&lt;i/2;j++){ if (i%j == 0) continue outer; } System.out.println(i+""); }</code>

方法

return : 結束方法傳回一個結果 break :跳出

數組

優化過

面向對象

加上靜态變量可以直接用類名調用 沒加靜态 必須 new 靜态方法和類一起加載 非靜态方法必須調用
每個類預設繼承Object的類隻是隐藏了 子類繼承父類的所有方法,父類的private子類不可以調用
super可以強制調用父類的方法 重名可以

注意點:

super調用父類的構造方法,必須再構造方法的第一個

suiper必須再子類的方法或者構造方法中

super 和 this 不能同時調用

代表的對象不同

this :本身調用者這個對象

super:代表父類對象的應用

前提

this:沒有繼承也可以使用

super: 隻有繼承才可以使用

構造方法

this : 本類的構造

super:父類的構造

加上靜态可以直接用類名調用 B.test();
父類的靜态方法不能被重寫 b是A new 出來的對象,是以調用了A方法沒有static時,b調用的時對象的方法,而b時用A類new的 因為靜态方法時類的方法 ,而非靜态是對象的方法 有static時 b調用了B的類的方法 因為b是b類定義的 子類方法和父類的方法必須一緻 方法體不同

修飾符

可以擴大但是不能縮小 public &gt; protected &gt; private
子類調用的方法都是自己的 或者繼承父類的 父類可以指向子類 但是不能調用子類獨有的方法
instanceof判斷類型是否相似 父類引用指向子類對象 把子類轉成父類,向上轉型 把父類轉換子類,向下轉型 : 強制轉換
繼承抽象類必須實作抽象類裡面的所有方法 繼承隻能單繼承 接口 可以多繼承 抽象類不能new出來隻能靠子類去實作他

方法2

作用 限制 定義一些方法讓不同的方法讓不同的人實作 接口不能執行個體化接口沒有構造方法 implements可以實作多個接口
java中所有類都要繼承Object Object是一個類,也是所有類的根 我們寫的類即使不寫繼承關系,那麼也會繼承Object

判斷左右兩端的資料是否一緻

字元串的判斷一定要用equals

== 判斷記憶體位址

預設的toString是Object的方法 (包名+類名+@記憶體位址)

直接調用bean檔案的toString方法 目錄會以預設的位址 是以要在子類裡重寫toString方法

可以判斷兩個對象是不是一個類型的

堆 主要放對象

棧 局部變量,以及基本資料類型的變量

代碼區:類和方法

資料區:常量池和靜态變量

異常

要捕多個異常要從小到大

快捷鍵生成異常 選中代碼 Ctrl + Alt + T

最大得到異常要寫在最後面

常用關鍵字:

try //嘗試着去處理可能會出現異常的東西 catch //捕獲異常 finally //無論有沒有異常都會去運作 throw //抛出異常 throws //方法抛出異常

Math數學類

時間

字元串

charAt(0) //拿到第0個字元 concat("a"); //字元串後後面加a 拼接字元串 contains("a"); //字元串中是否包含a startsWith("guan"); //字元串是否以guan 開始 endsWith("xin"); //字元串是否以xin結尾 equalsIgnoreCase //忽略大小寫是否一緻 equals //判斷兩個字元串是否一緻 indexOf("c") //判斷字元串所在的位置 length() //字元串的長度 replace //替換 split //切割 substring(2,4) //截取

StringBuffer和StringBuilder用法都是一樣的

StringBuilder &gt;StringBuffer // StringBuilder 速度更快

append //末尾添加字元串 insert //在第幾位後加入的字元串 String s = stringBuilder.toString(); //轉成字元串

容器List,Map,Set.

List 線性結構

Set集合,非線性去除重複

Map 映射 存儲的時候以key:value的形式存儲資料

用法一樣 底層記憶體層面上有差別正常用感覺不到 ArrayList //查詢效率比較高 LinkedList //删除和增加元素效率高

常用操作

add //添加 remove //删除 size //長度 get() //擷取某個元素 contains //裡面是否有這個資料

不能有重複資料

不是按照存儲的資料進行存放的

HashSet //無序的 TreeSet //預設進行排序 升序

操作

add(); //添加元素 remove(); //删除元素 remove(“wode”); //直接寫删除的内容

如果出現重複的key之前的會被頂掉

HashMap //不排序 TreeMap //根據key來排序的隻能排int類型 map.put(11,"wang"); map.put(12,"wen");
put(key,value) //存資料 remove(key) //删資料 size() //長度 keySet //列印所有key get //通過key 查詢value值
next //下一個 hasNext //是否還有下一個

Flie類

多線程

線程開啟不一定立即執行,由cpu排程 子類繼承Thread 重寫run()方法 寫入線程體 去主線程調建立線程對象,調用start()方法啟動線程 啟動:子類對象.start();
實作接口Runnable具有多線程能力 啟動線程:傳入目标對象+Thread對象.start();
callable和Runnable的差別是callable可以有傳回值
線程隻能啟動一次 NEW //尚未啟動的線程處于此狀态 RUNNABLE //執行的線程 BLOCKED //阻塞等待螢幕鎖定的線程處于此狀态 WAITING //正在等待另一個線程執行特定動作的線程處于此狀态 TIMED WAITING //正在等待另一個線程執行動作達到的線程處于此狀态 TERMINATED //已退出的線程
線程優先級數字越大越高 setPriority 主線程預設 5
程序:一個程式可以包含多個線程,隻要包含一個 線程就是一個單獨的資源類,沒有任何附屬操作 1.屬性2.方法

java預設有2個線程,1、main線程 2、GC線程主要做垃圾回收

線程的狀态

Lock 接口
synchronized 和 Lock差別

synchronized 内置java關鍵字,Lock是一個java類

synchronized 無法判斷擷取鎖的狀态,Lock 可以判斷是否擷取到了鎖

synchronized 會自動釋放鎖, Lock必須要手動釋放鎖,如果不釋放鎖,會被死鎖

synchronized 當線程1阻塞了,線程2會進行等待

Lock 當線程1阻塞了,線程2不一定等待

synchronized 可重入鎖,不可以中斷 非公平 ;Lock 可重入鎖 不可以中斷 可以判斷鎖 非公平(可以自己設定)

synchronized 适合鎖少量的代碼同步問題,Lock 适合鎖大量的同步代碼

Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }

ReentrantLock //可重入鎖 (常用) ReentrantReadWriteLock.ReadLock //讀鎖 ReentrantReadWriteLock.WriteLock //寫鎖

初始方法

Lock鎖

condition.await(); condition.signalAll();

精準執行

按照順序依次執行

8鎖,就是關于鎖的8個問題 1、标準情況下,兩個線程先列印 發短信還是 先列印 打電話? 1/發短信 2/打電話 1、sendSms延遲4秒,兩個線程先列印 發短信還是 打電話? 1/發短信 2/打電話

synchronized 鎖的對象是方法的調用者

普通方法沒有鎖!不是同步方法,就不受鎖的影響,正常執行

增加了一個普通方法後!先執行發短信還是Hello?// 普通方法 兩個對象,兩個同步方法, 發短信還是 打電話? // 打電話

static靜态的同步方法,鎖的是Class

增加兩個靜态的同步方法,隻有一個對象,先列印 發短信?打電話? 兩個對象!增加兩個靜态的同步方法, 先列印 發短信?打電話?
1個靜态的同步方法,1個普通的同步方法 ,一個對象,先列印 發短信?打電話? 1個靜态的同步方法,1個普通的同步方法 ,兩個對象,先列印 發短信?打電話?
Callable接口類似于Runnable 不同于: 可以有傳回值 可以抛出異常 方法不同 run(),call();
CountDownLatch //加法計數 CyclicBarrier //減法計數 Semaphore //信号量
countDownLatch.countDown(); // 數量-1 countDownLatch.await(); // 等待計數器歸零,然後再向下執行 每次有線程調用 countDown() 數量-1,假設計數器變為0,countDownLatch.await() 就會被喚醒,繼續執行!
semaphore.acquire(); //獲得,假設如果已經滿了,等待,等待被釋放為止! semaphore.release(); //釋放,會将目前的信号量釋放 + 1,然後喚醒等待的線程!

https://www.kuangstudy.com/bbs/1374937897278402561

https://www.kuangstudy.com/bbs/1374936485165297666

集合不安全

HashSet 的底層就是一個HashMap Set&lt;String&gt; set = new HashSet&lt;&gt;(); //不安全 Set&lt;String&gt; set = Collections.synchronizedSet(new HashSet&lt;&gt;()); //安全
map 是這樣用的嗎? 不是,工作中不用 HashMap 預設等價于什麼? new HashMap&lt;&gt;(16,0.75); Map&lt;String, String&gt; map = new HashMap&lt;&gt;(); 擴充:研究ConcurrentHashMap的原理