day17JDK5.0新特性與正則表達式

Eclipse簡介和使用

IDE(Integrated Development Environment ): 集成開發環境,集合開發、運行、調試於一體的一個軟件html

Eclipse 是一個開放源代碼的、基於Java的可擴展開發平臺。java

下載地址: http://www.eclipse.org/web

 

1.1 管理:

工做空間(workspace)、工程(project)正則表達式

workspace編程

      工做空間:代碼保存在硬盤的空間建議按照班級號(20121224)設計模式

      注意:工做空間命名不能選擇帶中文或者空格的例如(Program Files就不能夠)數組

Java Project緩存

java工程(Java Project):Java Project管理全部的java源程序和class文件 安全

File ->new Java Project  -à指定Java工程名 在學習中習慣按照時間命名(例如day01)           網絡

1.2 使用

1. 建立Java工程

         File --> new ----> java Project

2. 編程

可使用使用快捷鍵,提升開發效率.

3. 運行

右鍵單擊要運行的java文件---> run as ---->  java application

或者是ctr+F11快捷鍵。      

1.3 經常使用快捷鍵

快捷鍵的配置,經常使用快捷鍵:

內容提示:

Alt + /  

例如: System.out.println(); 語句 ,syso再按住alt / 就會補全.

   忘記某個類如何書寫,能夠寫出一部分,按住alt / 就會有提示.

快速修復:

Ctrl + 1

例如,程序有編譯期異常,或者須要導包.使用該快捷鍵.會有相關提示.

導包:

Ctrl + shift + O

若是須要導入的包比較多,能夠一次性所有導入,也會將多餘的包清理掉.

格式化代碼塊:

Ctrl + Shift + F

代碼位置調換:

Alt+上下鍵

添加/除去單行註釋

Ctrl+/

添加/除去多行註釋

Ctrl+Shift+/

Ctrl+Shift+\

重置透視圖:window->reset perspective

eclipse Java視圖變的很亂的時候,就能夠重置透視圖,還原爲最初的界面.

大小寫轉換

更改成大寫 Ctrl+Shift+X

更改成小寫 Ctrl+Shift+Y

複製行

 Ctrl+Alt+向下鍵

查看源代碼

1Ctrl+單擊 須要查看源碼的類

2Ctrl+Shift+T

刪除:

1.Ctrl + D            刪除當前行

1.4 自定義快捷鍵

注意: 快捷鍵的衝突:

例如: 輸入法的簡繁體切換 就是ctrl +shift+f .

Windows Preferences 輸入key 點擊keys  

   例如設置 alt+/ 此時彈出對話框中輸入alt+/ 此時顯示已被Eclipse默認設置,

   可是不是咱們須要的.能夠點擊Remove binding來解除綁定

   從新設置 輸入Content Assist(內容助理)  binding 內輸入alt+/ 而後點擊apply

 

1.5 類的建立

(方法、構造函數、封裝)

在類中鼠標右鍵點擊Source .能夠選擇建立hashCode 方法,equals方法, toString方法.能夠建立無參數構造,有參數構造.根據成員變臉的get set方法.

方法的抽取

選中須要抽取爲方法的代碼塊,鼠標右鍵Refactor ->Extract method ->輸入方法名.

變量的重命名

若是一個類中該變量重複較多,須要一個個修改,能夠選中該變量名,而後Refactor ->Rename ,同名的變量都會修改.

JDK5特性

JDK5中新增了不少新的java特性,利用這些新語法能夠幫助開發人員編寫出更加清晰,安全,高效的代碼。

靜態導入

自動裝箱/拆箱

加強for循環

可變參數

枚舉

 

泛型

2.1 靜態導入(瞭解)

JDK 1.5 增長的靜態導入語法用於導入類的某個靜態屬性或方法。使用靜態導入能夠簡化程序對類靜態屬性和方法的調用。

語法:

import static 包名.類名.靜態屬性|靜態方法|*

例如:

import static java.lang.System.out

import static java.lang.Math.*

 

 

import static java.lang.System.out;

import static java.lang.Math.*;

 

public class Demo {

 

public static void main(String[] args) {

// 普通寫法

System.out.println("hello world");

int max = Math.max(100, 200);

System.out.println(max);

 

// 靜態導入

out.println("hello world");

int max2 = max(100, 200);

System.out.println(max2);

}

 

}

 

 

2.2 加強for循環

引入加強for循環的緣由:在JDK5之前的版本中,遍歷數組或集合中的元素,需先得到數組的長度或集合的迭代器,比較麻煩!

所以JDK5中定義了一種新的語法——加強for循環,以簡化此類操做。加強for循環只能用在數組、或實現Iterable接口的集合類

語法格式:  

for(變量類型 變量 :需迭代的數組或集合){}

 

                                            

For each是爲了讓你的代碼變得簡捷、和容易維護。

 

加強for循環要注意的細節:

1. 迭代器能夠對遍歷的元素進行操做,使用加強for循環時,不能對集合中的元素進行操做的。

2. 增長for循環與普通的for循環區別。

3. map的遍歷。

2.3 可變參數

JDK中具備可變參數的類Arrays.asList()方法。

分別傳多個參、傳數組,傳數組又傳參的狀況。

注意:傳入基本數據類型數組的問題。

JDK 5開始, Java 容許爲方法定義長度可變的參數。

語法:數據類型變量名。

可變長參數是Object[] 數組。(可變參數裏存的是對象數組)

JDK中的典型應用:

     Arrays.asList(T…a)jdk中的典型應用。

需求:對若干個整數進行求和

public static int sum1(int a,int b ) {

return a+b;

}

 

若干個整數求和如何解決?

可使用數組接收整數。

public static int sum1(int[] numbers) {

if (numbers == null) {

return 0;

}

 

if (numbers.length == 0) {

return 0;

}

 

int sum = 0;

for (int num : numbers) {

sum += num;

}

return sum;

}

 

 

可使用可變參數

public static int sum2(int... numbers) {

if (numbers == null) {

System.out.println("可變參數的值爲null");

return 0;

}

 

if (numbers.length == 0) {

System.out.println("可變參數的值的長度爲0");

return 0;

}

 

int sum = 0;

for (int num : numbers) {

sum += num;

}

return sum;

}

 

 

可變參數的使用

public static void main(String[] args) {

// int result = sum1(new int[] { 1, 3, 5, 7, 9 });

// System.out.println(result);

 

// // 使用了可變參數,傳一個數組進去

// int result = sum2(new int[] { 1, 3, 5, 7, 9 });

// System.out.println(result);

 

// 使用了可變參數,沒必要聲明數組,簡化書寫

// int result = sum2(2, 4, 6, 8, 10);

// int result = sum2(1);

int result = sum2();

System.out.println(result);

}

 

 

 

可變參數的細節

聲明:

在一個方法中,最多隻能有一個可變參數。

可變參數只能放在參數列表的最後面。

調用:

當使用可變參數時,能夠傳0或多個參數。

當使用可變參數時,也能夠傳一個數組進去,就表示多個參數。

使用:

在方法內部使用時,就是在使用一個數組。

當調用時沒有傳參數時(傳了0個),這時在方法內部的參數數組是有值的(不爲null),但長度爲0.

 

 

2.4 自動裝箱/拆箱

自動裝箱:指開發人員能夠把一個基本數據類型直接賦給對應的包裝類。

自動拆箱:指開發人員能夠把一個包裝類對象直接賦給對應的基本數據類型。

典型應用:

List list = new ArrayList();

list.add(1);

//list.add(new Integer(1));

int i=list.get(0);

//int j = (Integer)list.get(0);

 

2.4.1 基本數據類型包裝類

包裝類 基本數據類型

Byte

byte

Short

short

Integer

int

Long

long

Boolean

boolean

Float

float

Double

double

Character

char

對象變基本數據類型:拆箱

基本數據類型包裝爲對象:裝箱

 

爲了使得java的基本類型有更多的功能,java爲其全部的基本類型提供了包裝類來封裝常見的功能。如:最大值、數值轉換等。

將基本數據類型封裝成對象的好處在於能夠在對象中定義更多的功能方法操做該數據

所屬的包:java.lang.*

 

常見應用一:

獲取最大最小值MAX_VALUE / MIN_VALUE

整數類型最大值

Integer.MAX_VALUE

System.out.println(Integer.MIN_VALUE);// -2147483648

System.out.println(Integer.MAX_VALUE);// 2147483647

 

應用二:

基本數據類型和字符串之間的轉換

例:IntegerparseInt方法,intValue方法

 

基本數據類型轉換成字符串:

1:基本數據類型+」」

2:基本數據類型.toString(基本數據類型值);

例如  Integer.toString(34); //34變成了」34」

基本數據類型轉字符串

int i=100;

String str=100+"";

String string = Integer.toString(100);

 

 

字符串變基本數據類型

基本數據類型 a=基本數據類型包裝類.parse基本數據類型(String str);

str="123";

int parseInt = Integer.parseInt(str);

System.out.println(parseInt);

         

注意:

public static int parseInt(String s)

Integer類中的parseInt方法是靜態的 參數必須是數字格式

 

 

Double

str = "3.14";

double parseInt2 = Double.parseDouble(str);

System.out.println(parseInt2);

 

boolean b = Boolean.parseBoolean("true");

 

應用三:

進制轉換:

 十進制轉成其餘進制.

toBinaryString(int i)
          以二進制(基數 2)無符號整數形式返回一個整數參數的字符串表示形式。

toHexString(int i)
          以十六進制(基數 16)無符號整數形式返回一個整數參數的字符串表示形式。

toOctalString(int i)
          以八進制(基數 8)無符號整數形式返回一個整數參數的字符串表示形式。

那麼其餘進制轉成十進制

parseInt(String radix);

parseInt(String s, int radix)
          使用第二個參數指定的基數,將字符串參數解析爲有符號的整數。

 

 

十進制轉其餘進制

// 十進制轉二進制

String binaryString = Integer.toBinaryString(100);

System.out.println(binaryString); // 1100100

// 十進制轉十六進制

String hexString = Integer.toHexString(100);

System.out.println(hexString); // 64

 

// 十進制轉八進制

String octalString = Integer.toOctalString(100);

System.out.println(octalString); // 144

 

 

其餘進制轉十進制

// 字符串轉對應的進制

int parseInt3 = Integer.parseInt(octalString);

System.out.println(parseInt3);

// 二進制轉十進制

int parseInt4 = Integer.parseInt(binaryString, 2);

System.out.println(parseInt4);

// 十六進制轉十進制

int parseInt5 = Integer.parseInt(hexString, 16);

System.out.println(parseInt5);

// 八進制轉十進制

int parseInt6 = Integer.parseInt(octalString, 8);

System.out.println(parseInt6);

 

JDK5.0後出現了自動裝箱和拆箱

JDK5.0之後,簡化了定義方式。

Integer x = new Integer(5);//裝箱

int intValue = x.intValue(); //拆箱

 

// 5.0簡化書寫

// 自動裝箱。new Integer(5);

Integer y = 5;  

// 對象加整數,x 進行了自動拆箱,變成了int 型 和5進行加法運算後再將和進行裝箱賦給x

y = y + 5; // 是經過Integer.intValue() 方法進行拆箱

 

練習:

public static void main(String[] args) {

Integer a = 127;

Integer b = 127;

System.out.println(a == b);

 

Integer c = 128;

Integer d = 128;

System.out.println(c == d);

}

請問結果?

   a==b true 由於ab指向了同一個Integer 對象.

   Integer的緩存大小-128 ~127 之間也就是byte的範圍。

2.5 枚舉類

一些方法在運行時,它須要的數據不能是任意的,而必須是必定範圍內的值,此類問題在JDK5之前採用自定義帶有枚舉功能的類解決,Java5之後能夠直接使用枚舉予以解決。

例如交通燈(紅、黃、綠)    性別(男、女)   星期(星期1、2、三…..)

     分數等級(ABCDE)

JDK 5新增的 enum 關鍵字用於定義一個枚舉類。

枚舉的實現

使用enum定義枚舉類

在枚舉類中定義枚舉值(大寫)

enum Gender {

MALE, FEMALE;

}

使用javap命令

 

 

發現其中每個枚舉值都是枚舉類的具體實例對象.只不過是靜態常量.

枚舉類具備以下特性:

枚舉類也是一種特殊形式的Java類。

枚舉類中聲明的每個枚舉值表明枚舉類的一個實例對象。

java中的普通類同樣,在聲明枚舉類時,也能夠聲明屬性、方法和構造函數.

public class Demo1 {

public static void main(String[] args) {

Gender male = Gender.MALE;

System.out.println(male.getInfo());

}

}

 

enum Gender {

MALE(""), FEMALE;

 

// 成員變量

private String info;

 

// 構造函數

private Gender() {

 

}

 

private Gender(String info) {

this.info = info;

}

 

// 成員方法

public String getInfo() {

return info;

}

 

}

枚舉類能夠聲明抽象方法,可是要有具體的枚舉值去實現.

public class Demo1 {

public static void main(String[] args) {

Gender male = Gender.MALE;

System.out.println(male.getInfo());

male.speak();

}

}

 

enum Gender {

MALE("") {

@Override

public void speak() {

System.out.println("是男人");

}

},

FEMALE {

@Override

public void speak() {

System.out.println("是女人");

}

};

 

// 成員變量

private String info;

 

// 構造函數

private Gender() {

 

}

 

private Gender(String info) {

this.info = info;

}

 

// 成員方法

public String getInfo() {

return info;

}

 

public abstract void speak();

 

}

 

枚舉類也能夠實現接口(序列化)、或繼承抽象類。

JDK5中擴展了swith語句,它除了能夠接收int, byte, char, short外,還能夠接收一個枚舉類型(enum)

public class Demo2 {

public static void main(String[] args) {

WeekDay mon = WeekDay.MON;

switch (mon) {

case MON:

System.out.println("星期一要上班...");

break;

case TUE:

System.out.println("星期二,繼續上班...");

break;

}

}

}

 

enum WeekDay {

MON, TUE, WED, THU, FRI, SAT, SUN;

}

 

 

若枚舉類只有一個枚舉值,則能夠看成單態設計模式使用。

練習:

請編寫一個關於星期幾的枚舉WeekDay,要求:枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 該枚舉要有一個方法,調用該方法返回中文格式的星期。

enum WeekDay {

MON {

 

@Override

public String getInfo() {

 

return "星期一";

}

 

},

TUE {

@Override

public String getInfo() {

 

return "星期二";

}

},

WED {

@Override

public String getInfo() {

 

return "星期三";

}

},

THU {

@Override

public String getInfo() {

 

return "星期四";

}

},

FRI {

@Override

public String getInfo() {

 

return "星期五";

}

},

SAT {

@Override

public String getInfo() {

 

return "星期六";

}

},

SUN {

@Override

public String getInfo() {

 

return "星期天";

}

};

 

public abstract String getInfo();

}

 

正則表達式

正則表達式:其實一種規則,有本身特殊的應用,其做用就是針對於字符串進行操做。

正則:就是用於操做字符串的規則,其中這些規則使用了一些字符表示。

 

3.1 快速體驗正則表達式

需求:只能輸入數字

public class Demo2{

 

public static void main(String[] args) {

//只能輸入數字

String str = "124354232";

char[] arr = str.toCharArray();

boolean flag = true;

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

if(!(arr[i]>=48&&arr[i]<=57)){

flag = false;

}

}

System.out.println(flag?"輸入正確":"輸出只能是數字");

}

 

 

}

使用正則表達式:

public class Demo2{

 

public static void main(String[] args) {

//只能輸入數字

String str = "12435423a2";

boolean flag = str.matches("[0-9]+");

System.out.println(flag?"輸入正確":"只能輸入數字");

 

}

}

 

3.2 正則表達式的符號

預約義字符類

.

任何字符(與行結束符可能匹配也可能不匹配)

 

\d

數字:[0-9]

 

\D

非數字: [^0-9]

 

\s

空白字符:[ \t\n\x0B\f\r]

 

\S

非空白字符:[^\s]

 

\w

單詞字符:[a-zA-Z_0-9]

 

\W

非單詞字符:[^\w]

 

System.out.println("a".matches("."));

System.out.println("1".matches("\\d"));

System.out.println("%".matches("\\D"));

System.out.println("\r".matches("\\s"));

System.out.println("^".matches("\\S"));

System.out.println("a".matches("\\w"));

 

Greedy 數量詞

X?

X,一次或一次也沒有

X*

X,零次或屢次

X+

X,一次或屢次

X{n}

X,剛好n

X{n,}

X,至少n

X{n,m}

X,至少n次,可是不超過m

System.out.println( "a".matches(".") );

System.out.println( "a".matches("a") );

System.out.println("a".matches("a?") );

System.out.println( "aaa".matches("a*") );

System.out.println( "".matches("a+") );

System.out.println( "aaaaa".matches("a{5}") );

System.out.println( "aaaaaaaaa".matches("a{5,8}") );

System.out.println( "aaa".matches("a{5,}") );

System.out.println( "aaaaab".matches("a{5,}") );

 

範圍表示

[abc]

ab c(簡單類)

[^abc]

任何字符,除了 ab c(否認)

[a-zA-Z]

a z A Z,兩頭的字母包括在內(範圍)

[a-d[m-p]]

a d m p[a-dm-p](並集)

[a-z&&[def]]

de f(交集)

[a-z&&[^bc]]

a z,除了 b c[ad-z](減去)

[a-z&&[^m-p]]

a z,而非 m p[a-lq-z](減去)

 

 

System.out.println( "a".matches("[a]") );

System.out.println( "aa".matches("[a]+") );

System.out.println( "abc".matches("[abc]{3,}") );

System.out.println( "abc".matches("[abc]+") );

System.out.println( "dshfshfu1".matches("[^abc]+") );

System.out.println( "abcdsaA".matches("[a-z]{5,}") );

System.out.println( "abcdsaA12".matches("[a-zA-Z]{5,}") );

System.out.println( "abcdsaA12".matches("[a-zA-Z0-9]{5,}") );

System.out.println( "abdxyz".matches("[a-c[x-z]]+"));

System.out.println( "bcbcbc".matches("[a-z&&[b-c]]{5,}"));

System.out.println( "tretrt".matches("[a-z&&[^b-c]]{5,}"));

 

 

3.3 匹配功能

需求:校驗QQ號,要求:必須是5~15位數字,0不能開頭。沒有正則表達式以前

public static void checkQQ(String qq)

{

int len = qq.length();

if(len>=5 && len <=15)

{

if(!qq.startsWith("0"))

{

try

{

long l = Long.parseLong(qq);

System.out.println("qq:"+l);

}

catch (NumberFormatException e)

{

System.out.println("出現非法字符");

}

}

else

System.out.println("不能夠0開頭");

}

else

System.out.println("QQ號長度錯誤");

}

有了正則表達式以後:

[1-9][0-9]{4,14}   [1-9]表示是第一位數字是會出現1-9範圍之間的其中一個,下來的數字範圍會出如今0-9之間,至少出現4次,最多出現14次。

public static void checkQQ2()         

{                                     

String qq = "12345";              

String reg = "[1-9][0-9]{4,14}";  

boolean b = qq.matches(reg);      

System.out.println("b="+b);                                 

}                                     

 

需求:匹配是否爲一個合法的手機號碼。

public static void checkTel()                                                   

{                                                                               

String tel = "25800001111";                                                 

String reg = "1[35]\\d{9}";//在字符串中,定義正則出現\ 要一對出現。         

boolean b= tel.matches(reg);                                                

System.out.println(tel+":"+b);                                              

}                                                                               

3.4 切割功能

需求1:根據空格對一段字符串進行切割。

public static void splitDemo()                              

{                                                           

String str = "aa.bb.cc";                                

str = "-1     99    4    23";                           

String[] arr = str.split(" +");                         

for(String s : arr)                                     

{                                                       

System.out.println(s);                              

}                                                       

}                                                           

需求2 :根據重疊詞進行切割。

public static void splitDemo2()        

{                                      

String str = "sdqqfgkkkhjppppkl";

String[] arr = str.split("(.)\\1+");

for(String s : arr)                

{                                  

System.out.println(s);         

}                                  

                                       

}                                      

注意:爲了提升規則複用,用()進行封裝,每個括號都有一個編號,從1開始,爲了複用這個規則。能夠經過編號來完成該規則的調用。須要對編號數字進行轉義。\\1就表明獲取1組規則。

3.5 替換功能

需求:把手機號替換成*」號。

String str = "聯繫我:13567012119聯繫我:13567012119聯繫我:13567012119聯繫我:13567012119聯繫我:13567012119聯繫我:13567012119";

String reg= "1[34578]\\d{9}";

str = str.replaceAll(reg,"******");

System.out.println("替換後的帖子:"+ str);

練習二:我我...........要要...要學....學學.....編編......

將字符串還原成  我要學編程。

 

 

3.6 獲取

獲取須要使用到正則的兩個對象:使用的是用正則對象Pattern 和匹配器Matcher

用法:

範例:

 Pattern p = Pattern.compile("a*b");

 Matcher m = p.matcher("aaaaab");

 boolean b = m.matches();

步驟:

1,先將正則表達式編譯成正則對象。使用的是Pattern類一個靜態的方法。compile(regex);

2,讓正則對象和要操做的字符串相關聯,經過matcher方法完成,並返回匹配器對象。

3,經過匹配器對象的方法將正則模式做用到字符串上對字符串進行鍼對性的功能操做

需求:獲取由3個字母組成的單詞。

public static void getDemo()

{

String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!";

//想要獲取由3個字母組成的單詞。

//剛纔的功能返回的都是一個結果,只有split返回的是數組,可是它是把規則做爲分隔符,不會獲取符合規則的內容。

//這時咱們要用到一些正則對象。

String reg = "\\b[a-z]{3}\\b";

Pattern p = Pattern.compile(reg);

Matcher m = p.matcher(str);

while(m.find())

{

System.out.println(m.start()+"...."+m.end());

System.out.println("sub:"+str.substring(m.start(),m.end()));

System.out.println(m.group());

}

// System.out.println(m.find());//將規則對字符串進行匹配查找。

// System.out.println(m.find());//將規則對字符串進行匹配查找。

// System.out.println(m.group());//在使用group方法以前,必需要先找,找到了才能夠取。

}

練習3:校驗郵件

public static void checkMail()

{

String mail = "abc123@sina.com.cn";

mail = "1@1.1";

String reg = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";

reg = "\\w+@\\w+(\\.\\w+)+";//簡化的規則。籠統的匹配。

boolean b = mail.matches(reg);

System.out.println(mail+":"+b);

}

練習4:網絡爬蟲

class GetMailList

{

public static void main(String[] args) throws Exception

{

String reg = "\\w+@[a-zA-Z]+(\\.[a-zA-Z]+)+";

getMailsByWeb(reg);

}

 

 

public static void getMailsByWeb(String regex)throws Exception

{

URL url = new URL("http://localhost:8080/myweb/mail.html");

 

URLConnection conn = url.openConnection();

BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line = null;

Pattern p = Pattern.compile(regex);

while((line=bufIn.readLine())!=null)

{

//System.out.println(line);

Matcher m = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

bufIn.close();

}

public static void getMails(String regex)throws Exception

{

BufferedReader bufr =

new BufferedReader(new FileReader("mail.txt"));

String line = null;

Pattern p = Pattern.compile(regex);

while((line=bufr.readLine())!=null)

{

//System.out.println(line);

Matcher m = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

bufr.close();

}

}

相關文章
相關標籤/搜索