牛客網刷題(純java題型 1~30題)
應該是先extend,然后implement
class test extends A implements B { public static void main(String[] args) { } } 復制代碼
java中四類八種基本數據類型
整數類型:byte,short,int,long
浮點類型: float,double
邏輯型: boolean
字符類型: char
瀏覽器根據html中指定的編碼格式對參數進行編碼,Tomcat根據指定的格式對參數進行解碼 ,所以getParameter得到的參數的編碼是由客戶端和web容器配置共同決定的
重載,指的是@overload重寫,指的是@override
重寫override是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!
重載overload,是用在同一函數體中,方法名稱不變,方法簽名改變
構造函數是不可以使用final修飾的,所以我覺得構造函數不可以是內聯函數 (不知道這么說是否正確)
所謂的內聯函數,就是函數在被調用的地方直接展開,編譯器在調用的時候不用像一般函數那樣,參數壓棧,返回時參數出棧以及資源釋放等,這樣提高了程序執行速度,對應java語言中也有一個關鍵字final來知名那個函數式內聯的.內聯部已訂好,當被指定為內聯的方法體很大的時候,展開的開銷可能就已經超過了普通函數調用的時間,引入內聯反而降低了性能,因此在選擇這個關鍵字的時候需要慎重,不過,在以后高版本的JVM中,在處理內斂的時候做出了優化,他會根據方法的規模來決定是否展開調用 構造函數可以是內聯函數 構造函數可以設置默認的參數 構造函數在定義類對象的時候自動執行
FileInputStream,從文件中以字節流讀取FileReader,從文件中以字符流讀取
FileWriter,向文件中,寫入字符
接口中的變量,默認是public static final接口中的方法,默認是public abstract
Collection類型的集合只能裝入Object類型的數據,題中傳入的是0,但是會自動裝箱為IntegerJVM形成對象后會放入堆中,listlist1和listlist2都指向堆中的同一個對象
instanceof是用來判斷對象的類型,也就是對象屬於哪個類的實例,因為指向的是同一個對象,所以都為Integer對象,也就是都為true
Super super = new Sub(); // 向上轉型不需要向值類型轉換Sub sub = (Sub)new Super(); // 向下轉型必須要強制類型轉換
這道題考察的是多態,對於多態,可以總結為:
1,父類引用指向子類對象
2,父類引用只能調用父類的field和method,不能調用子類的field和method,會報錯
3,上面說只能調用父類中的field和method,如果子類中的method覆蓋了父類中的method,那么使用父類的引用,調用的將是子類中重寫的method,而不是父類中的method; 如果子類field與父類field重名,使用父類的引用,調用field的話,調用的是父類中的field的值
3,子類"覆蓋"父類的變量不會報錯
getDeclaredMethods():
Returns an array containing {@code Method} objects reflecting all the declared methods of the class or interface represented by this {@code Class} object, including public, protected, default (package) access, and private methods, but excluding inherited methods. 翻譯:返回類的所有聲明的方法,包括這個類/接口中的方法(public,private,protected,default),但是不包括這個類所繼承的超類中的方法 getMethods():
Returns an array containing {@code Method} objects reflecting all the public methods of the class or interface represented by this {@code Class} object, including those declared by the class or interface and those inherited from superclasses and superinterfaces.
翻譯:返回這個類/接口中的所有public方法,包括這個類/接口的超類/父接口中的public方法
同理: getDeclaredMethods() 和 getFields()
補充知識: public class ArrayListextends AbstractList
implements List,
RandomAccess, 說明ArrayList支持隨機訪問
Cloneable, 說明ArrayList支持克隆
java.io.Serializable 說明ArrayList支持序列化
ArrayList的動態擴容機制:
ArrayList擴容機制總結:
如果是通過無參構造器ArrayList()構造,那么初始大小為0,然后,隨着add元素,不斷的擴容,新容量 = 舊容量的 * 1.5
例如: 先是size=0 的Arraylist,然后add,擴容為DEFAULT_SIZE = 10 ,然后添加第11個元素的時候,是擴容為15個,添加到16個元素的時候,擴容到22個
如果是通過ArrayList(initialSize),則會直接指定數組的大小,不需要擴容
ConcurrentHashMap使用segment來分段和管理鎖 static class Segment extends ReentrantLock impliments Serializable{
}
public class ReentrantLock implements Lock,Serializable
interface Lock
public class HashMapextends AbstractMap
implements Map,Cloneable,Serializable
public static List asList( T ... a) {
return new ArrayList(a);
}
private static class ArrayList{
//這個ArrayList為Arrays的內部類
}
SimpleDateFormat 是線程不安全的
使用JDBC的完整流程:加載JDBC驅動程序
提供鏈接URL
創建數據庫連接
創建一個Statement
執行SQL語句 處理
關閉JDBC連接
經過驗證,以Stream結尾的都是字節流byte,以Reader,Writer結尾的都是字符流需要注意的:
InputStreamReader:
An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified {@link java.nio.charset.Charset charset}. The charset that it uses may be specified by name or may be given explicitly, or the platform's default charset may be accepted.
InputStreamReader 是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平台默認的字符集。
OutputStreamReader:
An OutputStreamWriter is a bridge from character streams to byte streams:Characters written to it are encoded into bytes using a specified {@link java.nio.charset.Charset charset}. OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平台默認的字符集。
考察Statement與PreparedStatement的使用與區別:interface Statement extends Wrapper,AutoCloseable
interface PreparedStatement extends Statement
Statement是一個接口,用於為一條SQL語句生成執行計划,如果需要執行10條SQL語句,則需要生成十次執行計划
PreparedStatement繼承自Statement,具有Statement的全部功能,主要用來解決使用Statement多次執行同一SQL語句的效率問題,PreparedStatement使用的是數據庫支持預編譯的功能,預先將SQL語句進行編譯,多次執行同一條SQL語句的時候,只需要將編譯好的SQL語句直接執行就可以,提高了效率,同時可以防止SQL注入,提高了安全性
構造PreparedStatement的時候需要傳入SQL語句,進行預編譯,excute的時候,excute里面不傳入SQL
構造Statement的時候不需要傳入SQL語句,excute的時候需要傳入SQL語句
Object 類中wait(),notify(),notifyAll()方法的區別:1)wait() notify(), notifyAll() public final native void wait() throws InterruptedException ;
public final native void notify();
public final native void notifyAll();
都是native方法,都為final方法, 無法被override
2) 調用某個對象的wait()方法,能夠讓當前線程阻塞,前提是當前線程必須擁有此對象作為鎖,而且obj.wait()方法必須位於synchronized(obj)中 3) 調用某個對象的notify()能夠喚醒一個正在等待這個對象的線程,如果有多個縣城都在等待此對象,則從中喚醒一個
4) 調用notifyAll()能夠喚醒所有正在等待這個對象的monitor的線程
為什么這三個不是Thread中的方法,而是Object類中的方法?
當然由於Thread也是Object,所以Thread也可以調用此方法
原因: 由於每一個對象都可以擁有鎖,所以讓當前線程等待某個對象的鎖,當然需要通過這個對象來操作了,而不是用當前線程來操作,因為當前線程可能會等待多個鎖,如果通過線程來操作,就很復雜
上面已經提到,如果條用某個對象的wait()方法,當前線程必須擁有這個對象的鎖,因此調用wait()方法必須在synchronized塊或者synchronized方法中進行
調用某個對象的wait()方法,相當於讓當前線程交出此對象的鎖,然后進入等待狀態,等待后續再次獲得此對象的鎖(Thread中的sleep方法使當前線程暫停一段時間,從而讓其他線程有機會繼續執行,但是在這期間sleep不是訪對象鎖)
notify()方法能夠喚醒一個正在等待該對象的鎖的線程,如果有多個線程,只能喚醒其中的一個,具體喚醒那個線程不確定
調用對象的notify()方法,當前線程也必須用用這個對象的synchronized,因此調用notify()方法必須在synchronized()中執行
Condition是在jdk 1.5中出現的,用來替代傳統的Object的wait,notify()和notifyAll(),實現線程間的通信,使用Contion的await(),singal()這種方式來實現線程的協作更加安全和高效,阻塞隊列使用的是Condition來模擬線程間的協作
Condition是一個接口
public interface Condition { await();
signal();
signalAll();
} Condition依賴於Lock接口,生成一個Condition的基本代碼是lock.newCondition();
調用Condition的await()和signal()方法,必須都在lock.lock()的保護之內
wait()對應於await();
notify()對應於signal;
notifyAll()對應於signalAll();
ThreadLocal里面可以放一個值 ThreadLocal類用於創建一個線程本地變量Thread中有一個成員變量ThreadLocals,該變量的類型是ThreadLocalMap,也就是一個Map,他的鍵是threadLocal,值為變量的副本.通過ThreadLocal的get()方法可以獲取到該線程變量對應的value
不論是靜態內部類,還是非靜態內部類,都是外部類的一個屬性,所以,對於非靜態內部類,需要使用InstanceObject().new InnerClass(),對於靜態內部類,可以使用new OuterClass.staticInnerClass()的方式來進行創建無論是靜態內部類,還是非靜態內部類,都需要使用OuterClass.innerClassName來進行引用
