JAVA流程控制
一定要讀取到有效字元後才可以結束輸入。
對輸入有效字元之前遇到的空白,next()方法會自動将其去掉
隻有輸入有效字後才将其後面輸入的空白作為分隔符或者結束符。
next() 不能得到帶有空格的字元串
以Enter為結束符,也就是說NextLine()方法傳回的時輸入回車之前的所有字元。
可以獲得空白。
隻要布爾表達式為true,循環就會一直執行下去
do while 循環和while類似 不同的是do while循環至少會執行一次
do while 循環是先循環在判斷
九九乘法表
break: 在任何循環語句的主體部分,均可用break控制循環的流程。用于強行退出循環,不執行循環中剩餘語句。
continue:用于在循環語句體中。用于終止某次循環過程,跳過循環體中尚未執行的語句,接着進行下一次是否執行循環的判定
goto: 标簽
<code>outer:for (int i=101;i<150;i++){ for (int j=2;j<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 > protected > 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 >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<String> set = new HashSet<>(); //不安全 Set<String> set = Collections.synchronizedSet(new HashSet<>()); //安全
map 是這樣用的嗎? 不是,工作中不用 HashMap 預設等價于什麼? new HashMap<>(16,0.75); Map<String, String> map = new HashMap<>(); 擴充:研究ConcurrentHashMap的原理