Android面試筆記

2021-10-25 15:20:27 字數 3645 閱讀 8954

string longstring =

"aa......a"

;

儲存在棧記憶體中,編譯時知道大小,編譯成位元組碼時位元組碼中陣列最多儲存65535個位元組(如果為拉丁字元,小於但不包含,如果為非拉丁字元,包含),最終存在虛擬機器方法區的常量池中。

byte

bytes =

loadfromfile

(new

file

("text.txt"))

;string superlongstring =

newstring

(bytes)

;

儲存在堆記憶體中,編譯時未知大小

父類為非靜態內部類:

public

class

client;}

}public

class

outerclass

}

編譯器建構函式包括父類外部類例項引用以及所在方法外部類例項的引用

public

class

client$1

}

父類為靜態類或介面

public

class

client;}

}public

class

outerclass

}public

class

client$1

}

匿名內部類存在於靜態方法中

public

class

client;}

}public

class

client$1

}

捕獲外部作用域的區域性變數

public

class

client};

}}public

class

client$1

}

區域性變數需為final,匿名內部類捕獲的是乙個該區域性變數的快照。

總結:匿名內部類只能繼承乙個父類或實現乙個介面,構造方法為編譯器生成,引數列表包括外部物件(定義在非靜態域內)、父類的外部物件(父類非靜態)、父類的構造方法引數(父類有構造方法且引數列表不為空)、外部捕獲的變數(方法體內有引用外部final變數)

靜態分派-方法過載分派:編譯器確定,依據呼叫者的宣告型別和方法引數型別

動態分派-方法覆寫分派:執行是確定,依據呼叫者的實際型別分派

泛型型別無法用過方法過載

public

void

printlist

(list

list)

public

void

printlist

(list

list)

//error

泛型型別無法當作真實型別使用

t newinstance =

newt()

;//錯誤,未知物件的型別

class c

= t.

class

;//錯誤 無法獲取型別

list

list =

newarraylist

();//可以用於建立其他泛型型別

if(list instanceof

list

)//錯誤,非法的型別判斷,將string去掉則合法

靜態方法無法引用類泛型引數

class

genericclass

//錯誤,靜態方法無法引用類泛型引數

public

static

r max

(r a, r b)

//正確,靜態方法可以宣告泛型引數

}

型別強轉時有型別開銷

面試題:android中非ui執行緒為什麼不能更新ui?

}由此可看出,如果looper退出會丟擲異常。

ui執行緒就是主線程,其他執行緒就是非ui執行緒。

ui具有可變性,甚至是高頻可變性

ui對相應時間的敏感性要求ui操作必須高效

ui元件必須批量繪製來保證效率

messagequeue如何處理訊息

boolean

enqueuemessage

(message msg,

long when)

else

if(needwake)

nativewake

(mptr);.

..}message next()

else}}

}

訊息佇列優化:重複訊息過濾、互斥訊息取消、復用訊息

總結:大於handler looper的週期時基本可靠

looper負載越高,任務越容易積壓,進而導致卡頓

回到looper.preparemainlooper()

public

static

void

preparemainlooper()

smainlooper =

nylooper()

;}}private

static

void

prepare

(boolean quitallowed)

sthreadlocal.

set(

newlooper

(quitallowed));

}

由此可知,prepare()在同乙個執行緒中只能呼叫一次,否則會拋異常。

下面來看threadlocal中是如何儲存和獲取looper的。

public

void

set(t value)

else

}public

void

get(t value)

}return

setinitialvalue()

;}

threadlocalsetget方法首先拿到類當前執行緒,並獲取到乙個threadlocalmap物件。當前執行緒作為keylooper作為引數被儲存在了threadlocalmap裡。

面試筆記1

今天開始準備找實習了,開始準備實習的東西了。接下來開始寫今天看到的小知識。1.宣告,定義,初始化 宣告是指extern int i 定義是指int i 初始化int i 0 區別在於,宣告不分配儲存空間,在這裡編譯的時候是不管的,只有當需要用到i的時候才去檢查。定義的話,就分配一塊空間給它。初始化的...

面試筆記3

有關函式宣告的空間問題 乙個函式在宣告後如果不寫函式體是不會分配空間的,所以實現這個函式也就相當於初始化函式這個變數,同時也就引申出了變數如果只宣告的話是不會分配的空間的?可以這麼認為,因為靜態變數跟全域性變數都是自動初始化為0的。另外在c語言中 void fun 等同於 void fun 在c 語...

實習面試筆記

fib資料庫事務隔離級別有4個 由低到高依次為 read uncommitted,讀到了未提交的事物,只是 add 還沒有 commit read committed,讀到了上一次的commit,也就是說還沒有更新 最新的commit repeatable read,保證讀取最新的 commit,為...