閱讀567 返回首頁    go 人物


傳智播客培訓2.18第一天 Java基礎增強

培訓已經開始幾天了,一直沒有做總結的想法,想想還是寫寫總結吧!

 

先說說myEclipce中常用的快捷鍵吧!

 

 

快捷鍵

1.  alt + / 代碼自動補齊,需要配置的

              打開preferences(首選項), keys,打開快捷鍵配置麵板

              alt+/ ,取消綁定

              content assist ,取消原先的綁定,配置成alt+/

2. ctrl+1: 錯誤自動修複, 注意,放行的紅叉是可修複的,圓形的是不可修複的

3.導包的三種方式:

       1)將類名敲完整,按下alt+/ 進行補齊,會自動導包

       2) ctrl+1,修正錯誤

       3) ctrl+shift+o 整理包,導入需要的包,去掉多餘的導包語句

4. ctrl+shift+f : 代碼格式化

5. 管理透視圖

6ctrl+2,L  自動聲明變量

7. shift+enter  光標直接進入下一行

8.ctrl+alt+方向鍵(向上向下)  複製行

9. alt+ 方向鍵(向上向下) 移動當前行

 

myEclipse的使用這裏就不總結了,多練習就知道快捷鍵的用法了!

 

感覺有收獲的還是對數據類型的介紹和jdk5.0中新特性的介紹!

 

基本數據類型的包裝類

1.       Integer x = 1; x = x + 1;  經曆了什麼過程? 裝箱à 拆箱 à 裝箱

2.       為了優化,虛擬機為包裝類提供了緩衝池, Integer池的大小 -128~127

3.       String

/*1. String s = "abc" 虛擬機首先會檢查String池裏有沒有"abc"對象(通過equals方法)

       // 如果有,直接返回引用,如果沒有,會在池裏創建一個“abc”對象,並返回引用

       String s1 = "abc";

       String s2 = "abc";

       System.out.println(s1==s2); // result: true

       */

      

       /* 2. String str = new String("abc"); 不管緩衝池是否有"abc", 都會在堆內存創建一個"abc"對象,返回引用

       // 此時,負責檢查並維護緩衝池,其實堆內存的對象是緩衝池中"abc"對象的一個拷貝

       String s1 = new String("abc");

       String s2 = new String("abc");

       System.out.println(s1==s2); // result: false

       */

      

       /* 3. String s = "a" + "b" + "c" + "d";  java編譯器有個合並已知量的優化功能

       // 在編譯階段就把"a" + "b" + "c" + "d" 合並為 ”abcd“

       String s = "a" + "b" + "c" + "d";

    //  String s = "abcd";

       System.out.println(s=="abcd");// result: true

       */

      

       /* 4.  String s1 = "a"; String s2 = "b"; String s3 = s1 + s2;

       // String是常量,不能相加的,java如何實現的?

        StringBuilder sb = new StringBuidler(s1);

        sb.append(s2);

        s3 = sb.toString();

        

        也就是說實際上s3是方法返回的String對象

        凡是方法返回的字符串對象都是在堆內存的,並且不負責維護緩衝池

       */

        String s1 = "a";

        String s2 = "b";

        String s3 = s1 + s2; // 堆內存的對象

        

        System.out.println(s3=="ab");// result: false

 

增強for循環

1.       作用: 對存儲對象的容器進行迭代

2.       jdk5以前怎麼迭代

3.       數組

String [] arr = {"a", "b", "c"};   //數組的靜態定義方式,隻試用於數組首次定義的時候

// 傳統方式

for(int i=0; i<arr.length; i++) {

    // i依次表示數組的角標

    String s = arr[i];

    System.out.println(s);

}

System.out.println("-------------------------------------");

// jdk5中我們可以使用增強for循環迭代

// 增強for循環括號裏寫兩個參數,第一個是聲明一個變量,變量類型必須是數組元素的類型

// 第二個就是需要迭代的容器

// for循環會循環容器的length, 每次都將容器的第n-1個元素賦值給聲明的變量

for(String s : arr) {

    // 循環體, 執行arr.length

    // 每次都將arr中的第n-1個元素給s

    System.out.println(s);   //

}

4.       單列集合 Collection

List list = new ArrayList();

list.add("aaa");

list.add("bbb");

list.add("ccc");

 

// 傳統方式1

/* 1.獲得迭代器

Iterator iter = list.iterator();

// 2.循環判斷迭代器是否有下一個

while(iter.hasNext()) {

    String str = (String) iter.next(); // 將迭代器的指針移向下一個,並將迭代當前指向的元素返回

    System.out.println(str);

}

*/

// 傳統方式2

for(Iterator iter=list.iterator(); iter.hasNext(); ) {

    String s = (String) iter.next();

    System.out.println(s);

}

System.out.println("--------------------------------");

// 增強for循環, 沒有使用泛型的集合能不能使用增強for循環迭代?能

for(Object obj : list) {

    String s =  (String) obj;

    System.out.println(s);

}

5.       雙列集合 Map

Map map = new HashMap();

map.put("a", "aaa");

map.put("b", "bbb");

map.put("c", "ccc");

 

// 傳統方式迭代1

// 1. 獲得所有的key

Set keys = map.keySet();

// 2.迭代keys獲得所有的key

Iterator iter = keys.iterator();

while(iter.hasNext()) {

    String key = (String) iter.next(); // a b c

    // 3.根據key獲得對應的value

    String value = (String) map.get(key);

    System.out.println(key + "=" + value);

}

System.out.println("---------------------------------");

// 傳統方式2,必須掌握這種方式

// 1.獲得所有的鍵值對Entry對象

Set entrys = map.entrySet();

// 2.迭代出所有的entry

iter = entrys.iterator();

while(iter.hasNext()) {

    Map.Entry entry = (Entry) iter.next();

    // 分別獲得keyvalue

    String key = (String) entry.getKey();

    String value = (String) entry.getValue();

    System.out.println(key + "=" + value);

}

System.out.println("-------------------------------------");

System.out.println("增強for循環迭代,");

// 增強for循環迭代,

// 原則上map集合是無法使用增強for循環來迭代的,

// 因為增強for循環隻能針對實現了Iterable接口的集合進行迭代

// Iterablejdk5中新定義的接口,就一個方法iterator方法

// 隻有實現了Iterable接口的類,才能保證一定有iterator方法

// java有這樣的限定是因為增強for循環內部還是用迭代器實現的

 

// 而實際上,我們可以通過某種方式來使用增強for循環

for(Object obj : map.entrySet()) {

    // obj 依次表示Entry

    Map.Entry entry = (Entry) obj;

    System.out.println(entry.getKey() + "=" + entry.getValue());

}

6.       集合迭代注意問題

// 在使用迭代器迭代集合的過程中,不能對集合進行增刪操作

@Test

public void test4() {

    List list = new ArrayList();

   

    list.add("wangwu");

    list.add("zhangsan");

    list.add("lisi");

 

    Iterator iter = list.iterator();

    while(iter.hasNext()) {

        String name = (String) iter.next();

        if("wangwu".equals(name)) {

           // 從集合中刪掉

           //list.remove(name);

           // 迭代過程中刪除元素需要調用迭代器的方法

            iter.remove();    // 刪除我迭代的集合被我迭代的最後一個元素

        }

    }

// 1 2 4

    System.out.println(list.size());

}

 

@Test

public void test5() {

    List list = new ArrayList();

   

    list.add("aa");

    list.add("bb");

   

    // 使用ListIterator迭代器

    ListIterator listIterator = list.listIterator();

    while(listIterator.hasNext()) {

       listIterator.next();

       // 迭代過程中增加元素

       listIterator.add("cc");

    }

    System.out.println(list.size());

}

7.       增強for循環注意問題

//在使用增強for循環時,不能對元素進行賦值

int[] arr = {1,2,3};

 

for(int num : arr) {

    num = 0;

}

 

System.out.println(arr[1]);

 

可變參數

1.       jdk5中方法的形參可以定義為可變參數,傳入實參個數可變

// 設計一個方法求n個數的和

public static int getSum(int... arr) {

    // 可變參數在方法中仍被看做一個數組

    int sum = 0;

    for(int num : arr)

       sum += num;

    return sum;

}

2.       Arrays.asList為例演示傳入不同參數的情況

// list長度為3

List list = Arrays.asList("a","b","c");

// list長度為1 因為考慮1.4語法

String[] arr = {"a","b","c"};

List list = Arrays.asList(arr);

// 同時符合1.41.5的語法,此時會優先考慮1.4的語法

       // 原因是有了新功能要保證以前的代碼不出錯,向後兼容

// 現在就需要將arr作為一個元素存入集合

Object obj = arr;

List list2 = Arrays.asList(obj);   // 此時隻符合1.5的語法,不符合1.4的語法,沒有歧義

 

List list3 = Arrays.asList(new Object[]{arr});   // 優先考慮1.4,所以數組會拆開

//System.out.println(list3.size());

// 基本數據類型數組隻符合1.5的語法

int[] nums = {1,2,3};

list = Arrays.asList(nums);

System.out.println(list.size());

枚舉

1.       問題:對象的某個屬性的值不能是任意的,必須為固定的一組取值其中的某一個

2.       解決辦法:

1)    setGrade方法中做判斷,不符合格式要求就拋出異常

2)    直接限定用戶的選擇,通過自定義類模擬枚舉的方式來限定用戶的輸入

       寫一個Grade類,私有構造函數,對外提供5個靜態的常量表示類的實例

3)        jdk5中新定義了枚舉類型,專門用於解決此類問題

4)        枚舉為普通java類,可以定義屬性、方法、構造函數

//枚舉類就是一個java類,也可以聲明屬性,方法,構造函數

public enum Grade4 {

    A("90-100"),B("80-89"),C("70-79"),D("60-69"),E("0-59");

   

    private String value;

    private Grade4(String value) {

       this.value = value;

    }

   

    public String getValue() {

       return value;

    }

}

 

//枚舉類就是一個java, 也可以繼承抽象和實現接口

public enum Grade5 {

    // 抽象類不能創建實例對象

    A("90-100"){

       // new了一個Grade5的子類實例

       public String toLocaleString() {

           return "";

       }

    }

    ,B("80-89"){

       // new了一個Grade5的子類實例

       public String toLocaleString() {

           return "";

       }

    }

    ,C("70-79"){

       // new了一個Grade5的子類實例

       public String toLocaleString() {

           return "";

       }

    }

    ,D("60-69"){

       // new了一個Grade5的子類實例

       public String toLocaleString() {

           return "";

       }

    }

    ,E("0-59"){

       // new了一個Grade5的子類實例

       public String toLocaleString() {

           return "不及格";

       }

    };

   

    private String value;

    private Grade5(String value) {

       this.value = value;

    }

   

    public String getValue() {

       return value;

    }

   

    // 對外提供一個方法,返回枚舉的本地信息

    // 一個方法不知道如何實現,可以定義為抽象的

    public abstract String toLocaleString();

   

}

 

 

 

 

最後更新:2017-04-02 06:51:36

  上一篇:go js導出Excel彈出對話框
  下一篇:go 大型項目使用Automake/Autoconf完成編譯配置(2)——步步為營