問題一:Java語言中,如果"xyz"沒有被創(chuàng)建過,String s =new String(“xyz”);創(chuàng)建了幾個string object?
對于這句代碼,可分為兩個過程:
jvm 首先在字符串常量池內(nèi)里面看看找不找到字符串"xyz";找到,進入第二步;否則,創(chuàng)建新的 String 對象,并“放到”字符串常量池里面。
然后由于遇到了 new,還會在堆創(chuàng)建 String 對象,其實實際是引用的常量池的那個,最后將其返回給 s1。
深入解析:
?在 HotSpot VM 里實現(xiàn)的 string pool 功能的是一個 StringTable 類,它是一個哈希表,里面存的是駐留字符串(也就是我們常說的用雙引號括起來的)的引用(而不是駐留字符串實例本身)
????也就是說在堆中的某些字符串實例被這個 StringTable 引用之后就等同被賦予了”駐留字符串”的身份。
????這個 StringTable 在每個 HotSpot VM 的實例只有一份,被所有的類共享。
問題二:對于abstract聲明的類,下面說法正確的是?
? ? 1. 可以實例化 (錯誤)
解析:抽象類中有抽象方法,需要被實現(xiàn),不能實例化
????2. 不可以被繼承 (錯誤)
解析:可以被繼承,如果不繼承,里面的抽象方法就沒意思了
3.?子類為abstract?(錯誤)
?解析:子類不一定為抽象類,可以是,也可以不是
4.只能被繼承(錯誤)
解析:接口是特殊的抽象類,可以可以動態(tài)綁定,實現(xiàn)多態(tài)
5.可以被抽象類繼承(正確)
問題三:類加載的順序
(1) 父類靜態(tài)代碼塊(包括靜態(tài)初始化塊,靜態(tài)屬性,但不包括靜態(tài)方法)
????(2) 子類靜態(tài)代碼塊(包括靜態(tài)初始化塊,靜態(tài)屬性,但不包括靜態(tài)方法?)
????(3) 父類非靜態(tài)代碼塊(?包括非靜態(tài)初始化塊,非靜態(tài)屬性?)
????(4) 父類構(gòu)造函數(shù)
????(5) 子類非靜態(tài)代碼塊?(?包括非靜態(tài)初始化塊,非靜態(tài)屬性?)
????(6) 子類構(gòu)造函數(shù)
問題四:Hashtable 和HashMap區(qū)別
(1)?Hashtable 是一個哈希表,該類繼承自Dictionary類,實現(xiàn)了 Map 接口,線程安全
(2)?HashMap是基于哈希表實現(xiàn)的,每一個元素是一個key-value對,其內(nèi)部通過單鏈表解決沖突問題,容量不足(超過了閥值)時,同樣會自動增長。該類繼承AbstractMap,實現(xiàn)Map接口,線程不安全
問題五:HashMap的詳細特性
1、hashmap的數(shù)據(jù)結(jié)構(gòu)?
????要知道hashmap是什么,首先要搞清楚它的數(shù)據(jù)結(jié)構(gòu),在java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個是數(shù)組,另外一個是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個基本結(jié)構(gòu)來構(gòu)造的,hashmap也不例外。Hashmap實際上是一個數(shù)組和鏈表的結(jié)合體
當我們往hashmap中put元素的時候,先根據(jù)key的hash值得到這個元素在數(shù)組中的位置(即下標),然后就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經(jīng)存放有其他元素了,那么在同一個位子上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。從hashmap中get元素時,首先計算key的hashcode,找到數(shù)組中對應位置的某一元素,然后通過key的equals方法在對應位置的鏈表中找到需要的元素。從這里我們可以想象得到,如果每個位置上的鏈表只有一個元素,那么hashmap的get效率將是最高
2、hash算法
源代碼里 取得key的hashcode值,然后跟數(shù)組的長度-1做一次“與”運算(&),默認的數(shù)組大小是16,在小數(shù)據(jù)量的情況下16比15和20更能減少key之間的碰撞,而加快查詢的效率。?
3、hashmap的resize?
當hashmap中的元素越來越多的時候,碰撞的幾率也就越來越高(因為數(shù)組的長度是固定的),在hashmap數(shù)組擴容之后,最消耗性能的點就出現(xiàn)了:原數(shù)組中的數(shù)據(jù)必須重新計算其在新數(shù)組中的位置,并放進去,這就是resize
當hashmap中的元素個數(shù)超過數(shù)組大小*loadFactor時,就會進行數(shù)組擴容,loadFactor的默認值為0.75,也就是說,默認情況下,數(shù)組大小為16,那么當hashmap中元素個數(shù)超過16*0.75=12的時候,就把數(shù)組的大小擴展為2*16=32,即擴大一倍,然后重新計算每個元素在數(shù)組中的位置
總結(jié):hashmap?默認的數(shù)組大小是16 當里面存儲loadFactor達到16*0.75=12,數(shù)值會擴容2倍2*16=32
編程題:對字符串進行截取、翻轉(zhuǎn)、替換等
核心代碼
????????????char[] chara = stringA.toCharArray();
????????????for(inti=0;i<stringA.length();i++){}
1、確定字符串互異
publicclassDifferent {
????publicbooleancheckDifferent(String iniString) {
????????intlength = iniString.length();
????????char[] chars = iniString.toCharArray();
????????Set<String> set =?newHashSet();
????????for(chars:chars){
????????????set.add( String.valueOf(s));
????????}
????????intcount = set.size();
????????if(count==length){
????????????returntrue;
????????}else{
????????????returnfalse;
????????}
????}
}
2、字符串翻轉(zhuǎn)
publicclassReverse {
????publicString reverseString(String iniString) {
????????returnnewStringBuilder(iniString).reverse().toString();
????}
}
3、確定兩串亂序同構(gòu)
publicclassSame {
????publicbooleancheckSam(String stringA, String stringB) {
?????????String tmpb=stringB;
????????if(stringA.length()!=stringB.length()){
????????????returnfalse;
????????}else{
????????????char[] chara = stringA.toCharArray();
????????????for(inti=0;i<stringA.length();i++){
????????????????String tmp = String.valueOf(chara[i]);
????????????????intindex = tmpb.indexOf(tmp);
????????????????if(index==-1){
????????????????????returnfalse;
????????????????}else{
????????????????????if(index==0){
????????????????????????tmpb = tmpb.substring(1,tmpb.length());
????????????????????}elseif(index==tmpb.length()){
????????????????????????tmpb = tmpb.substring(0,tmpb.length()-1);
????????????????????}else{
????????????????????????tmpb = tmpb.substring(0,index)+tmpb.substring(index+1,tmpb.length());
????????????????????}
????????????????}
????????????}
????????????if(tmpb.length()==0){
????????????????returntrue;
????????????}
????????}
????????returnfalse;
????}
}
4、空格替換
publicclassReplacement {
????publicString replaceSpace(String iniString,?intlength) {
????????char[] chara = iniString.toCharArray();
????????String result ="";
????????for(inti=0;i<iniString.length();i++) {
????????????String tmp = String.valueOf(chara[i]);
????????????if(tmp.equals(" ")){
????????????????result+="%20";
????????????}else{
????????????????result +=tmp;
????????????}
????????}
????????returnresult;
????}
}
5、字符串壓縮
publicclassZipper {
????publicString zipString(String iniString) {
????????char[] chara = iniString.toCharArray();
????????String first = iniString.substring(0,1);
????????String result =first;
????????booleanflag =false;
????????booleanvaild =true;
????????intcount=1;
????????for(inti=1;i<iniString.length();i++) {
????????????String tmp = String.valueOf(chara[i]);
????????????if(tmp.equals(first)){
????????????????count++;
????????????????flag=true;
????????????????vaild=false;
????????????????if(i==iniString.length()-1){
????????????????????result +=count;
????????????????}
????????????}else{
????????????????if(flag){
????????????????????result += count;
????????????????????flag =false;
????????????????????count=1;
????????????????}else{
????????????????????result +=1;
????????????????}
????????????????first=tmp;
????????????????result += tmp;
????????????}
????????}
????????if(vaild){
????????????result =? iniString;
????????}
????????returnresult;
????}
}
寫在結(jié)尾:技術是靠慢慢積累出來的。上面寫的很多也是轉(zhuǎn)述一些大神的見解。希望對大家有幫助。
相應后面5到的編程題,需要詳細題目可以聯(lián)系我qq 2422014433 請備注學習交流