字符串處理、類加載順序、抽象類概述、hashmap

問題一: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 請備注學習交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,007評論 0 2
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,799評論 0 3
  • 四、集合框架 1:String類:字符串(重點) (1)多個字符組成的一個序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 872評論 0 2
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,502評論 0 21
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JA...
    八爺君閱讀 5,177評論 1 114

友情鏈接更多精彩內(nèi)容