校招復(fù)習(xí)概要

應(yīng)聘職位:Android開發(fā)工程師

復(fù)習(xí)概要

1.Java

  • 類(class)

在Java中,類文件是以.java為后綴的代碼文件,在每個類文件中最多只允許出現(xiàn)一個public類,當(dāng)有public類的時候,類文件的名稱必須和public類的名稱相同,若不存在public,則類文件的名稱可以為任意的名稱(當(dāng)然以數(shù)字開頭的名稱是不允許的)。
  在類內(nèi)部,對于成員變量,如果在定義的時候沒有進行顯示的賦值初始化,則Java會保證類的每個成員變量都得到恰當(dāng)?shù)某跏蓟?br>   1)對于 char、short、byte、int、long、float、double等基本數(shù)據(jù)類型的變量來說會默認初始化為0(boolean變量默認會被初始化為false);
  2)對于引用類型的變量,會默認初始化為null。
  如果沒有顯示地定義構(gòu)造器,則編譯器會自動創(chuàng)建一個無參構(gòu)造器,但是要記住一點,如果顯示地定義了構(gòu)造器,編譯器就不會自動添加構(gòu)造器。注意,所有的構(gòu)造器默認為static的。
3) 類的加載順序
static 代碼塊->類屬性->類構(gòu)造函數(shù)

  • 面向?qū)ο笕筇匦?/h6>

封裝:簡單的說就是將一個類針對屬性和操作進行封裝。
繼承:extends ,子類繼承父類。
<pre><code>
public class Person {
private String username;//不可繼承
private String password;//不可繼承
protected String description;//可繼承
public void eat(){ //可繼承
System.out.print("start eat")
}
}
public class Man extends Person{
@override
public void eat(){//覆蓋override
System.out.print("start man eat")
}
//1 和2 屬于重載,其中3 返回值為int 不屬于。
public void run(int mis){//1

 }
 public void run(int mis,String name){//2

 }
 public int run(){//3

 }

}
</code>
</pre>

  1. 所有類隱示繼承Object類
  2. 只允許單繼承,同時屬于統(tǒng)一package 下才能繼承
  3. 繼承public ,protected 關(guān)鍵字修飾的method 和屬性, private 屬于私有,無法繼承
  4. 如果子類與父類出現(xiàn)屬性和方法同名,需要利用super.method/屬性,才能進行調(diào)用父類的屬性和method,不然只能調(diào)用this 類的屬性和method。
    5)子類不能繼承父類的構(gòu)造函數(shù)。如果構(gòu)造函數(shù)有參數(shù),子類需要利用super(參數(shù)) 進行調(diào)用。
  5. final 修飾的類,無法重載,其中String
    多態(tài):允許不同類的對象對同一消息作出響應(yīng)(多種動物,都可以eat)
    1)覆蓋 override(子類的方法和父類的方法一樣)
  6. 父類引用指向子類
    <pre><code>Person person=new Man() </code></pre>
  7. 重載 overload 一個類中的多個同名方法(參數(shù)個數(shù),類型) 注意:返回類型不同,不屬于重載。
  • Collection 和Map 集合
  1. collection三大分類:List(有序)和Set(無序),Queue(隊列)
  2. List 常見子類:ArrayList(線程不同步,線程不安全,數(shù)組的形式實現(xiàn)),Vector(線程安全,線程同步),LinkedList(線程不安全,鏈表的形式實現(xiàn))
    3)Set 常見集合:HashSet,TreeSet,EnumSet, 利用迭代器(Iterator)進行遍歷
    4)map<K,V>常見類:HashMap(線程不安全),HashTable(線程安全)
  • 線程(Runnable,Thread)

線程:程序執(zhí)行的最小單元,有五種狀態(tài):新建,就緒,執(zhí)行,等待,死亡。

  1. 接口Runnable
    <pre><code>public void run() 方法 執(zhí)行線程</code></pre>
  2. 線程生命周期

<pre><code>new->start()->run()->阻塞(join(),sleep(),wait())->死亡</code></pre>

  1. 創(chuàng)建線程
    <pre><code>
    //方式1
    new Thread(){
    public void run(){
    //code
    }
    }.start();

//方式2
public class MyThread implements Runnable{
public void run(){
//code
}
}
MyThread mythread=new MyThread();
new Thread(mythread).start();
</code></pre>

  1. 系統(tǒng)線程池
    ExecutorService接口(java 自帶)

    • CachedThreadPool 緩沖的線程池,
    • FixedThreadPool 自定線程數(shù)的線程池
    • SingleThreadExecutor 單線程池
    • ScheduledThreadPool 定時線程池
  2. 線程與進程的區(qū)別
    線程像是進程的單元細胞。一個進程至少有一個線程,進程有單獨的地址空間,然后線程沒有。

  • 異常(Throwable)
  1. 異常分類:Error 和Exception
    <pre><code> Error : StackOverFlowError(棧溢出),OutOfMemoryError(內(nèi)存溢出)</pre></code>
    Exception:
    <pre><code>
    RuntimeException(ArrayIndexOutOf,NullPointer,Arrithmetic,
    ClassNotFound,IIlegalArgument,UnkownType)
    非運行時異常 (IO, SQL)</code>
    </pre>
  2. 異常處理
    關(guān)鍵字 try catch finally
    <pre><code>
    try{
    // code
    }catch(異常類){
    // code
    }finally{
    //無論發(fā)生何種異常最后都會走finally 代碼塊中
    }
    </code></pre>
  3. throws 關(guān)鍵字 和throw 關(guān)鍵字
    throws 用得最多的是將dao 層中的異常拋到service 中進行處理
    <pre><code>
    dao層: public void getUser() throws Exception
    service層:
    try{
    dao.getUser();
    }catch(Exception e){
    //code;
    }
    </code></pre>
    throw 關(guān)鍵字主要用于代碼塊
    <pre><code>
    if(條件){
    throw new CustomException("message");
    }
    </code></pre>
  4. 自定義異常
    自定義異常,CustonException extends Exception
  • String 類
  1. 為何定義為不變類
    String 為何為final 類,需要從幾個方法進行討論
    1.字符串常量池的需要
    引用->內(nèi)存->常量池
    <pre><code>
    String a="abc";
    String b="abc";
    String c= new String("abc")
    if (a==b) // true
    if (a==c) // false
    if (a==c.intern()) //true
    </code></pre>
    2.運行緩存HashCode
    能夠保證hashCode的唯一性,保證String在java 中頻繁使用的高性能。
    3.安全性
    不變模式可以挺高多線程程序的性能,降低多線程程序復(fù)雜度,保證多線程下的安全性。
  2. StringBuffer ,StringBuilder String 三者的區(qū)別
    <pre><code>
    String a="abc"+"def"+"yes"; //1
    StringBuffer b="abc".append("def").append("yes");//2 性能高于1
    </code></pre>StringBuffer 線程安全
    StringBuilder 線程不安全,單線程下StringBuilder 多字符串操作性能最好。
    3)==與equals方法 區(qū)別
    <pre><code>
    String a="abc";
    String b=new String("abc")
    if(a==b) //false 比較的是引用所指向的對象內(nèi)存地址
    if(a.equals(b)) //true 比較兩者的value
    </code></pre>
  • JVM
  1. 內(nèi)部結(jié)構(gòu)
    Runtime Data Area(運行區(qū)):
    1.程序計數(shù)器:線程私有
    2.本地方法棧:線程私有
    3.虛擬機棧:線程私有
    4.方法區(qū):線程共享
    5.堆區(qū):線程共享
    ClassLoader(類加載器):將class 文件裝載到方法區(qū)
    Execution Engine(執(zhí)行引擎) :執(zhí)行.class文件指令
    NativeInterface(本地接口):與native libraries交互
  • 四大引用

1)強引用: 一直不會回收,內(nèi)存不足時,出現(xiàn)OOM
2)軟引用: 當(dāng)內(nèi)存不足時,GC進行回收
3)弱引用: 無論內(nèi)存是否足夠,只要看點是弱引用,都進行回收
4)虛引用: 只是跟蹤對象回收活動的一個監(jiān)視隊列

  • 設(shè)計模式

1)單例模式(最優(yōu)方式:內(nèi)部類方式)
<pre><code>
public class Singleton{
private Singleton(){
}
private static class SingletonHodler{
private static Singleton instance=newSingleton();
public static Singleton getInstance(){
return SingletonHodler.instance;
}
}
}
</code></pre>
2)工廠模式
3)觀察者模式

  • 常見陷進
  1. if-else
    <pre><code>
    if(true) System.out.println("if");
    else System.out.println("else");
    //編譯,執(zhí)行,打印輸出 if 。可見else 并沒有執(zhí)行
    </code></pre>
  2. static ,final
    <pre><code>
    class Ideone
    { static int i=10;
    final static int a=10;
    public void run(){
    i++;
    }
    public void run1(){
    //a++;出現(xiàn)編譯錯誤,因為final 修飾的是不可以進行更改的
    //static int i=0; 在方法中定義static 變量,IntellijIDEA 中直接報錯,所有在方法定義是不被允許的。
    }
    public static void main (String[] args)
    { Ideone ido=new Ideone();
    ido.run();
    //ido.run1();
    System.out.println(i);
    }
    }
    //打印輸出為11. 其實一直都認為static 是保持不變,但是打印出來一直是一種錯覺。
    </code></pre>
  3. 引用傳值
    <pre><code>
    /Created by Darker on 15/8/11. /
    public class Test360_2 {
    int x=6;
    int y=7;
    public static void main(String[] args){
    Test360_2 test360_2=new Test360_2();
    print(test360_2.x,test360_2.y);
    System.out.println(test360_2.x);
    System.out.println(test360_2.y);
    }
    static void print(int x,int y){
    x++;
    y++;
    System.out.println(x);
    System.out.println(y);
    }
    }
    //打印輸出7 8 , 6 7 可以看出,類屬性的值x.y并沒有改變
    </code></pre>
  4. break;return;continue;finally
    <pre><code>
    /** * Created by Darker on 15/8/11. */
    public class Test360_2 {
    public static void main(String[] args){
    print();
    }
    static void print(){
    try {
    return ;
    }
    catch (Exception e){
    }
    finally {
    System.out.println("yes");
    }
    }
    }
    //這行代碼打印出yes,也就證明無論如何return也好,都要執(zhí)行finally 代碼塊
    </code></pre>break 則是直接跳出循環(huán)
    continue 則是跳出本次循環(huán),進行下一次循環(huán)
  5. ++i;i++
  6. 函數(shù)執(zhí)行順序
  7. for循環(huán)中的表達式
  8. 其他題目見到了再總結(jié)出來

2.Android

  • Android 四個組件

1)Activity:活動
1.生命周期
<pre><code>
onCreate() //1 創(chuàng)建activity
onStart() //2 啟動activity
onResume() //3 可見
onPause() //4 可見
onStop() //5 停止
onDestory() //6 銷毀
onRestart() //7 stop()->onRestart()再次onStart()
</code></pre>

Activity生命周期

2.context
Activity Context上下文,生命周期與activity一致,兩者共存亡,用于加載獲取資源,而Application Context 生命周期與整個應(yīng)用一致,頻繁的使用App-Context 容易造成OOM。
3.注冊方式
在AndroidManifest.xml 中進行注冊
<pre><code>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.com.xxx" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
</activity>
</application>
</manifest>
</code></pre>
2)Service:服務(wù)
1.生命周期
其生命周期與其啟動方式密不可分。startService()和bindService() 啟動方式,start 方式:其生命周期與應(yīng)用無關(guān),bind 方式:則是與應(yīng)用共存亡。

Service生命周期

2.與其他組件交互方式
與Activity 通信:binder方式,handlerMessage方式,AIDL方式,static方式
3)BroadcastReceiver:廣播
用于異步接收廣播Intent,便于各應(yīng)用/組件進行交互。
基本屬性
<pre><code>
1.繼承BroadcastReceiver 實現(xiàn) onReceive 方法
2.指定 action 一種是manifast文件中設(shè)置,一直是intent 設(shè)置
3.注冊
</code></pre>
注冊兩種方式
<pre><code>
1.AndroidManifest.xml 中靜態(tài)注冊
在應(yīng)用推出之后依然可以接受到廣播消息,造成耗電量,cpu等損耗。
2.代碼中 intent.registerReceiver(自定義的Receiver,filter);
這種方式,隨著注冊的方式,以及靈動性。應(yīng)用退出,
必須進行unregisterReceiver(自定義的Receiver) 取消綁定
</code></pre>
4)ContentProvider:內(nèi)容提供器
維護應(yīng)用數(shù)據(jù),方便應(yīng)用本身或其它應(yīng)用訪問

  • Handler機制

在為了避免Android ANR (Application Not Response 超過5s ,未響應(yīng)), 一般出現(xiàn)網(wǎng)絡(luò)請求或者加載大量數(shù)據(jù)的時候,都會開啟子線程,去完成這些任務(wù),UI線程繼續(xù)加載view,接受用戶操作。 等待(子線程)網(wǎng)絡(luò)請求結(jié)束,這時候需要進行對UI線程通信,進行頁面刷新,于是就需要用到handler。
1.首先闡述一下handler 機制:Thread,Looper,MessageQueue
Looper 為一個循環(huán),接收handler 發(fā)送的message,然后放到MessageQueue中, 等待條件(線程結(jié)束),handler 再通過looper從messageQueue中取出message ,處理對應(yīng)的handler 刷新UI線程。

  1. 創(chuàng)建方式
    <pre><code>
    //創(chuàng)建
    Handler handler=new Handler(){
    public void handlerMessage(Message msg){
    //code
    }
    };
    //發(fā)送消息,方式1 ,此方式性能上來說比方式2要高效,
    //原因是由于此方式從Message池獲取message 對象,避免了重復(fù)分配新對象
    Message msg=handler.obtainMessage();
    msg.what=1;
    msg.obj=xxx;
    msg.sendToTarget();
    //發(fā)送消息,方式2
    Message msg=new Message();
    msg.what=1;
    msg.obj=xxx;
    handler.sendMessage(msg);
    </code></pre>
  • AsyncTask 機制

其實這也是一種異步加載的方式,由于在之前的項目中使用不是太多,具體了解不是很夠。然后應(yīng)用asyncTask必須記住幾條準(zhǔn)則
<pre><code>
1.Task的實例必須在UI thread中創(chuàng)建;
2.execute方法必須在UI thread中調(diào)用;
3.不要手動的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法;
4.該task只能被執(zhí)行一次,否則多次調(diào)用時將會出現(xiàn)異常;
</code></pre>代碼實現(xiàn)
<pre><code>
public class MyAsyncTask extends AsyncTask{
@override
onPreExecute(){
//操作前
}
@override
onPostExecute(){
//再次刷新UI
}
@override
doinBackground(){
//后臺代碼執(zhí)行
}
@override
onProgressUpdate(){
//進度更新
}
@override
onCancelled(){
//用戶取消操作
}
}
//UI thread
MyAsyncTask task=new MyAsyncTask();
task.execute();
</code></pre>

  • 數(shù)據(jù)存儲

1)輕量級數(shù)據(jù)庫sqlite
1.創(chuàng)建數(shù)據(jù)庫
<pre><code>
public class MYSQLiteHelper extends SQLiteOpenHelper {
//構(gòu)造函數(shù) parm:context
@override
onCreate() //創(chuàng)建
@override
onUpgrade() //更新版本
}
//調(diào)用數(shù)據(jù)庫
MYSQLiteHelper helper=new MYSQLiteHelper(this)
SQLiteDatabase db=helper.getWritableDatabase();//可寫
//操作數(shù)據(jù)庫,有很多封裝好的方法,可以調(diào)用這里就不一一說明
String sql="sql語句";
db.execSQL(sql);
</code></pre>
2.曾經(jīng)使用XUtils 工具類中對object 完成ORM 印射到數(shù)據(jù)庫,使用效率,操作都是很方便的,不凡拿來試用一下。
2)SharedPreference
這個簡單的存儲<code>用戶設(shè)置級</code>數(shù)據(jù)。
3)File
1.內(nèi)存卡
2.外置SD卡

  • 網(wǎng)絡(luò)請求

網(wǎng)絡(luò)請求在應(yīng)用中是一塊很重要的組成部分。
1)com.net.HttpConnection
//post方式, get方式
<pre><code>
public void httpRequestWithPost(URL url){
//1 打開鏈接,接下來可以寫一下簡單的屬性設(shè)置
httpConnection=url.openConnection();
httConnection.setRequestMethod("Post");//默認為get
//2 建立鏈接
httpConnection.connect();
//3 發(fā)送請求,記得關(guān)閉數(shù)據(jù)流
DataOutputStream dos = new DataOutputStream(httpConnection.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
//4 數(shù)據(jù)處理
httpConnection.getResponseCode ==200 {
//code 處理獲取流
}
}
</code></pre>

2)org.apache.http.HttpPost/HttpGet
1.HttpPost
<pre><code>
HttpPost post=new HttpPost(url);
//添加參數(shù)
List<NameValuePair> params =newArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "helloworld"));
//設(shè)置字符集
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
//設(shè)置參數(shù)實體
httpPost.setEntity(entity);
//獲取HttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 獲取HttpResponse實例
HttpResponse httpResp = httpClient.execute(httpPost);
//最后進行判斷 code==200 處理數(shù)據(jù)
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
</code></pre>
2.HttpGet
<pre><code>
HttpGet httpGet = new HttpGet(url);
// 獲取HttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 獲取HttpResponse實例
HttpResponse httpResp = httpClient.execute(httpGet);
// 判斷是夠請求成功
if(httpResp.getStatusLine().getStatusCode() == HTTP_200)
{
//獲取返回數(shù)據(jù)
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
}
</code></pre>

  1. 其他網(wǎng)絡(luò)請求方式
    1.其實用得最多的就是Google 出得第三方Volley,原因是由于項目中經(jīng)常用到j(luò)son 數(shù)據(jù)格式,volley 封裝的很好,針對請求線程處理封裝,回調(diào)很不錯,我也將其封裝到自己的框架中作為網(wǎng)絡(luò)處理模塊的utils。
    2.ImageLoader 用于加載圖片的一個工具類,其實功能上還是很強大的。但是由于之前的項目中加載多張圖片,出現(xiàn)閃爍的情況。所以決定放棄使用這個第三方,最后還是用Volley加載圖片的方式進行解決。
    3.當(dāng)然還有一些處理FTP 網(wǎng)絡(luò)請求的。具體不記得了。
  • 數(shù)字簽名

之所以寫這個問題,是因為在平時發(fā)布apk 的時候,是需要一個簽名,但是并沒有研究這個簽名,在android系統(tǒng)中的作用和幾個要點。
1)所有應(yīng)用都需要數(shù)字證書,android系統(tǒng)不會接受一個沒有數(shù)字證書的應(yīng)用
2)Android 程序包有自帶的數(shù)字簽名,不需要一個有權(quán)威的認證機構(gòu)
3)發(fā)布android需要一個合適的私鑰來生成數(shù)字簽名,不能利用打ant等插件進行發(fā)布
4)數(shù)字簽名的有效期,android系統(tǒng)只會在安裝應(yīng)用的時候,檢查數(shù)字簽名的有效期,當(dāng)安裝之后,應(yīng)用到期依然可以在系統(tǒng)中使用。

  • Activity 啟動4 種方式

之所以出來總結(jié)一下這幾個點,是因為在平時做項目中要用到。在注冊activity 時候,需要在AndroidManifast.xml去配置 android:lanuchMode="xxx"

  1. Standared 模式,也是默認模式。一旦activity被創(chuàng)建都會進入到工作棧中。
  2. SingleTop模式,需要判斷當(dāng)前activity 是否到棧頂,如果在則不需要重新產(chǎn)生實例,不在則重新創(chuàng)建實例。
  3. SingleTask模式,這個模式相當(dāng)霸道,如果本身存在在工作棧中,則將其他處于他之上的activity 全部移除,使自己處于棧頂,沒有存在工作棧中,則重新創(chuàng)建,push 到棧頂。
    4)SingleInstance模式,保證工作棧中只有一個實例存在,在調(diào)用時會移動到棧頂。
  • XML布局中常見模糊的屬性
  1. magin 和padding 的區(qū)別
    <pre><code>
    Padding 為內(nèi)邊框,指該控件內(nèi)部內(nèi)容,如文本/圖片距離該控件的邊距
    Margin 為外邊框,指該控件距離邊父控件的邊距
    </code></pre>
  2. ListView item 分割線
    <pre><code>
    android:divider="#fffff" 分割線顏色 value="@null" 為去掉分割線
    android:dividerHeight="1px" 分割線高度
    </code></pre>
  3. ImageView 中的android:scaleType 屬性
    <pre><code>
    CENTER:超過布局,圖片裁剪中心,填充布局。
    CENTER_CROP:按比例放大,填充整個布局居中顯示。
    CENTER_INSIDE:按比例縮小,內(nèi)容完全顯示。
    FIT_CENTER:把圖片按比例擴大/縮小到View的寬度,居中顯示
    FIT_XY:不按比例縮放,顯示填充整個布局。
    </code></pre>
  • Android 推送

之前項目中也是用到推送(極光推送),推送有兩種方式.

  1. pull 方式:客戶端輪詢發(fā)送請求,檢查服務(wù)器數(shù)據(jù)是否更新從而實現(xiàn)推送的效果,這種方式由于客戶端進行輪詢,所以耗資源,電量,流量都很多,但是這個方式,實現(xiàn)起來相對簡單。
  2. push方式:服務(wù)器進行推送數(shù)據(jù),基于tcp 長連接的方式,客戶端利用AlarmManager 進行定時發(fā)送心跳包,來維持與服務(wù)器的連接。
  • 常見Android 異常,及其優(yōu)化

經(jīng)過兩年多的android開發(fā),大大小小的異常以及bug,見過很多.

  1. 忘記在AndroidManifest.xml 中 注冊activity, service,user-permission 等
  2. 生命周期應(yīng)用不準(zhǔn)確,導(dǎo)致activity 或者service 銷毀,出現(xiàn)處理異常
  3. 多線程處理數(shù)據(jù)的時候,造成數(shù)據(jù)紊亂。
  4. 未獲取view 的id, 使用view 造成空指針錯誤
  5. listview 加載數(shù)據(jù)的時候出現(xiàn)錯位
  6. 控件焦點問題
  7. 手勢沖突
  8. 圖片處理,緩存
  9. Touch 事件傳遞
  10. handler 可能造成內(nèi)存溢出
    實在太多,具體情況,還需要在項目中進行總結(jié)。

3.數(shù)據(jù)結(jié)構(gòu)和算法

  • 常見排序算法

其實,幾種基本的算法,在平時項目中并沒有使用,經(jīng)常是使用系統(tǒng)封裝好的一些類,來進行操作,如果不去參考源碼,根本不知道里面的原委,也不了解這幾種常見的排序算法,所存在的作用。

  1. 快速排序
  2. 選擇排序
  3. 插入排序
  4. 冒泡排序
  5. 希爾排序
  6. 堆排序
  • 鏈表
  • 數(shù)組
  • 隊列
  • 哈希

4.Linux

5.計算機網(wǎng)絡(luò)

  • IP協(xié)議

生活中,經(jīng)常聽到ip 地址這個概念。這個屬于網(wǎng)絡(luò)層的協(xié)議,那么IP分為哪幾類呢,也是常考選擇題之一。

  1. A 類
    <pre><code>
    地址范圍 1.0.0.1-126.255.255.254
    </code></pre>2) B 類
    <pre><code>
    地址范圍 128.1.0.1-191.254.255.254
    </code></pre>3) C 類
    <pre><code>
    地址范圍 192.0.1.1-223.255.255.254
    </code></pre>4) D 類
    <pre><code>
    地址范圍 224.0.0.1-239.255.255.254
    </code></pre>5) E 類
    <pre><code>
    E類地址保留,僅作實驗和開發(fā)用
    </code></pre>
  • TCP/UDP協(xié)議

還記得第一次聽到這兩個概念,還是在大三的計算機網(wǎng)絡(luò)的課程上,然而并沒有在意,以至于在大三騰訊實習(xí)生,面試官問到這個問題,表達的一塌糊涂。

  1. TCP
    TCP 屬于計算機網(wǎng)絡(luò)結(jié)構(gòu)中的傳輸層,"三次握手"的基于連接方式,需要消耗的系統(tǒng)資源要求要多一些。
  2. UDP
    UDP 同樣屬于傳輸層,基于無連接的方式,傳遞數(shù)據(jù),以不靠譜的狀態(tài),不保證數(shù)據(jù)的完整,消耗著系統(tǒng)較少的資源。
  • Http協(xié)議
  1. Http超文本傳輸協(xié)議
    在網(wǎng)絡(luò)傳輸過程當(dāng)中,我們用得最多便是http 協(xié)議,如今許多公司已經(jīng)開始支持https,但是我們不由的還是會選擇http,一直也是面試官常常提到的一些問題所在,所以來談?wù)勥@個http協(xié)議。
    http請求體
    <pre><code>
    //請求行
    Method URL Version{
    Method:GET,POST,DELETE,PUT,HEAD 等
    URL:請求的url
    Version:http 的版本(目前1.1)
    }
    //請求頭
    Headers{
    Accept-Language: 語言
    Accept-Charset: 支持字符編碼
    Accept: 請求類型(image/txt等)
    Accept-Encoding: 瀏覽器支持的壓縮類型  
    User-Agent: 代理(瀏覽器等)  
    Host: 域名  
    Connection: Keep-Alive(持久鏈接)
    }
    //請求體
    Message Body{
    //發(fā)送的一些請求數(shù)據(jù)
    }
    </code></pre>
    http響應(yīng)體
    <pre><code>
    //狀態(tài)行
    Version Status-Code Description{
    version:http的版本(1.1)
    Status-Code:響應(yīng)狀態(tài)碼{
    常見:200(請求成功),500(服務(wù)器錯誤),404(文件不存在)
    1xx:
    2xx:
    3xx:
    4xx:
    5xx:
    }
    Description{
    描述
    }
    }
    //消息報頭{
    Date:
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 122
    .
    }
    //響應(yīng)正文
    MessageBody{
    一些xml格式,或者json格式
    }
    </code></pre>
  • Get和Post 區(qū)別
  1. GET 方式:在剛剛進入到it 界的時候,那時,只會get 方式,也只會將參數(shù)放在url 上面進行傳遞,后面發(fā)現(xiàn)參數(shù)過多,get方式(MAX=2048個字符,雖然這個數(shù)字網(wǎng)上大部分這么說,但是不能保證,必須自己求情服務(wù)器的時候去測一測)無法滿足需求的時候,才研究到了post(人呆板),當(dāng)然get 也可以在http 種的cookie 中進行傳參。
    <pre><code>
    host:port/test/test.do?name1=value1&name2=value2</code></pre>
  2. POST 方式:直觀上講,post 方式,是將參數(shù)內(nèi)容,放到了http 請求體的body 里面,這樣來說參數(shù)內(nèi)容并沒有保留在瀏覽器的請求鏈接上,從安全性來講是略勝一籌。然后無論是post 多少參數(shù)都可以,是沒有參數(shù)大小限制。
    <pre><code>
    POST /test/test.do
    HTTP/1.1
    Host: xxx.xxx.xxx.xx
    data={
    json 串
    }
    </code></pre>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,234評論 1 114
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,818評論 11 349
  • 是的,我把名字又改回來了。 如往常一樣,原本七點下班終會因為各種原因拖上二十到三十分鐘才從公司慢騰騰的走出。上了電...
    一一慢知閱讀 206評論 0 0

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