java list有序还是无序_最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的...
歡迎關注專欄《Java架構筑基》——專注于Java技術的研究與分享!
Java架構筑基?zhuanlan.zhihu.com- Java架構筑基——專注于Java技術的研究與分享!
- 后續文章將首發此專欄!
- 歡迎各位Java工程師朋友投稿和關注
- # 鏈接 Java程序員福利"常用資料分享"
一、代碼塊加載順序
二、類加載器雙親委派
1. 類的加載過程
①. 類的加載
class文件加入內存,生成class對象
②. 類的鏈接
- 驗證:驗證class文件是否滿足JVM規范
- 準備:靜態類變量默認初始化
- 解析:常雖池的符號引用替換為直接引用
③. 類的初始化
類構造器(構造方法和靜態代碼塊)初始化
2. 類的加載器
- bootStrapClassLoader:核心加載器
- ExtersionClassLoader:擴展加載器
- SystemClassLoader:系統加載器
- ApplicationClassLoader:應用加載器
- 自定義加載器
3. 雙親委派
- 保證加載的關是唯一的.只會有份所以向上由父類加載
- 與Tomcat不滿足雙親委派
三、String
1. Stringa= "adf"
- adf存在于方法區的常量池,棧空間的a直接指向常量池的adf
2. String b = new String(" adf")
- adf存在于常量池,堆空間生成對象,對象實際存儲指向常量池adf的地址,棧空間的b指向堆空間的地址
3. Stringc= "adf" + "df";Stringd = "adfdf";Stringe= a +"df"
- c和d棧都指向常量池的adfdf. e保存了堆中對象,對象指向的是常量池中的adfdf值
- 直接常量操作,返回的地址是在常量池
- 經過new或者不是純常量操作,會進行一-次new在堆中生成對象, 對象在指向常量池中數據
- final修飾的String也在常量池
4. final修飾,不可以被繼承(不可以被修改)
- 出于安全考慮,java很多類都用字符串來描述
- 處于內存考慮,字符串被常用,共享同一塊內存,減少內存使用量
5. 一般字符串的內部操作
- 轉成數組,toCharArray0
- 數組操作變化值
- String構造函數數組轉為字符串
6. length0方法
- 返回字符串的實際長度,字符串沒有size0方法
四、Integer
1. 直接賦值或者ValueOf田
- 享元模式,池的技術
- -128~127是常量,在堆中只會有一個對象
2. new的話,是在堆中生成新對象
3. BigInteger是整形,任意大小
4. BigDecimal是浮點型,任意精度
五、注解
1. 元注解
- 修飾注解
- @Retention:注解的生命周期,Compile編譯, class類對象, RunTimer運行時(此生命周期才可以用被反射拿到)
- @Target:接口,類,方法,變量,構造器
- @Inherited:注解具有繼承性,隨著類繼承存在
2. 可重復注解, 類型注解
- Java8新特性
六、集合
1. 存儲單值
①. 數組
- []初始化后長度不可以更改
- 插入刪除效率不高
- 查找速度快
- 只有length成員變量表示長度,沒有其他的可用API
②. collection
A. set
a. 實現
treeset
- 底層是treemap.數據是紅黑樹結構
- 可以按屬性進行排序,指定排序規則
- 需要重寫比較函數,被存數據繼承comparable接口(數據是否相同按compareto決定)
linkedhashSet
- 按添加的順序有序
- 底層也是linkedhashmap,數據+鏈表
- 在原有的hashset的基礎上增加了添加元素的鏈接關系,使添加數據有序(對頻繁的遍歷要比hashset快)
hashSet
- 存儲無序的
- 底層是hashmap,也是數組+鏈表存的
b. 無序不可重復
c. linkedhashset和hashset的數據,一定要重寫,并且要求hashcode方法和equals方法一致
- hashcode決定了key存儲位置
- equals決定了key是否相等
B. list
a. 實現
arrayList線程不安全
- 數組
- 適用增刪改少,遍歷多
vector線程安全
- 數組:stack繼承于vector
linkedList
- 鏈表
- 使用增刪改多,遍歷少
b. 有序,可重復
2. 存儲對值(map)
①. hashMap線程不安全
- 底層樹數組+鏈表
- java8后,數組+鏈表/紅黑樹,鏈表長度大于8的時候轉紅黑樹
- 復合的數據需要重寫hashcode和equals方法
- 多線程下死循環
- 主要是rehash函數
- 內部鏈表重寫計算的時候,多線程下會出現環
- 鏈表的環造成get數據的時候會出現死循環
②. linkedHashMap線程不安全
- 底層是數組+鏈表/紅黑樹
- 根據添加數據的順序,有指針關聯添加的數據,數據按添加順序有序
- 復合的數據需要重寫hashcode和equals方法
③. concurrentHashMap分段鎖線程安全
- 復合的數據需要重寫hashcode和equals方法
- java1.7是數據的分段鎖
- java1.8是CAS實現的
④. hashTable線程安全
- 方法用Synchronize修飾的
- 不能有null的key和值
- 復合的數據需要重寫hashcode和equals方法
- 子類: Properties 取配置文件的數據
⑤. treeMap有序的
- 底層是紅黑樹結構
- 存儲的數據需要實現Comparable接口
⑥. key是無序的,不可以重復,使用set存儲所有的key; Entry是無序, 可重復
⑦. 擴容
- 容量的0.75的時候,會擴容,擴為原來的兩倍,將數據拷貝到新的空間
- Jdk7. Jdk8默認初始數組大小是16
- Jdk8當鏈表長度超過8,就改用紅黑樹存儲
- Jdk8底層是Node[]數組,Jdk是Entry[數組
- 最大容量2的30次方
3. collections
集合相關的靜態方法集
4. 排序
- 自然排序:實現comparable重寫compareTo(Object o)方法(隨處可用的比較)
- 定制排序:實現comparator重寫compare(Object o1,Object o2)方法(臨時性的比較)
5. sizeQ方法
返回的是元素的個數,集合是沒有length方法的
6. 數組和集合的相互轉換
- toArray0集合變數組
- Arrays.asList ()數組變集合(注意,存的數據要是對象)
7. 集合遍歷方式
- for循環
- iteraton迭代器
- foreach方式
- java8新特性,streem流
8. 通配符?
List<?>
- 可以寫入null,不能寫入數據
- 可以讀數據
- List<? super A>; List<? extends A>有限制條件的通配符
七、反射
1. 動態語言的特性,拿到運行時對象的狀態類信息,class對象, 增加了代碼的靈活性
2. 缺點:執行效率低,性能差
3. 功能
①. 拿到運行時對象的類信息
②. 根據運行時對象信息創建對象
③. 根據運行時對象信息使用其方法
④. 根據運行時對象信息修改成員,修改私有成員
⑤. 動態代理
- 創建一個實現接DInvocationHandler的類,它必須實現invoke方法
- 創建需要被代理接口和實現類
- 通過Pry)的I態nnewporvatalasloaderlader Cass iterfaces. InocationHander h)創建個代理
- 通過代理調用方法
- 生成的動態代理關會調用nvocationHandler實現類中的invoke方法
- invoke方法中我們可以選擇執行被代理實現類的方法,并在其前后進行處理
4. 拿到class對象
- 類名.class
- 對象.getClass0
- Class類的靜態方法forName0
- ClassLoader對象的IoadClass0方法獲取
5. class對象的作用
- Constructor拿到類的構造函數,實例化對象
- Field拿到類的屬性
- Method拿到類的方法(Invoke調用方法)
6. 提升反射使用的效率
- 盡量不要getMethods0后再遍歷篩選,而直接用getMethod(methodName)來根據方法名獲取方法
- forName獲取類對象,使用緩存
八、lambda表達式
1. 實質:作為接口的實例
2. 接口需要是函數式接口
- 接口中只有一個抽象函數
- 可以用注解聲明接口,@FunctionInterface
- util.function包下有大量的函數式接門
九、= =和equals
1. = =
- 基本數據類型比較值
- 引用類型比較地址
2. equals
- 比較的是引用類型
- 重寫過的quls比較的是地址obiec的原生方法批比較的是地址
# 鏈接 Java程序員福利"常用資料分享"
總結
以上是生活随笔為你收集整理的java list有序还是无序_最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在主板上常见的I/O接口有哪些?分别有什
- 下一篇: 距离矢量路由算法的java代码_八大排序