Android方面:
3蹦疑、內存優(yōu)化(內存泄漏、內存溢出)萨驶,如何查找內存泄漏歉摧,如何優(yōu)化
內存泄露:是指程序在申請內存后,無法釋放本應該被回收的內存腔呜。內存泄露的堆積就會導致內存溢出叁温。
內存溢出:是指程序在申請內存時,沒有足夠的內存空間供其使用核畴。
查找內存泄露:
1膝但、使用AS自帶的內存分析界面,可以查看內存使用情況(藍色區(qū)域表示程序使用的內存谤草,灰色區(qū)域表示空閑內存)
內存泄露的原因以及解決方法:
1跟束、靜態(tài)的上下文,比如static Context context丑孩,應該盡量避免靜態(tài)上下文的使用泳炉;
2、未取消注冊或者監(jiān)聽嚎杨,比如BrocastReceiver和EventBus需要在Activity的onDestroy中取消注冊花鹅;
3、資源沒有關閉或者釋放枫浙,比如IO刨肃、File流或者Cursor在操作完成后沒有及時關閉古拴;
4、耗時任務或者屬性動畫沒有取消真友,比如屬性動畫需要在Activity的onDestroy中取消黄痪;
5、WebView造成內存泄露盔然,WebView也需要在Activity的onDestroy中調用它的destroy()方法
4桅打、Activity啟動模式及區(qū)別
有以下四種啟動模式:standard、singleTop愈案、singleTask挺尾、singleInstance。
1站绪、standard標準模式
也是系統(tǒng)默認模式遭铺。
在該模式下,每次啟動一個Activity都會創(chuàng)建一個新的實例恢准,不管這個實例是否已經(jīng)存在魂挂。并且誰啟動了這個
Activity,那么這個Activity就運行在啟動它的那個Activity所在的棧中馁筐。比如OneActivity啟動了
TwoActivity(TwoActivity是標準模式)涂召,則TwoActivity就會進入到OnaActivity所在的棧中。
2敏沉、singleTop棧頂模式
具體分為以下兩種情況:
2.1芹扭、如果被啟動的Activity已經(jīng)存在且位于棧頂,那么該Activity就不會重建赦抖,而是調用其onNewIntent()
方法重用該實例舱卡。
2.2、如果被啟動的Activity已經(jīng)存在但不是位于棧頂队萤,那么就會重新創(chuàng)建該Activity的實例轮锥。
3、singleTask棧內模式
具體分為以下三種情況:
3.1要尔、如果被啟動的Activity所需的任務棧不存在舍杜,就會先創(chuàng)建該Activity所需的任務棧,然后再創(chuàng)建該
Activity的實例并將它加入到任務棧中赵辕。
3.2既绩、如果被啟動的Activity所需的任務棧存在且該任務棧中不存在該Activity的實例,就會創(chuàng)建該Activity
的實例并將它加入到任務棧中还惠。
3.3饲握、如果被啟動的Activity所需的任務棧存在且該任務棧中存在該Activity的實例。則有以下兩種情況:
3.3.1、如果該Activity位于任務棧的棧頂救欧,則該Activity不會重建衰粹,系統(tǒng)會調用其onNewIntent()方法
重用該實例;
3.3.2笆怠、如果該Activity不是位于任務棧的棧頂铝耻,那么該Activity不會重建,系統(tǒng)會調用其
onNewIntent()方法重用該實例并且清除任務棧中該Activity之上所有的Activity實例蹬刷。
4瓢捉、singleInstance單例模式
該模式具備singleTask所有特性。
具體分為以下兩種情況:
4.1办成、如果被啟動的Activity不存在泡态,系統(tǒng)先會創(chuàng)建一個全新的任務棧,然后再創(chuàng)建該Activity實例并將它加入
到新的任務棧棧頂诈火。
4.2兽赁、如果被啟動的Activity已經(jīng)存在状答,那么無論它位于哪個應用程序冷守,哪個任務棧,系統(tǒng)都會把該Activity
所在的任務棧切換前臺惊科,從而使該Activity顯示出來拍摇。
注意:采用singleInstance加載模式的Activity總是位于任務棧棧頂,并且該任務棧中只包含該Activity實例馆截。
1蜡娶、提高進程的優(yōu)先級
2混卵、利用廣播拉活Activity
6、Activity啟動過程
7窖张、動畫
1幕随、Android的動畫可以分為三種:View動畫、幀動畫宿接、屬性動畫赘淮。
8、UI(同一張圖片放在不同dpi中睦霎,加載內存的大小有何不同)
9梢卸、Handler的原理,手寫兩個子線程Handler通信副女,loop wait時如何喚醒的
Handler原理:
Handler主要是由Looper和MessageQuene構建消息的處理蛤高。Looper負責循環(huán)從MessageQuene中讀取消息,
如果有就交給Handler處理,如果沒有就一直等待襟齿。MessageQuene負責消息的插入和讀取姻锁,里面維護了一個
單向鏈表,根據(jù)消息的執(zhí)行時間排列(即最先被執(zhí)行的在鏈表前面)猜欺。
兩個子線程Handler通信
public Handler mHandler;
new Thread(new Runnable(){
@Override
public void run(){
Looper.prepare();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
Log.e("gybguohao","msg.obj = " + msg.obj);
}
}
Looper.loop();
}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
Message msg = mHandler.obtainMessage();
msg.obj = "這是從第二個子線程過來的消息";
mHandler.sendMessage(msg);
}
}).start();
10位隶、Context類
11、熱更新
12开皿、WebView優(yōu)化涧黄,及H5的js調用
WebView的優(yōu)化:
1、第一次打開WebView時間過長赋荆,可以在合適的時候創(chuàng)建一個全局的WebView供所有頁面使用笋妥;
2、設置WebView的文件緩存窄潭,加快加載速度春宣。
H5的js調用:
1、首先設置允許與JS交互webSettings.setJavaScriptEnabled(true);
2嫉你、添加交互接口mWebView.addJavascriptInterface(new JsCommunicate(), "App");
3月帝、在JsCommunicate類中通過注解@JavascriptInterface定義具體的交互方法;
4幽污、js端通過window.App.方法名()調用對應的方法嚷辅。
13、性能優(yōu)化
1距误、應用啟動速度優(yōu)化簸搞,避免在自定義Application類中做過多耗時的操作;
2准潭、減少布局多層嵌套趁俊,避免GPU過度繪制,使用merge減少布局嵌套刑然;
3寺擂、盡量減少APK的大小,刪除無用代碼和資源闰集,重復布局盡量采用include沽讹;
4、內存優(yōu)化武鲁,及時釋放內存爽雄,避免內存泄露;
5沐鼠、避免無用的網(wǎng)絡請求挚瘟,給用戶造成流量的浪費叹谁。
14、Binder機制
Android Binder是用來做進程通信的乘盖,Android的各個應用以及系統(tǒng)服務都運行在獨立的進程中焰檩,它們的通信都依賴
于Binder。
15订框、65536是怎么回事析苫?如何解決
表示方法數(shù)超過了65536個
解決方法:
1、在項目的build.gradle文件下defaultConfig閉包中配置multiDexEnabled true
2穿扳、在dependencies下添加依賴implementation 'com.android.support:multidex:1.0.0'
3衩侥、在自定義的Application類中重寫attachBaseContext方法,并且執(zhí)行MultiDex.install(this)代碼矛物。
@Override
public void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
16茫死、LruCache原理
LruCache的全稱是Least Recently Used,也就是最近最少使用算法履羞。
17峦萎、斷點續(xù)傳
18、主線程Lopper為什么不會ANR
因為Android是由事件驅動的忆首,looper.loop() 不斷地接收事件爱榔、處理事件,每一個點擊觸摸或者說Activity的
生命周期都是運行在Looper.loop()的控制之下雄卷,如果Looper停止了搓蚪,應用也就停止了蛤售。只能是某一個消息或者
說對消息的處理阻塞了 Looper.loop()丁鹉,而不是 Looper.loop()阻塞它。
19悴能、AIDL
Java方面:
1揣钦、線程安全、多線程通信漠酿、同步方式
線程安全:
在多線程環(huán)境下對共享資源的訪問冯凹,保證此共享資源的一致性。
線程安全問題多是由全局變量和靜態(tài)變量引起的炒嘲,
當多個線程對共享數(shù)據(jù)只執(zhí)行讀操作宇姚,不執(zhí)行寫操作時,一般是線程安全的夫凸;
當多個線程都執(zhí)行寫操作時浑劳,需要考慮線程同步來解決線程安全問題。
多線程通信:
1夭拌、全局變量
2魔熏、Handler
3衷咽、AsyncTask
4、EventBus
同步方式:
1蒜绽、使用synchronized關鍵字(同步方法和同步代碼塊)
2镶骗、線程池的原理
3、進程間通信方式
1躲雅、Binder
2鼎姊、Intent
3、ContentProvider
4相赁、AIDL
4此蜈、進程和線程區(qū)別
一個程序至少一個進程,一個進程至少一個線程噪生。
進程是系統(tǒng)進行資源分配和調度的最小單位裆赵,比如分配內存。
線程是程序執(zhí)行的最小單位跺嗽,可以與同屬一個進程的其他的線程共享該進程所擁有的全部資源战授。
5、sleep和wait區(qū)別
1桨嫁、sleep是Thread類的方法植兰,wait是object類的方法;
2璃吧、sleep方法沒有釋放鎖所以不能調用里面的同步方法楣导。而wait方法釋放了鎖,使得其他線程可以調用里面的同步方法畜挨。
4筒繁、sleep必須捕獲異常,而wait不需要捕獲異常
6巴元、堆和棧的區(qū)別
1毡咏、堆中存儲的是對象
2、棧中存儲的是局部變量
final可以修飾類呕缭、方法、變量(包括成員變量和局部變量)
1修己、final修飾類恢总,表示這個類不能被繼承,并且該類中所有的成員方法會被隱式的指定為final方法睬愤;
2片仿、final修飾方法,該方法在子類中不能重寫戴涝,只能繼承滋戳;
3钻蔑、final修飾變量,如果是基本數(shù)據(jù)類型的變量奸鸯,則其數(shù)值一旦在初始化之后便不能更改咪笑;如果是引用類型的變量,
則在對其初始化之后便不能再讓其指向另一個對象
8娄涩、簡單描述封裝窗怒、繼承、多態(tài)
1蓄拣、封裝:將事物的屬性和實現(xiàn)細節(jié)隱藏起來扬虚,只對外提供訪問和修改接口(例如set和get方法);
2球恤、繼承:當多個類具有相同的屬性和方法時辜昵,可以將相同部分抽取出來放到一個類中作為父類,其他的類繼承這個父類咽斧。
3堪置、多態(tài):方法的重寫和重載是Java多態(tài)性的不同表現(xiàn)。
重寫是父類與子類之間多態(tài)性的一種表現(xiàn)张惹,重載是一個類中多態(tài)性的一種表現(xiàn)舀锨。
9、==和equals的區(qū)別
==:
1宛逗、對于基本數(shù)據(jù)類型比較的是它們的值是否相等坎匿;
2、對于對象比較的是它們是否是同一個對象(即內存地址是否相同)雷激;
equals:
1替蔬、equals比較的是值是否相等
10、java基本數(shù)據(jù)類型和區(qū)別
基本數(shù)據(jù)類型:
1侥锦、byte:Java中最小的數(shù)據(jù)類型进栽,1個字節(jié)德挣,取值范圍-128~127恭垦,默認值0
2、short:短整型格嗅,2個字節(jié)番挺,取值范圍-32768~32767,默認值0
3屯掖、int:整型玄柏,4個字節(jié),取值范圍-2147483648~2147483647贴铜,默認值0
4粪摘、long:長整型瀑晒,在內存中占64位,即8個字節(jié)-2^63~2^63-1徘意,默認值0L
5苔悦、float:浮點型,4個字節(jié)椎咧,與double的區(qū)別在于float類型有效小數(shù)點只有6~7位玖详,默認值0
6、double:雙精度浮點型勤讽,8個字節(jié)蟋座,默認值0
7、char:字符型脚牍,2個字節(jié)向臀,取值范圍0~65535,默認值為空
8诸狭、boolean:布爾類型飒硅,占1個字節(jié),用于判斷真或假作谚,默認值false
引用數(shù)據(jù)類型:
1三娩、類、接口類型妹懒、數(shù)組類型雀监、枚舉類型、注解類型眨唬。
區(qū)別:
1会前、基本數(shù)據(jù)類型在被創(chuàng)建時,在棧上給其劃分一塊內存匾竿,將數(shù)值直接存儲在棧上瓦宜。
2、引用數(shù)據(jù)類型在被創(chuàng)建時岭妖,首先要在棧上給其引用分配一塊內存临庇,而具體對象存儲在堆內存上,
然后由棧上面的引用指向堆中對象的地址昵慌。
11假夺、如何實現(xiàn)一個死鎖
12、synchronized的實現(xiàn)原理
Java內存模型三大性質:可見性已卷、原子性和有序性。
1淳蔼、可見性:是指線程之間的可見性侧蘸,一個線程修改的狀態(tài)對另一個線程是可見的裁眯,volatile修飾的變量不允許
線程內部緩存和重排序,即直接修改內存讳癌,所以對其他線程是可見的未状。但是這里需要注意一個問題,volatile
只能讓被它修飾內容具有可見性析桥,但不能保證它具有原子性司草。
2、原子性:原子是世界上的最小單位泡仗,具有不可分割性埋虹。
3、有序性:Java 語言提供了 volatile 和 synchronized 兩個關鍵字來保證線程之間操作的有序性娩怎,
volatile 是因為其本身包含“禁止指令重排序”的語義搔课,synchronized 是由“一個變量在同一個時刻
只允許一條線程對其進行 lock 操作”這條規(guī)則獲得的,此規(guī)則決定了持有同一個對象鎖的兩個同步塊只能串行執(zhí)行截亦。
volatile變量用來確保將變量的更新操作通知到其他線程爬泥。當把變量聲明為volatile類型后马靠,編譯器與運行時都會
注意到這個變量是共享的屿脐,因此不會將該變量上的操作與其他內存操作一起重排序贮配。volatile變量不會被緩存在寄存器
或者對其他處理器不可見的地方稼虎,因此在讀取volatile類型的變量時總會返回最新寫入的值。
在訪問volatile變量時不會執(zhí)行加鎖操作鱼的,因此也就不會使執(zhí)行線程阻塞仪或,因此volatile變量是一種比sychronized
關鍵字更輕量級的同步機制宗侦。
聲明變量是 volatile 的颖系,JVM 保證了每次讀變量都從內存中讀嗅剖,跳過 CPU cache 這一步。
14嘁扼、子類重寫父類方法信粮,返回值和參數(shù)有什么要求
1、方法名和參數(shù)類型及個數(shù)都不可以修改
2趁啸、可以講方法的權限修飾符改為更寬松的强缘,比如父類中的方法是protected的,則子類中的方法可以是public的
3莲绰、當返回值為類類型時欺旧,重寫的方法可以修改返回值類型,但必須是父類方法返回值的子類蛤签;要么就不修改,與父
類返回值類型相同
框架搭建:
1栅哀、MVC和MVP的區(qū)別
1震肮、MVC中無法區(qū)分Activity到底是V還是C称龙,因為它即承擔了界面的顯示,又負責一部分邏輯的處理戳晌;
2鲫尊、MVP中V和M不存在直接聯(lián)系,而是通過P來交互沦偎。P和V以及P和M之間通過接口來交互疫向,從而降低了代碼的耦合度。
2豪嚎、手寫MVP框架(用戶登錄)
public class LoginActivity extends AppCompatActivity implements LoginView {
private LoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLoginPresenter = new LoginPresenter(this);
// 請求登錄
mLoginPresenter.login("188xxxx6110", "123456");
}
@Override
public void loginSuccess(LoginModel model) {
}
@Override
public void loginFail(int code, int msg) {
}
}
public interface LoginView() {
void loginSuccess(LoginModel model);
void loginFail(int code, int msg);
}
public class LoginPresenter {
public LoginView mView;
public LoginPresenter(LoginView view) {
this.mView = view;
}
public void login(String phone, String password) {
NetClient.getInstance().login(new BaseCallback<LoginModel>() {
@Override
public void onSuccess(LoginModel model) {
mView.loginSuccess(model);
}
@Override
public void onFail(int code, int msg) {
mView.loginSuccess(code, msg);
}
})
}
}
3搔驼、MVVM框架
Android的MVVM框架主要是通過DataBinding這個庫實現(xiàn)
設計模式:
1、用到的設計模式都有哪些
常用的設計模式有:單例模式侈询、Builder舌涨、工廠模式、策略模式扔字、觀察者模式囊嘉、等等
2、實現(xiàn)單例模式都有哪幾種方式
有以下幾種方法:餓漢革为、懶漢扭粱、Double checked locking、靜態(tài)內部類
餓漢模式
public class Singleton {
private static final Singleton mInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return mInstacen;
}
}
懶漢模式
public class Singleton {
private static Singleton mInstance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstacen;
}
}
3震檩、手寫單例模式
雙重加鎖
public class Singleton{
private volatile static Singleton mInstance = null;
private Singleton(){
}
public static Singleton getInsatnce(){
if (mInstance == null){
synchronized(Singleton.class){
if(mInstance == null){
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
靜態(tài)內部類
public class Singleton{
private Singleton(){
}
public static Singleton getInsatnce(){
return SingletonHolder.mInstance;
}
private static class SingletonHolder{
private static final Singleton mInstance = new Singleton();
}
}
4焊刹、裝飾模式
三方框架:
1、用到的三方框架都有哪些
1恳蹲、Butterknife
2虐块、EventBus
3、Retrofit
4嘉蕾、OkHttp
5贺奠、Glide
2、OkHttp的原理
3错忱、Picasso緩存機制
算法方面:
1儡率、冒泡排序
假設無序數(shù)組為[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
當i = 0時,進行第一次內部比較
1以清、第一次循環(huán)后的結果是[1, 6, 2, 7, 9, 3, 4, 5, 10, 8]
2儿普、第二次循環(huán)后的結果是[1, 2, 6, 7, 9, 3, 4, 5, 10, 8]
3、第三次循環(huán)后的結果是[1, 2, 6, 7, 9, 3, 4, 5, 10, 8]
4掷倔、第四次循環(huán)后的結果是[1, 2, 6, 7, 9, 3, 4, 5, 10, 8]
5眉孩、第五次循環(huán)后的結果是[1, 2, 6, 7, 3, 9, 4, 5, 10, 8]
6、第六次循環(huán)后的結果是[1, 2, 6, 7, 3, 4, 9, 5, 10, 8]
7、第七次循環(huán)后的結果是[1, 2, 6, 7, 3, 4, 5, 9, 10, 8]
8浪汪、第八次循環(huán)后的結果是[1, 2, 6, 7, 3, 4, 5, 9, 10, 8]
9巴柿、第九次循環(huán)后的結果是[1, 2, 6, 7, 3, 4, 5, 9, 8, 10]
......
當i = 1時,進行第一次內部比較
int number[] = new int[10]{6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
int temp = 0;
for (int i = 0; i < number.length - 1; i++) {
for (int j = 0; j < number.length - i - 1; j++) {
if (number[j] > number[j + 1]) {
temp = number[j];
number[j] = number[j + 1];
number[j + 1] = temp;
}
}
}
3广恢、兩個棧實現(xiàn)一個隊列
思路:因為隊列是先進先出,而棧是先進后出
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
// 入列
public void push (int node) {
stack1.push(node);
}
// 出列
public int pop () {
if (stack2.size() <= 0) {
while (stack1.size() > 0) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
4呀潭、斐波那契數(shù)列
斐波那契數(shù)列通項公式:
f(1) = 1;
f(2) = 1;
f(n) = f(n - 1) + f(n - 2) ( n >= 3)
public int Fibonacci (int n) {
if (n == 0) {
return 0;
}
if (n == 1 || n == 2) {
return 1;
}
// f(n)
int a = 0;
// f(n - 1)
int b = 1;
// f(n - 2)
int c = 1;
for (int i = 3; i <= n; i++) {
a = b + c;
c = b;
b = a;
}
return a;
}
5钉迷、二叉樹廣度優(yōu)先遍歷
6、二叉樹根節(jié)點到葉節(jié)點的和
網(wǎng)絡編程:
Https是在Http的基礎上加了SSL層,SSL層負責對傳輸?shù)臄?shù)據(jù)進行加密
1踏幻、Http是明文傳輸枷颊,Https對傳輸?shù)臄?shù)據(jù)進行了加密
2、Http使用80端口連接该面,Https使用443端口連接
3夭苗、Https需要申請證書
4题造、三次握手過程
數(shù)據(jù)加密:
1、加密方式
1猾瘸、MD5:MD5是不可逆的加密算法界赔,也就是無法解密,主要用于客戶端的用戶密碼加密牵触。
2淮悼、SHA1
3、AES
4揽思、RSA:RSA算法在客戶端使用公鑰加密袜腥,在服務端使用私鑰解密。這樣即使加密的公鑰被泄露钉汗,沒有私鑰仍然無法解密羹令。
2、對稱加密和非對稱加密
對稱加密:加密解密用同一個密鑰损痰。
非對稱加密:公鑰加密福侈,私鑰解密。例子:RSA
數(shù)據(jù)結構:
1卢未、ArrayList和LinkedList的區(qū)別及各自的使用場景
ArrayList內部采用數(shù)組的形式存儲數(shù)據(jù)肪凛,所以更適合需要大量進行隨機訪問的場景(即改查操作)堰汉;
LinkedList內部采用雙向鏈表的形式存儲數(shù)據(jù),所以更適合需要對集合進行元素的增加和刪除的場景(即增刪操作)显拜。
2衡奥、HashMap的底層數(shù)據(jù)結構爹袁,及原理
HashMap是由數(shù)組+鏈表+紅黑樹組成的远荠。根據(jù)key的hash值決定元素所在數(shù)組中的位置,數(shù)組里面保存的是由每個
元素組成的單向鏈表失息,當鏈表的長度超過8時譬淳,會轉換成紅黑樹的形式(提高元素的查找效率)。
3盹兢、String邻梆、StringBuffer、StringBuilder的區(qū)別
1绎秒、執(zhí)行速度浦妄。執(zhí)行速度的快慢為:StringBuilder > StringBuffer > String。
2见芹、線程安全剂娄。StringBuilder是線程不安全的,而StringBuffer是線程安全的玄呛。因為StringBuffer中很多方法帶有
synchronized關鍵字阅懦,可以保證是線程安全的。所以在多線程情況下建議使用StringBuffer徘铝,確保線程安全耳胎,但是在
單線程的情況下,建議使用StringBuilder惕它,因為執(zhí)行速度更快怕午。
3、HashMap淹魄、HaseSet郁惜、HashTable、ConcurrentHashMap揭北、LinkHashMap的區(qū)別
1扳炬、HaseMap儲存是無序不重復的,允許key和value為null(如果key為null搔体,則會在代碼里面將null保存為0)恨樟,是
線程不安全的。
2疚俱、HashSet內部其實是用的HashMap作為數(shù)據(jù)的保存劝术,儲存的只是map的key,默認value為null(所以HashSet也是
無序不重復的,也允許key為null的养晋,也是線程不安全的)
3衬吆、HashTable儲存無序不重復的,不允許key和value為null绳泉,通過synchronized關鍵字保證線程安全
4逊抡、ConcurrentHashMap儲存無序不重復的,不允許key和value為null零酪,通過volatile關鍵字保證線程安全
5冒嫡、LinkHashMap繼承至HashMap,通過一個雙向鏈表保存了元素的儲存順序(所以LinkHashMap也允許key為null的四苇,也是線程不安全的)孝凌。
Kotlin方面:
1、const和val的區(qū)別
const只能修飾val月腋,不能修飾var蟀架。
const val的可見性是public final static,可以直接方法榆骚;
val的可見性是private final static片拍,并且val會生成getNormalObject(),通過方法調用寨躁。
2穆碎、kotlin閉包
3、run职恳、apply所禀、let、also放钦、with的用法和區(qū)別
Linux方面:
1色徘、修改權限的命令
chmod 777
r表示read,讀取權限操禀,代表數(shù)字4
w表示write褂策,寫入權限,代表數(shù)字2
x表示execute颓屑,執(zhí)行權限斤寂,代表數(shù)字1