牛客网刷题(纯java题型 31~60题)
三同:方法名相同,參數列表相同,返回值相同或者子類的返回值是父類的子類(這一點是經過驗證的)
一大: 子類的訪問修飾符比父類開放
一小: 子類拋出的異常比父類的小(具體,或者說子類拋出的異常是父類拋出的異常的子類
通過intellij測試的結果:
在子類中,如果一個方法滿足與父類的方法的方法簽名(方法名稱+參數列表)相同,則一定屬于override,那么子類中次方法的返回值就必須滿足是父類的子類,且子類方法的修飾符必須比父類更開放
子類中,如果一個方法與父類的方法簽名不同(方法名稱+參數列表),那么這個方法就是一個子類的新方法,不屬于override,也不屬于overload,與父類的同名方法沒有任何關系
容器的左上角是坐標的起點 圖中的算法是二分查找,二分查找的時間復雜度計算:
第一次折半, n/2
第二次折半,n/(2^2)
第k次折半,n/(2^k)
因為k次折半之后,一定會出現只剩下一個數字的情況,也就是找到了要找的元素
那么也就有 n/(2^k) ==1
所以,k == log2(n),即二分查找的時間復雜度為log2(n) 抽象類實現接口,可以不實現接口中的任意方法或者所有方法
普通類實現接口,必須實現接口中的所有方法,接口中的字段field,普通類可以直接使用
普通類繼承了抽象類,子必須實現抽象類中的所有抽象方法,對于抽象類中的非抽象方法,可以Override,也可以不Override
整數類型,默認為int,小數類型,默認為double,而不是float
例如, float result = (float)1.0; //否則報錯
多種不同類型的數字進行運算,結果會是以最高精度的為準(自動向上轉型),題中1/2.0 為int/double,所以結果應該為double類型的0.5; 即
double result = 1/2.0;
或者 float result =(float)(1/2.0); 依賴注入是通過反射實現的,是一種設計思想,與具體的框架無關,別的框架,也可以實現依賴注入
常見的依賴注入方式包括Setter方法和構造方法 Mock,也叫做偽對象,在測試中利用mock來代替真實的對象,方便測試的進行
封裝:將對象的狀態信息隱藏在對象內部,不允許外部直接訪問
反射機制:在運行狀態下,可以調用類的所有屬性和方法,包括private屬性和方法,所以破壞了封裝性
String類的equals方法,只有instanceof之后,發現equal(object)中的object為String類型的對象,才會轉換成String,然后比較char[] 執行過程:
boolean b = true?false:true==true?false:true;
-->
true?false:(true==true)?false:true;
true?false:true?false:true;
true?false:(true?false:true);
true?false:false;
false;
賦值語句= 的優先級最低
==的優先級高于三目運算符
為了將左邊的三目運算符算完,必須要現將后面的三目運算符算完,所以需要從右向左計算
Spring是一系列輕量級java EE框架的集合,正確
Spring提供了AOP方式的日志系統,不正確
Spring提供了AOP,但是沒有提供日志系統,需要使用log4j等開源框架來利用AOP屬性,實現日志系統
Arrays.copyOf 調用了System.arraycopy方法,所以System.arraycopy > Arrays.copyOf
System.arraycopy是native方法
clone 方法也是native方法
從評論區的反饋來看: 效率: System.arraycopy > clone > Arrays.copyOf 創建泛型的時候,盡可能早的指出泛型的類型,爭取讓編譯器檢查出錯誤,而不是在jvm運行的時候拋出類不匹配的異常
jvm理解泛型的方法:
1,虛擬機中沒有泛型,只有普通類和普通方法,所有的泛型類,泛型方法的,在編譯階段就已經被處理成了普通類和普通方法(通過類型擦除進行處理),也就是講泛型擦除成了Object或者邊界類型(extend等)
2,即使是泛型,也可以在運行時,動態的(利用反射機制)動態的獲取到泛型的實際類型 public Type getGenericSuperclass() java集合框架圖: Collection是一個接口
List和Set 接口繼承了Collection接口,但是Map接口沒有繼承Collection接口
List包括ArrayList和Vector,Stack繼承了Vector
Set包括Treeset,HashSet,LinkedHashSet,linkedHashSet繼承了HashSet
Map包括TreeMap,HashMap,LinkedHashMap(繼承了HashMap),WeakHashMap,IdentityHashMap, 其中,WeakHashMap和IdentityHashMap沒有繼承Hashmap,只是繼承了AbstractMap,實現了Map接口,與HashMap一樣(這一點與)
1,父類的靜態代碼塊,靜態屬性,但不包括靜態方法
即:static{} + static T typeName;
2,子類的靜態代碼塊,靜態屬性,但是不包括靜態方法
3,父類的非靜態代碼塊
4,父類的構造方法(構造方法晚于非靜態代碼塊)
5,子類的非靜態代碼塊
6,子類的構造方法(構造方法晚于非靜態代碼塊)
代入到本題中,就是:
先執行Sub方法,然后執行Sub的基類Base的靜態方法(沒有),然后執行Sub的靜態方法(沒有),然后執行父類的非靜態代碼塊(沒有),然后執行父類的構造函數(里面有一個callName方法,因為sub中override了callName方法,所以父類的構造函數里面的callName方法,執行的是Sub類中的override的callName方法),然偶引用sub中callName中的baseName屬性,但是此時還沒有執行到Sub類中的private String basename="basename" ,所以此時baseName還保持在null的狀態,會打印出null的值
synchronize既可以保證原子性,又可以保證修改可見性,而volatile只能保證修改可見性
volatile的本質是告訴jvm,寄存器中的值是不可信的,直接去內存中取值 ,synchronized是鎖定當前變量,同一時間只能有一個線程訪問變量
volatile不會阻塞線程,而synchronized會阻塞線程
volatile標記的變量不會被編譯器優化,而synchronized標記的變量會被線程優化
反射的主要作用:
運行時判斷一個類所屬的對象:isInstance();
運行時得到一個對象所屬的類: getClass();
運行時構造一個類的對象: Class.forName("ClassName").newInstance();
運行時獲取一個類的任意成員變量和方法,getFields,getMethods等
運行時調用任意類的任意方法
生成動態代理(需要特殊記) 集合中各種類的同步性:
List中,常見的LinkedList,ArrayList,都不是同步的
List中,不常見的Vector,以及繼承與Vector的Stack,都是同步的
Set中,常見的HashSet,以及集成與HashSet的linkedHashset,都不是同步的
Set中,不常見的TreeSet,也是不同步的
Map中,常見的HashMap,linkedhashmap,都是不同步的
Map中,不常見的TreeMap,WeakHashMap,IdentityHashMap是不同步的
總結,常見的linkedlist,arraylist,hashset,linkedhashset,hashmap,linkedhashmap都是不同步的
常見的set,map都沒有同步的,只有list中vector是同步的
只有vector和繼承與vector的stack是同步的
StringBuffer是同步的,而StringBuilder是不同步的
HashMap不同步,但是Hashtable同步 (hashtable繼承了Dictionary,實現了Map接口,屬于map)
Properties繼承與Hashtable,Properties也是同步的
轉載于:https://juejin.im/post/5b42b524f265da0faf71ab97
總結
以上是生活随笔為你收集整理的牛客网刷题(纯java题型 31~60题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 流动python - 字符串KMP匹配
- 下一篇: PopWindow弹出在任意位置。