1. 程式人生 > >java面試-筆試題總結

java面試-筆試題總結

一、java和框架

-4.菱形的列印

/**
 * Created by david on 2018/8/28
 * 列印菱形
 */
public class Test1 {
    public static void main(String[] args) {
        int line = 5;
        //上三角
        //控制行
        for (int i = 1;i<=line;i++){
            //控制空格
            for (int j = 1;j<=line-i;j++){
                System.out.print(" ");
            }
            //控制*
            for (int k = 0;k<2*i - 1;k++){
                System.out.print("*");
            }
            System.out.println();
        }
        int num = 2*line -3;
        //下三角
        for (int i = num;i>=1;i-=2){
            for (int k = (num-i)/2;k>=0;k--){
                System.out.print(" ");
            }
            for (int j = i;j>=1;j--){
                System.out.print("*");
            }
            if (i!=1) {
                System.out.println();
            }
        }
    }

}

-3.一致性Hash演算法

-2.Java面試整理之JVM

-1.事務的隔離級別和傳播行為

0.類載入器

 

1.抽象類和介面的區別

什麼時候使用抽象類和介面

  • 如果你擁有一些方法並且想讓它們中的一些有預設實現,那麼使用抽象類吧。
  • 如果你想實現多重繼承,那麼你必須使用介面。由於Java不支援多繼承,子類不能夠繼承多個類,但可以實現多個介面。因此你就可以使用介面來解決它。
  • 如果基本功能在不斷改變,那麼就需要使用抽象類。如果不斷改變基本功能並且使用介面,那麼就需要改變所有實現了該介面的類。

2.Java的基本資料型別

1)四種整數型別(byte、short、int、long):    byte:8 位,用於表示最小資料單位,如檔案中資料,-128~127    short:16 位,很少用,-32768 ~ 32767    int:32 位、最常用,-2^31-1~2^31  (21 億)    long:64 位、次常用    注意事項:    int i=5; // 5 叫直接量(或字面量),即 直接寫出的常數。    整數字面量預設都為 int 型別,所以在定義的 long 型資料後面加 L或 l。    小於 32 位數的變數,都按 int 結果計算。    強轉符比數學運算子優先順序高。見常量與變數中的例子。

2)兩種浮點數型別(float、double):    float:32 位,字尾 F 或 f,1 位符號位,8 位指數,23 位有效尾數。    double:64 位,最常用,字尾 D 或 d,1 位符號位,11 位指數,52 位有效尾    注意事項:    二 進 制 浮 點 數 : 1010100010=101010001.0*2=10101000.10*2^10(2次方)=1010100.010*2^11(3次方)= . 1010100010*2^1010(10次方)    尾數:  . 1010100010   指數:1010   基數:2    浮點數字面量預設都為 double 型別,所以在定義的 float 型資料後面加F 或 f;double 型別可不寫字尾,但在小數計算中一定要寫 D 或 X.X    float  的精度沒有 long 高,有效位數(尾數)短。    float  的範圍大於 long  指數可以很大。    浮點數是不精確的,不能對浮點數進行精確比較。

3)一種字元型別(char):    char:16 位,是整數型別,用單引號括起來的 1 個字元(可以是一箇中文字元),使用 Unicode 碼代表字元,0~2^16-1(65535) 。    注意事項:    不能為 0個字元。    轉義字元:\n  換行  \r  回車  \t Tab 字元  \" 雙引號  \\ 表示一個\    兩字元 char 中間用“+”連線,內部先把字元轉成 int 型別,再進行加法運算,char 本質就是個數!二進位制的,顯示的時候,經過“處理”顯示為字元。

4)一種布林型別(boolean):true 真  和 false 假。

5)型別轉換:       char-->    自動轉換:byte-->short-->int-->long-->float-->double                   強制轉換:①會損失精度,產生誤差,小數點以後的數字全部捨棄。②容易超過取值範圍。

6)記憶:8位:Byte(位元組型)          16位:short(短整型)、char(字元型)          32位:int(整型)、float(單精度型/浮點型)          64位:long(長整型)、double(雙精度型)          最後一個:boolean(布林型別)

3.反射

AVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。

要想解剖一個類,必須先要獲取到該類的位元組碼檔案物件。而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼檔案對應的Class型別的物件。

獲取Class物件的三種方式

3.1 Object ——> getClass();
3.2 任何資料型別(包括基本資料型別)都有一個“靜態”的class屬性
3.3 通過Class類的靜態方法:forName(String  className)(常用)

所有公有構造方法

Constructor[] conArray = clazz.getConstructors();

所有的構造方法(包括:私有、受保護、預設、公有)

conArray = clazz.getDeclaredConstructors();

獲取公有、無參的構造方法

Constructor con = clazz.getConstructor(null);

獲取私有構造方法,並呼叫

con = clazz.getDeclaredConstructor(char.class);

//呼叫構造方法

con.setAccessible(true);//暴力訪問(忽略掉訪問修飾符)

m = stuClass.getDeclaredMethod("show4", int.class);//呼叫制定方法(所有包括私有的),需要傳入兩個引數,第一個是呼叫的方法名稱,第二個是方法的形參型別,切記是型別。
System.out.println(m);
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj, 20);//需要兩個引數,一個是要呼叫的物件(獲取有反射),一個是實參

4.網路七層協議的通俗理解

5.Java實現多執行緒的兩種方法

5.1繼承Thread類實現多執行緒

繼承Thread類的方法儘管被我列為一種多執行緒實現方式,但Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項,並且,啟動執行緒的唯一方法就是通過Thread類的start()例項方法。start()方法是一個native方法,它將啟動一個新執行緒,並執行run()方法。這種方式實現多執行緒很簡單,通過自己的類直接extend Thread,並複寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。

5.2實現Runnable介面方式實現多執行緒

public class MyThread extends OtherClass implements Runnable {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
}  

6.解釋程式開發中的同步和非同步的概念

一、程序同步與非同步執行

1.程序同步

    就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。最常見的例子就是sendmessage。該函式傳送一個訊息給某個視窗,在對方處理完訊息之前,這個函式不返回。當對方處理完畢以後,該函式才把訊息處理函式所返回的lresult值返回給呼叫者。

2.程序非同步

    當一個非同步過程呼叫發出後,呼叫者不需要等待得到結果,接著繼續往下執行。實際處理這個呼叫的部件在完成後,通過狀態、通知和回撥來通知呼叫者。

以casycsocket類為例(注意,csocket從casyncsocket派生,但是其功能已經由非同步轉化為同步),當一個客戶端通過呼叫connect函式發出一個連線請求後,呼叫者執行緒立刻可以朝下執行。當連線真正建立起來以後,socket底層會發送一個訊息通知該物件。

二、同步阻塞與非同步阻塞:

同步是阻塞模式,非同步是非阻塞模式。 

同步:傳送方發出資料後,等接收方發回響應以後才發下一個數據包的通訊方式。 

非同步:傳送方發出資料後,不等接收方發回響應,接著傳送下個數據包的通訊方式。

7.如何實現單例模式,單例模式的幾種寫法

基本的實現思路

單例模式要求類能夠有返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必須是靜態方法,通常使用getInstance這個名稱)。

單例的實現主要是通過以下兩個步驟:

  1. 將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;
  2. 在該類內提供一個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

注意事項

單例模式在多執行緒的應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了一個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供一個互斥鎖(雖然這樣會降低效率)。

7.1靜態內部類

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

7.2列舉 

public enum Singleton {
    INSTANCE;
    public void whateverMethod() {

    }
}

7.3雙重檢查

Double-Check概念對於多執行緒開發者來說不會陌生,如程式碼中所示,我們進行了兩次if (singleton == null)檢查,這樣就可以保證執行緒安全了。這樣,例項化程式碼只用執行一次,後面再次訪問時,判斷if (singleton == null),直接return例項化物件

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

8.類的序列化和反序列化

把物件轉換為位元組序列的過程稱為物件的序列化
把位元組序列恢復為物件的過程稱為物件的反序列化
  物件的序列化主要有兩種用途:
  1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;
  2) 在網路上傳送物件的位元組序列。

JDK類庫中的序列化API

  java.io.ObjectOutputStream代表物件輸出流,它的writeObject(Object obj)方法可對引數指定的obj物件進行序列化,把得到的位元組序列寫到一個目標輸出流中。
  java.io.ObjectInputStream代表物件輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個物件,並將其返回。
  只有實現了Serializable和Externalizable介面的類的物件才能被序列化。Externalizable介面繼承自 Serializable介面,實現Externalizable介面的類完全由自身來控制序列化的行為,而僅實現Serializable介面的類可以 採用預設的序列化方式 。
  物件序列化包括如下步驟:
  1) 建立一個物件輸出流,它可以包裝一個其他型別的目標輸出流,如檔案輸出流;
  2) 通過物件輸出流的writeObject()方法寫物件。

  物件反序列化的步驟如下:
  1) 建立一個物件輸入流,它可以包裝一個其他型別的源輸入流,如檔案輸入流;
  2) 通過物件輸入流的readObject()方法讀取物件。

物件序列化和反序列範例:

  定義一個Person類,實現Serializable介面

9.記憶體洩漏的原因

詳解

Java記憶體洩漏的根本原因是什麼呢?長生命週期的物件持有短生命週期物件的引用就很可能發生記憶體洩漏,儘管短生命週期物件已經不再需要,但是因為長生命週期持有它的引用而導致不能被回收,這就是Java中記憶體洩漏的發生場景

1、靜態集合類引起記憶體洩漏:

像HashMap、Vector等的使用最容易出現記憶體洩露,這些靜態變數的生命週期和應用程式一致,他們所引用的所有的物件Object也不能被釋放,因為他們也將一直被Vector等引用著。

2、當集合裡面的物件屬性被修改後,再呼叫remove()方法時不起作用。

3、監聽器

在java 程式設計中,我們都需要和監聽器打交道,通常一個應用當中會用到很多監聽器,我們會呼叫一個控制元件的諸如addXXXListener()等方法來增加監聽器,但往往在釋放物件的時候卻沒有記住去刪除這些監聽器,從而增加了記憶體洩漏的機會。

4、各種連線

比如資料庫連線(dataSourse.getConnection()),網路連線(socket)和io連線,除非其顯式的呼叫了其close()方法將其連線關閉,否則是不會自動被GC 回收的。對於Resultset 和Statement 物件可以不進行顯式回收,但Connection 一定要顯式回收,因為Connection 在任何時候都無法自動回收,而Connection一旦回收,Resultset 和Statement 物件就會立即為NULL。但是如果使用連線池,情況就不一樣了,除了要顯式地關閉連線,還必須顯式地關閉Resultset Statement 物件(關閉其中一個,另外一個也會關閉),否則就會造成大量的Statement 物件無法釋放,從而引起記憶體洩漏。這種情況下一般都會在try裡面去的連線,在finally裡面釋放連線。

5、內部類和外部模組的引用

內部類的引用是比較容易遺忘的一種,而且一旦沒釋放可能導致一系列的後繼類物件沒有釋放。此外程式設計師還要小心外部模組不經意的引用,例如程式設計師A 負責A 模組,呼叫了B 模組的一個方法如:

public void registerMsg(Object b);

這種呼叫就要非常小心了,傳入了一個物件,很可能模組B就保持了對該物件的引用,這時候就需要注意模組B 是否提供相應的操作去除引用。

6、單例模式

不正確使用單例模式是引起記憶體洩漏的一個常見問題,單例物件在初始化後將在JVM的整個生命週期中存在(以靜態變數的方式),如果單例物件持有外部的引用,那麼這個物件將不能被JVM正常回收,導致記憶體洩漏。

10.Bean建立物件的2種方法

在spring中有三中例項化bean的方式:

一、使用構造器例項化;(90%通常使用的一個方法)

二、使用靜態工廠方法例項化;

三、使用例項化工廠方法例項化。

詳解

11.Socket程式設計

1、Socket通訊的步驟

                 ① 建立ServerSocket和Socket

                 ② 開啟連線到Socket的輸入/輸出流

                 ③ 按照協議對Socket進行讀/寫操作

                 ④ 關閉輸入輸出流、關閉Socket

2、伺服器端:

                 ① 建立ServerSocket物件,繫結監聽埠

                 ② 通過accept()方法監聽客戶端請求

                 ③ 連線建立後,通過輸入流讀取客戶端傳送的請求資訊

                 ④ 通過輸出流向客戶端傳送資訊

                 ⑤ 關閉相關資源

3.客戶端:

                 ① 建立Socket物件,指明需要連線的伺服器的地址和埠號

                 ② 連線建立後,通過輸出流向伺服器端傳送請求資訊

                 ③ 通過輸入流獲取伺服器響應的資訊

                 ④ 關閉響應資源 

4.應用多執行緒實現伺服器與多客戶端之間的通訊

               ① 伺服器端建立ServerSocket,迴圈呼叫accept()等待客戶端連線

               ② 客戶端建立一個socket並請求和伺服器端連線

               ③ 伺服器端接受請求,建立socket與該客戶建立專線連線

               ④ 建立連線的兩個socket在一個單獨的執行緒上對話

               ⑤ 伺服器端繼續等待新的連線 

12.hashTable和hashMap的區別

HashMap和Hashtable都實現了Map介面,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:執行緒安全性,同步(synchronization),以及速度。

HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。 HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是執行緒安全的,多個執行緒可以共享一個Hashtable;而如果沒有正確的同步的話,多個執行緒是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充套件性更好。 另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會丟擲ConcurrentModificationException異常。但這並不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。 由於Hashtable是執行緒安全的也是synchronized,所以在單執行緒環境下它比HashMap要慢。如果你不需要同步,只需要單一執行緒,那麼使用HashMap效能要好過Hashtable。 HashMap不能保證隨著時間的推移Map中的元素次序是不變的。

13.集合型別

一、集合類

    定義:一種為了對多個物件進行操作而進行儲存的方式。
    1、與陣列的區別: 
      陣列:可以儲存物件,也可以儲存基本資料型別,但是一次只能儲存一種型別,陣列長度固定。
      集合:只能儲存物件,長度可變,可以儲存不同型別的物件。
    集合眾多的原因:每一種容器對資料的儲存方式都有所不同,這個儲存方式為:資料結構。
詳解

14.死鎖

執行緒死鎖是指由於兩個或者多個執行緒互相持有對方所需要的資源,導致這些執行緒處於等待狀態,無法前往執行。當執行緒進入物件的synchronized程式碼塊時,便佔有了資源,直到它退出該程式碼塊或者呼叫wait方法,才釋放資源,在此期間,其他執行緒將不能進入該程式碼塊。當執行緒互相持有對方所需要的資源時,會互相等待對方釋放資源,如果執行緒都不主動釋放所佔有的資源,將產生死鎖。

當然死鎖的產生是必須要滿足一些特定條件的: 
1.互斥條件:程序對於所分配到的資源具有排它性,即一個資源只能被一個程序佔用,直到被該程序釋放 
2.請求和保持條件:一個程序因請求被佔用資源而發生阻塞時,對已獲得的資源保持不放。 
3.不剝奪條件:任何一個資源在沒被該程序釋放之前,任何其他程序都無法對他剝奪佔用 
4.迴圈等待條件:當發生死鎖時,所等待的程序必定會形成一個環路(類似於死迴圈),造成永久阻塞。

15.安全型別

1.跨站指令碼(XSS)
  XSS又叫CSS(CROSS SET SCRIPT),跨站指令碼攻擊。它指的是惡意攻擊者往WEB頁面裡插入惡意的html程式碼,當用戶瀏覽該頁面時,嵌入其中的html程式碼會被執行,從而達到惡意使用者的特殊目的;(釣魚、盜取cookie、操縱受害者的瀏覽器、蠕蟲攻擊)。
2.反射型跨站(Reflected XSS)
  伺服器端獲取http請求中的引數,未經過濾直接輸出到客戶端。如果這些引數是指令碼,它將在客戶端執行(釣魚常見)。
3.儲存型跨站(Stored XSS)
  使用者輸入的資料存在伺服器端(一般存在資料庫中),其他使用者訪問某個頁面時,這些資料未經過濾直接輸出。這些資料可能是惡意的指令碼,對其他使用者造成危害。(掛馬常見)
  在允許上傳檔案的應用中,攻擊者上傳一個包含惡意程式碼的html或者txt檔案,使用者瀏覽這些檔案執行惡意程式碼;
  一般的應用中上傳圖片最普遍,如果圖片中包含惡意程式碼的html或者txt檔案,,低版的IE直接請求這個圖片時,將忽略Content-Type執行圖片中的程式碼。
4.DOM跨站(DOM-Based XSS)
  攻擊者構造一個包含惡意Javascript的URL,然後引誘使用者請求這個URL。伺服器收到請求後沒有返回惡意的Javascript。
  瀏覽器在處理URL中的資料時,執行惡意程式碼。
5.跨站請求偽造(CSRF)
  強迫受害者的瀏覽器向一個易受攻擊的Web應用程式傳送請求,最後達到攻擊者所需要的操作行為。
  惡意請求會帶上瀏覽器的Cookie。受攻擊的Web應用信任瀏覽器的Cookie。
6.SQL注入
  使用者輸入的資料未經驗證就用來構造SQL
  查詢語句,查詢資料庫中的敏感內容,繞過認證新增、刪除、修改資料、拒絕服務。
7.XML注入
  和SQL注入原理一樣,XML是儲存資料的地方,如果在查詢或修改時,如果沒有做轉義,直接輸入或輸出資料,都將導致XML注入漏洞。攻擊者可以修改XML資料格式,增加新的XML節點,對資料處理流程產生影響。

8.URL跳轉
  Web應用程式接收到使用者提交的URL引數後,沒有對引數做”可信任URL”的驗證,就向用戶瀏覽器返回跳轉到該URL的指令。(釣魚攻擊)

9.檔案系統跨越
  檔案系統中../代表上級目錄,通過一個或多個../跨越目錄限制。

10.系統命令
  使用者提交的引數用於執行系統命令的引數。
  使用”|”或”;”執行多條命令。

11.檔案上傳
  Web應用程式在處理使用者上傳的檔案時,沒有判斷檔案的副檔名是否在允許的範圍內,或者沒檢測檔案內容的合法性,就把檔案儲存在伺服器上,甚至上傳指令碼木馬到web伺服器上,直接控制web伺服器。(未限制副檔名、未檢查檔案內容、病毒檔案)

12.任意檔案下載
  下載附件等功能
  Apache虛擬目錄指向
  Java/PHP讀取檔案
  下載資料庫配置檔案等
  目錄瀏覽

13.許可權控制
  有沒有許可權
  有些系統不需要許可權控制
  有沒有設定許可權
  有了強大的許可權系統,但是沒有使用
  有沒有偷工減料許可權
  URL級別
  選單級別

14.訪問控制
  水平許可權
  Web應用程式接收到使用者請求,修改某條資料時,沒有判斷資料的所屬人,或判斷資料所屬人時,從使用者提交的request引數(使用者可控資料)中,獲取了資料所屬人id,導致惡意攻擊者可以通過變換資料ID,或變換所屬人id,修改不屬於自己的資料。
  垂直許可權
  由於web應用程式沒有做許可權控制,或僅僅在選單上做了許可權控制,導致的惡意使用者只要猜測其他管理頁面的URL,就可以訪問或控制其他角色擁有的資料或頁面,達到許可權提升目的。

15.Session Expires
  會話過期
  瀏覽器過期
  伺服器30分鐘無動作過期
  伺服器24小時強制過期
  保持會話

二、程式設計演算法

1.快排

2.判斷迴文字串

解決上述問題,有兩種方法可供參考:

(1)從字串兩頭往中間掃;

(2)從字串中間往兩頭掃。

package com.liuzhen.string_1;

import java.util.Scanner;

public class StringPalindrome {
    //方法1:兩頭往中間掃
    public boolean IsPalindrome1(String A){
        char[] arrayA = A.toCharArray();
        int top = 0;
        int end = arrayA.length-1;
        if(A.equals("") || A.equals(null))    //非法輸入
            return false;
        while(top < end){
            if(arrayA[top++] != arrayA[end--])
                return false;
        }
        return true;
    }
    
    //方法2:中間往兩頭掃
    public boolean IsPalindrome2(String A){
        char[] arrayA = A.toCharArray();
        int lenA = arrayA.length;
        int mid = lenA/2;
        int front;         //前半部分
        int back;          //後半部分
        if(lenA % 2 == 0){   //當字串長度為偶數時
            front = mid-1;
            back = mid;
        }
        else{
            front = mid -1;
            back = mid + 1;
        }
        if(A.equals("") || A.equals(null))
            return false;
        while(front >= 0 && back < lenA){
            if(arrayA[front--] != arrayA[back++])
                return false;
        }
        return true;
    }
    
    public static void main(String[] args){
        StringPalindrome test = new StringPalindrome();
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入一個字串:");
        String A = in.nextLine();
        if(test.IsPalindrome1(A))
            System.out.println("使用方法1判斷結果為,輸入字串是迴文字串");
        else
            System.out.println("使用方法1判斷結果為,輸入字串不是迴文字串");
        if(test.IsPalindrome2(A))
            System.out.println("使用方法2判斷結果為,輸入字串是迴文字串");
        else
            System.out.println("使用方法2判斷結果為,輸入字串不是迴文字串");
    }
}

3.判斷素數

/**
     * 判斷一個數是不是素數:只能被1和本身整除
     * <p>
     * 說明:從2開始除,不需要到n,也就是迴圈條件是 < n 就可以,這之間只要被整除了,那麼他就不是素數了
     */
    private static boolean numberIsPrime(int n) {
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

三、Android

1.Android的四大元件

Android 開發的四大元件分別是:活動(activity),用於表現功能;服務(service),後臺執行服務,不提供介面呈現;廣播接受者(Broadcast Receive),勇於接收廣播;內容提供者(Content Provider),支援多個應用中儲存和讀取資料,相當於資料庫。

1.活動

Android中,activity是所有程式的根本,所有程式的流程都執行在activity之中,activity可以算是開發者遇到的最頻繁,也是android當中最基本的模組之一。在android的程式中,activity一般代表手機螢幕的一屏。如果把手機比作一個瀏覽器,那麼activity就相當於一個網頁。在activity當中可以新增一些Button、Checkbox等控制元件,可以看到activity概念和網頁的概念相當類似。

一般一個android應用是由多個activity組成的,這多個activity之間可以進行相互跳轉。例如,按下一個Button按鈕後,可能會跳轉到其他的activity,與網頁跳轉稍微有點不一樣的是,activity之間的跳轉有可能返回值。例如,從activity A跳轉到activity B,那麼當activity B執行結束時,有可能會給activity A一個返回值。這樣做在很多時候是相當方便的。

當開啟一個新的螢幕時,之前一個螢幕會被置為暫停狀態,並且壓入歷史堆疊中。使用者可以通過回退操作返回到以前開啟過的螢幕。可以選擇性的一處一些沒有必要保留的螢幕,因為Android會把每個應用的開始到當前的每個螢幕儲存在堆疊中。

2.服務

Service是android系統中的一種元件,跟activity的級別差不多,但是他不能自己執行,只能後臺執行,並且可以和其他元件進行互動。Service是沒有介面長生命週期的程式碼。Service是一種程式,可以執行很長時間的,但是卻沒有使用者介面。這麼說有點枯燥,來看個例子。開啟一個音樂播放器的程式,這時如果想上網,那麼開啟Android瀏覽器,這時雖然已經進入瀏覽器這個程式,但是歌曲播放並沒有停止,而是在後臺繼續一首接一首的播放,其實這個播放就是由播放音樂的Service進行控制。當然這個播放音樂的Service也可以停止。例如,當播放列表裡的歌曲都結束,或使用者按下了停止音樂播放的快捷鍵等。Service可以在很多場合的應用中使用,如播放多媒體時使用者啟動了其他Activity,這時程式要在後臺繼續播放,比如檢測SD卡上檔案的變化,或在後臺記錄地理資訊位置的改變等,而服務卻藏在後臺。

開啟Service有兩種方式:

(1)Context.starService():Service會經歷onCreat  ——>onStar(如果Service還沒有執行,則Android先呼叫onCreat(),然後呼叫onStar(),所以一個Service的onStar方能會重複呼叫多次);如果是呼叫者自己直接退出而沒有呼叫StopService,服務會一直在後臺執行。該服務的呼叫者再啟動起來後可以通過stopService關閉服務。注意,多次呼叫Context.starService()不會被巢狀(即使會有相應的onStar()方法被呼叫),所以無論同一個服務被啟動多少次,一旦呼叫Context.stopService()或者StopSelf(),都會被停止。

說明:傳遞給starService()的Intent物件會傳遞給onStar()方法。呼叫順序為onCreat——onStar(可呼叫多次)——onDestroy.

(2)Context.bindService():服務會經歷onCreate()——onBind(),onBind將返回給客戶端一個IBind介面例項,IBind允許客戶端回撥服務的方法,比如得到服務執行的狀態或其他操作。這個時候把呼叫者(Context,如Activity)會和服務繫結在一起,Context退出了,服務就會呼叫onUnbind——onDestroy相應退出,所謂繫結在一起就是“共存亡”了。

3.廣播接收器

在Android中,廣播是一種廣泛運用的在應用程式之間傳輸資訊的機制。而廣播接收器是對傳送出來的廣播進行過濾接受並響應的一類元件。可以使用廣播接收器來讓應用對一個外部時間做出響應。例如,當電話呼入這個外部事件到來時,可以利用廣播接收器進行處理。當下載一個程式成功完成時,仍然可以利用廣播接收器進行處理。廣播接收器不NotificationManager來通知使用者這些事情發生了。廣播接收器既可以在AndroidManifest.xml中註冊,也可以在執行時的程式碼中使用Context.registerReceive()進行註冊。只要是註冊了,當事件來臨時,即使程式沒有啟動,系統也在需要的時候啟動程式。各種應用還可以通過使用Context.sendBroadcast()將它們自己的Intent廣播給其他應用程式。

4.內容提供者

內容提供者(Content Provider)是Android提供的第三方應用資料的訪問方案。

在Android中,對資料的保護是很嚴密的,除了放在SD卡中的資料,一個應用所持有的資料庫、檔案等內容,都是不允許其他直接訪問的。Android當然不會真的把每一個應用都做成一座“孤島”,它為所有應用都準備可一扇窗,這就是Content Provider。應用想對外提供的資料,可以通過派生Content Provider類,封裝成一枚Content Provider。每個Content Provider都用一個uri作為獨立的標識,形如:content://com.xxxxx。所有應用看著像REST的樣子,但實際上它比REST更為靈活。和REST類似,uri也可以有兩種型別,一種是帶id的;另一種是列表的,但實現者不需要按照這個模式來做,給id的uri也可以返回列表型別的資料。

2.Acitvity狀態

Activity主要的四種狀態:

     Running(執行):在螢幕前臺(位於當前任務堆疊的頂部)

     Paused(暫停):失去焦點但仍然對使用者可見(覆蓋Activity可能是透明或未完全遮擋)

     Stopped(停止):完全被另一個Activity覆蓋

          Destroyed(銷燬):退出,完全銷燬

3.手機 測試

 

4.jmeter進行https協議的測試

5.一個web頁面操作響應過慢,如何定位原因

資料庫的訪問量

頁面資料太多了

執行大資料量的或比較費時的SQL操作

資料資源最好不要浪費,在傳值的時候最好能夠做一下處理

6.Jmeter進行效能測試時多臺負載機的配置方法

使用多臺機器產生負載的操作步驟如下:

(1)在所有期望執行jmeter作為 負載生成器的機器上安裝jmeter, 並確定其中一臺機器作為 controller ,其他的的機器作為agent 。

(2) 執行所有 agent 機器上的jmeter-server 檔案(假定使用兩臺機器192.168.9.99 和192.168.9.130 作為agent)

(3)在controller機器的jmeter的bin目錄下,找到jmeter.properties 檔案,編輯該檔案:

查詢:
remote_hosts=127.0.0.1
修改為:
remote_hosts=192.168.9.99:1099,192.168.9.130:1099 

這裡要特別注意埠後,有些資料說明埠1644為jmeter的controller 和agent 之間進行通訊的預設RMI埠號,但是在測試時發現,設定為1644執行不成功,改成1099後執行通過。另外還要留意agent的機子是否開啟了防火牆等。

說明:

  1、排程機(master)和執行機(slave)最好分開,由於master需要傳送資訊給slave並且會接收slave回傳回來的測試資料,所以mater自身會有消耗,所以建議單獨用一臺機器作為mater。

  2、引數檔案:如果使用csv進行引數化,那麼需要把引數檔案在每臺slave上拷一份且路徑需要設定成一樣的。

  3、每臺機器上安裝的Jmeter版本和外掛最好都一致,否則會出一些意外的問題。

 

7.升級http協議到https協議,需要測試哪些