stringbuffer常用方法_第八讲:常用类库API
一、字符串操作---String類
1、String可以表示一個(gè)字符串,不能被繼承(最終類)不可變
2、String類實(shí)際是使用字符數(shù)組存儲(chǔ)的
String類的兩種賦值方式:
(1)一種稱為直接賦值、Java推薦使用第一種方式
String name="小白"
(2)通過關(guān)鍵字new調(diào)用String的構(gòu)造方法賦值:new申請(qǐng)內(nèi)存空間
String?name =?new String("小白")
String類的兩種賦值分析:
1、字符串常量池
2、String name = new String("小白")在內(nèi)存中分析
3、String?name =?"小白",在內(nèi)存中分析
String 類編譯期與運(yùn)行期分析:
1、編譯期和運(yùn)行期
2、代碼示例:4種情況分析:直接賦值字符串連接時(shí),考慮編譯期與運(yùn)行期
如果在編譯期值可以被確定,那么就使用已有的對(duì)象,否則會(huì)創(chuàng)建新對(duì)象
String a="a";String a+1;String?a2="a1";System.out.println(a1==a2);String類字符與字符串操作方法:
String類字節(jié)與字符串操作方法:
String類判斷是否以指定內(nèi)容開頭或結(jié)尾:
String類替換操作:
String字符串截取操作:
String字符串拆分操作:
String字符串查找操作:
String類其它操作方法:
二、字符串操作-----StringBuffer類
在實(shí)際開發(fā)當(dāng)中,我們經(jīng)常會(huì)使用到字符串連接的操作,如果用String來操作,則使用“+”號(hào)來完成字符串的連接操作。
使用String連接字符串,代碼性能會(huì)非常低,因?yàn)镾tring的內(nèi)容不可改變。解決這個(gè)問題的方法是使用StringBuffer.
package com.vince.ex;public class StringDemo { public static void main(String[] args) { String a = "a"; String b = "b"; String c = a+b+1; System.out.println(c); String d="a"+1+2+3+4+"b";//a1234b //常量相加沒有性能問題(編譯期進(jìn)行優(yōu)化) //StringBuffer目的是為了解決字符串相加時(shí)帶來的性能問題(常量與變量) //StringBuffer的內(nèi)部實(shí)現(xiàn)采用字符數(shù)組、默認(rèn)數(shù)組的長度為16,超過數(shù)組大小時(shí),動(dòng)態(tài)擴(kuò)充的算法是原長度的*2+2 //所以當(dāng)我們要預(yù)知添加的數(shù)據(jù)長度時(shí),建議使用帶初始化容量的構(gòu)造方法,來避免動(dòng)態(tài)擴(kuò)張的次數(shù),從而提高效率 //線程安全,會(huì)影響性能??????StringBuffer?sb?=?new?StringBuffer(32);//帶容量的構(gòu)造 sb.append(a).append(b).append(1); System.out.println(sb.toString());??}}StringBuffer常用操作方法:
StringBuffer的兄弟StringBuilder:
一個(gè)可變的字符序列,此類提供一個(gè)與StringBuffer兼容的API,但不保證同步該類被設(shè)計(jì)用作StringBuffer的一個(gè)簡(jiǎn)易替換,用在字符串緩沖期被單個(gè)線程使用的時(shí)候(這種情況很普遍)如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比StringBuffer更快。
JDK1.5后、字符串相加原理分析:
package com.vince.ex;public class StringBufferDemo { public static void main(String[] args) { //面試題:StringBuffer與StringBuilder的區(qū)別? //StringBuilder是線程不安全的,性能高,適合在單線程中使用,這種情況占大多數(shù)在JDK1.5后添加 //StringBuffer是線程安全的,性能低,適合在多線程中使用,JDK1.0 StringBuilder sb = new StringBuilder(); /** * 字符串相加操作 * 1、多個(gè)常量相加沒有性能問題,在編譯期優(yōu)化 * 2、常量與常量相加、會(huì)產(chǎn)生多個(gè)垃圾對(duì)象 */ //String a = "a"+1; //String b = a+"b"; String c = null; for(int i=0;i<5;i++) { c+=i;//每個(gè)循環(huán)會(huì)產(chǎn)生一個(gè)StringBuilder對(duì)象實(shí)現(xiàn)拼接,性能低、最好是手動(dòng)創(chuàng)建StringBuilder來拼接 } //1、字符串相加,在編譯后,會(huì)使用StringBuilder來優(yōu)化代碼,實(shí)現(xiàn)拼接 }}三、程序國際化
1、對(duì)國際化程序的理解:
lnternationalization:國際化程序可以這樣理解:
同一套程序代碼,可以在各個(gè)語言環(huán)境下進(jìn)行使用。只是語言顯示不同,那么具體程序操作本身都是一樣的,那么國際化程序完成的就是這樣的一個(gè)功能。
2、Locale類:
Locale對(duì)象表示了特定的地理、政治和文化地區(qū)。需要Locale來執(zhí)行其任務(wù)的操作稱為語言環(huán)境敏感的操作,它使用Locale為用戶量身定制信息,例如:顯示一個(gè)數(shù)值就是語言環(huán)境敏感的操作,應(yīng)該根據(jù)用戶的國家、地區(qū)或文化風(fēng)俗/傳統(tǒng)來格式化數(shù)值。
使用此類中的構(gòu)造方法來創(chuàng)建Locale:
Locale(String language)
Locale(String langusge,String country)
通過靜態(tài)方法創(chuàng)建Locale:
getDefault()
package?com.vince.ex;public?class?I18NDemo?{ public static void main(String[] args) { //創(chuàng)建一個(gè)環(huán)境語言對(duì)象,該對(duì)象會(huì)根據(jù)參數(shù)設(shè)置來自動(dòng)選擇與相關(guān)的語言環(huán)境 //參數(shù):語言、地區(qū) Locale locale_CN = new Locale("zh","CN"); Locale locale_US = new Locale("en","UD"); //獲取當(dāng)前系統(tǒng)默認(rèn)的語言環(huán)境 Locale locale_default = Locale.getDefault(); }3、ResourceBundle類:
國際化的實(shí)現(xiàn)核心在于顯示的語言上,通常的做法是將其定義成若干個(gè)屬性文件(文件后綴是*。properties)屬性中的格式采用“key=value”的格式進(jìn)行操作。
ResourceBundle類表示的是一個(gè)資源文件的讀取操作,所有的資源文件需要使用ResourceBundle進(jìn)行讀取,讀取的時(shí)候不需要加上文件的后綴。
getBundle(String?baseName)
getBundle(String baseName,Locale locale)
getString?(String key)
properties文件:屬性文件(配置文件)內(nèi)容以鍵值對(duì)的形式存放(key-value)
ResourceBundle工具類:來綁定屬性文件,并指定Locale對(duì)象,來自動(dòng)選擇使用哪個(gè)屬性文件,默認(rèn)講使用與操作系統(tǒng)相同的語言環(huán)境
getString?()方法來從屬性文件中使用key來獲取value
注意:ResourceBundle工具類是只讀的
4、處理動(dòng)態(tài)文本:
前面的讀取示例讀取的內(nèi)容都是固定的,如果現(xiàn)在假設(shè)要想打印這樣的消息“歡迎你,xxx!”,具體的名字不是固定的,那么就要使用動(dòng)態(tài)文本進(jìn)行程序的處理。
進(jìn)行動(dòng)態(tài)的文本處理,必須使用Java.text.MessageFormat類完成。這個(gè)類是Java.text,Format的子類
四、Math與Random類
1、Math類
Math類包含用于執(zhí)行基本數(shù)學(xué)運(yùn)算的方法、如初等指數(shù)、對(duì)數(shù)、平方根和三角函數(shù)。
使用Math類可以有以下兩種方式:
(1)直接使用(Math所在的包Java.lang為默認(rèn)引入的包)
(2)使用import.static java.lang.Math.abs;靜態(tài)導(dǎo)入
| ? static?double?Pl | 對(duì)任何值都更接近pi的double值 |
| ? ? abs(double a) | 返回double值的絕對(duì)值 |
| ? ? ? ? random() | 返回帶正號(hào)的double值,該值大于等于0.0且小于1.0 |
| ? ?round(double?a) | 返回最近參數(shù)并等一整數(shù)的double值 |
| ? ? ?sqrt(double a) | 返回正確舍入的double值的平方根 |
2、Random類
Random:此類在實(shí)例用于生成隨機(jī)數(shù)流
| ? ?nextLong() | 返回下一個(gè)偽隨機(jī)數(shù)的long值 |
| ? ?nextBoolean() | 返回下一個(gè)偽隨機(jī)數(shù)的boolean值 |
| ? ??nextDoble() | 返回下一個(gè)偽隨機(jī)數(shù),在0.0和1.0之間的double值 |
| ? ? nextFloat() | 返回下一個(gè)偽隨機(jī)數(shù),在0.0和1.0之間的float值 |
| ? ??nextInt() | 返回下一個(gè)偽隨機(jī)數(shù),int值 |
| ? ? nextInt(int n) | 返回一個(gè)偽隨機(jī)數(shù),在1(包括)和指定值分布的int值 |
五、日期操作類
1、Date類
類Date表示特定的瞬間,精確到毫秒,也就是程序運(yùn)行時(shí)的當(dāng)前時(shí)間
Date date = new Date();//實(shí)例化Date類,表示當(dāng)前時(shí)間
2、Calender類
Calender、日歷類、使用此類可以將時(shí)間精確到毫秒顯示。兩種實(shí)例化方式:
Calender c =?Calender.getlnstance();
Calender c = new GregorianCalender();
3、DateFormat類及子類SimpleDateFormat
六、對(duì)象比較器
對(duì)兩個(gè)或多個(gè)數(shù)據(jù)進(jìn)行比較,以確定它們是否相等,或確定它們之間的大小關(guān)系及排列順序稱為比較。
Arrays.sort方法可實(shí)現(xiàn)對(duì)象的排列順序操作:
(1)Comparable接口:
此接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序,這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。
(2)Comparator接口:
Comparable接口是要求自定義類去實(shí)現(xiàn),按照oo原則:對(duì)修改關(guān)閉,對(duì)擴(kuò)展開發(fā),那么如果這個(gè)類已經(jīng)定義好了,不想再去修改它,那如何實(shí)現(xiàn)比較呢?Comparator接口:強(qiáng)行對(duì)一個(gè)對(duì)象collection進(jìn)行整體排序的比較。
七、對(duì)象的克隆
將一個(gè)對(duì)象復(fù)制一份,稱為對(duì)象的克隆技術(shù)。
在Object類中存在一個(gè)clone()方法:
protected Object clone()throws CloneNotSupportdException(如果一個(gè)類的對(duì)象要想克隆,則對(duì)象所在的類必須實(shí)現(xiàn)Cloneable接口。此接口沒有定義任何方法,是一個(gè)標(biāo)記接口)
對(duì)象需要具有可能功能:
1、實(shí)現(xiàn)Cloneable接口(標(biāo)記接口)
2、重寫Object類中的clone方法
八、System與Runtime類
System類代表系統(tǒng),系統(tǒng)級(jí)的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包
1、成員變量
System類內(nèi)部包含in、out和err三個(gè)成員變量,分別代表標(biāo)準(zhǔn)輸入流(鍵盤輸入),標(biāo)準(zhǔn)輸入流(顯示器)和標(biāo)準(zhǔn)錯(cuò)誤輸出流
2、成員方法
System類中提供了一些系統(tǒng)級(jí)的操作方法
參數(shù)(源數(shù)組、源數(shù)組的起始位置、目標(biāo)數(shù)組的起始位置?、長度)
(1)public?static void?arraycopy(Object src、int?srcPos、Object dest,int destPos,intlength)該方法的作用是數(shù)組拷貝,也就是將一個(gè)數(shù)組中的內(nèi)容復(fù)制到另一個(gè)數(shù)組中的指定位置,由于該方法是native方法,所以性能上比使用循環(huán)高效
(2)public static long currentTimeMillis()該方法的作用是返回當(dāng)前的計(jì)算機(jī)時(shí)間,時(shí)間的表達(dá)格式為當(dāng)前計(jì)算機(jī)時(shí)間和GMT時(shí)間(格林威治時(shí)間)1970年1月1號(hào)0時(shí)0分0秒所差的毫秒數(shù)
(3)public static?void exit(int?status)該方法的作用是退出程序。其中status的值為0代表正常退出,非零代表異常退出,使用該方法可以在圖形界面編程中實(shí)現(xiàn)程序的退出功能等。
(4)public?static void?gc()該方法的作用是請(qǐng)求系統(tǒng)進(jìn)行垃圾回收,至于系統(tǒng)是否立即回收,則取決于系統(tǒng)中的垃圾回收算法實(shí)現(xiàn)以及系統(tǒng)執(zhí)行時(shí)的情況
(5)public?static?String?getProperty(String?key)該方法的作用是獲得系統(tǒng)中屬性名為key的屬性對(duì)應(yīng)的值
java.version?java? ? ? ?運(yùn)行時(shí)環(huán)境版本
Java.home? ? ? ? ? ? ? ? ?Java安裝目錄
os.name? ? ? ? ? ? ? ? ? ? ?操作系統(tǒng)的名稱
os.version? ? ? ? ? ? ? ? ? 操作系統(tǒng)的版本
user.name?? ? ? ? ? ? ? ? ?操作系統(tǒng)賬號(hào)名稱
user.heme? ? ? ? ? ? ? ? ? 用戶的主目錄
user.dir? ? ? ? ? ? ? ? ? ? ???用戶的當(dāng)前工作目錄
Runtime類:每個(gè)Java應(yīng)用程序都有一個(gè)Runtime類實(shí)例、使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。
Runtime?rt?=?Runtime.getRuntime();
System.out.println("處理器數(shù)量:"+rt.availableProcessors()+"個(gè)");
System.out.println("JVM總內(nèi)存數(shù):"+rt.totaIMemory()+"byte")
System.out.println("JVM空閑內(nèi)存數(shù):"rt.freeMemory()+"byte");
System.out.println("JVM可用最大內(nèi)存數(shù):"rt.maxMemory()+"byte);
在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令
rt.exec("notepad")
九、數(shù)字處理工具類
Biglnteger:可以讓超過lnteger范圍內(nèi)的數(shù)據(jù)進(jìn)行運(yùn)算
構(gòu)造方法:public Biglnteger(String val)
常用方法:
public?Biglnteger add(Biglnteger val)
public?Biglnteger subtact(Biglnteger val)
public?Biglnteger nultiply(Biglnteger val)
public?Biglnteger divide(Biglnteger val)
public?Biglnteger[] divideAndRemainder(Biglnteger val)
BigDecimal:由于在運(yùn)算的時(shí)候,float類型和double很容易丟失精度,為了能精確的表示,計(jì)算浮點(diǎn)數(shù),Java提供了BigDecimal,不可變的,任意精度的有符號(hào)十進(jìn)制。
構(gòu)造方法:public?BigDecimal?(String val)
常用方法:
public?BigDecimal?add(BigDecimal augend)
public?BigDecimal subtact(BigDecimal subtrahend)
public?BigDecimal multiply(BigDecimal multitlplicand)
public?BigDecimal divide(BigDecimal divisor)
DecimalFormat:java提供DecimalFormat類,幫你用最塊的速度將數(shù)字格式化為你需要的樣子.
十、MD5工具類
MD5的全稱是Message-Digest Algorithm5(信息摘要算法)
確定信息算法
MessageDigest?md5=MessageDigest.getlnstance("MD5");
JDK1.8新增Base64
String newstr =?Base64.getEncoder().encodeToString(md5.digestBytes("utf-8")));
1.8之前使用sun.misc.BASE64Encoder(此類沒有訪問權(quán)限,在rt.jar中添加訪問權(quán)限:sun/misc/*)
BASE64Encoder base64Encoder();
base64.encode(md5.digest(str.getBytes("uft-8)));
package com.common.tools;import java.security.MessageDigest;public abstract class MD5Tools{ public final static String MD5(String pwd) { //用于加密的字符 char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { //使用平臺(tái)的默認(rèn)字符集將此 String 編碼為 byte序列,并將結(jié)果存儲(chǔ)到一個(gè)新的 byte數(shù)組中 byte[] btInput = pwd.getBytes(); //信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),并輸出固定長度的哈希值。 MessageDigest mdInst = MessageDigest.getInstance("MD5"); //MessageDigest對(duì)象通過使用 update方法處理數(shù)據(jù), 使用指定的byte數(shù)組更新摘要 mdInst.update(btInput); // 摘要更新之后,通過調(diào)用digest()執(zhí)行哈希計(jì)算,獲得密文 byte[] md = mdInst.digest(); // 把密文轉(zhuǎn)換成十六進(jìn)制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { // i = 0 byte byte0 = md[i]; //95 str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5 str[k++] = md5String[byte0 & 0xf]; // F } //返回經(jīng)過加密后的字符串 return new String(str); } catch (Exception e) { return null; } }}package com.common.tools;import java.security.MessageDigest;/** * MD5加密工具類 * */public abstract class MD5Tools{ public final static String MD5(String pwd) { //用于加密的字符 char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { //使用平臺(tái)的默認(rèn)字符集將此 String 編碼為 byte序列,并將結(jié)果存儲(chǔ)到一個(gè)新的 byte數(shù)組中 byte[] btInput = pwd.getBytes(); //信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),并輸出固定長度的哈希值。 MessageDigest mdInst = MessageDigest.getInstance("MD5"); //MessageDigest對(duì)象通過使用 update方法處理數(shù)據(jù), 使用指定的byte數(shù)組更新摘要 mdInst.update(btInput); // 摘要更新之后,通過調(diào)用digest()執(zhí)行哈希計(jì)算,獲得密文 byte[] md = mdInst.digest(); // 把密文轉(zhuǎn)換成十六進(jìn)制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { // i = 0 byte byte0 = md[i]; //95 str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5 str[k++] = md5String[byte0 & 0xf]; // F } //返回經(jīng)過加密后的字符串 return new String(str); } catch (Exception e) { return null; } }}十一、數(shù)據(jù)結(jié)構(gòu)之二叉樹實(shí)現(xiàn)
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為節(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu)。二叉樹(Binary Tree)是每個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹的有序樹。通常子樹被稱作“左子樹”和“右子樹”。
二叉樹的分類及特點(diǎn):
(1)完全二叉樹
完全二叉樹是二叉樹的-一個(gè)分類,它的特點(diǎn)是每個(gè)節(jié)點(diǎn)的孩子節(jié)點(diǎn)的數(shù)量可以是0,1, 2個(gè),除此之外它要求每層節(jié)點(diǎn)添加,必須是從左到右,不允許跳著添加。
(2)滿二叉樹(Full Binary tree)
滿二叉樹它的特點(diǎn)是每個(gè)節(jié)點(diǎn)的孩子節(jié)點(diǎn)要么沒有,要么就是兩個(gè),不允許出現(xiàn)單個(gè)孩子的情況。
(3)二叉搜索樹(Ordered Binary Tree )
也稱二叉排序樹,這個(gè)是我們接觸的最多的一種結(jié)構(gòu), 它要求節(jié)點(diǎn)的左子樹小于該節(jié)點(diǎn)本身,右子樹大于該節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都符合這樣的規(guī)則,對(duì)二叉搜索樹進(jìn)行中序遍(左中右)歷就得到一個(gè)有序的序列
(4)均衡二叉樹( Balanced Binary Tree)
均衡二叉樹指的是-一個(gè)節(jié)點(diǎn)的左右子樹的高度差值不能大于1,均衡二叉樹一般都是在二叉搜索樹的基礎(chǔ)之上添加自動(dòng)維持平衡的性質(zhì),這種樹的插入,搜索,刪除的綜合效率比較高。
(5)完美二叉樹(Perfect binary Tree)
完美二叉樹是理想中的一種二叉樹,這種樹的特點(diǎn)就是非常完美,每個(gè)節(jié)點(diǎn)都有兩個(gè)孩子節(jié)點(diǎn),并且每層都被完全填充,完美二叉樹的葉子節(jié)點(diǎn)的高度都是一樣。
二叉搜索樹算法的排序規(guī)則:
1、選擇第一個(gè)元素作為根節(jié)點(diǎn)
2、之后如果元素大于根節(jié)點(diǎn)放在右子樹,如果元素小于根節(jié)點(diǎn),則放在左子樹
3、最好按照中序遍歷的方式進(jìn)行輸出,則可以得到排序的結(jié)果(左→根→右)
先序遍歷:根左右
后序遍歷:左右根
如:1、2、3、4、5、6、7、8、9、10
主類:
package com.booy1;public class BinaryTreeTest { public static void main(String[] args) { BinaryTree bt = new BinaryTree(); bt.add(6); bt.add(5); bt.add(9); bt.add(8); bt.add(1); bt.add(7); bt.add(2); bt.print(); }}BinaryTree 類:
package com.booy1;public class BinaryTree { private Node root; //添加節(jié)點(diǎn) public void add(int data){ if(root==null) { root = new Node(data); }else { root.addNode(data); } } //遍歷節(jié)點(diǎn) public void print(){ root.printNode(); } private class Node{ private int data; private Node left; private Node right; public Node(int data ){ this.data = data; } //添加節(jié)點(diǎn) public void addNode(int data){ if(this.data>data) { if(this.left==null) { this.left = new Node(data); }else { this.left.addNode(data); } }else{ if(this.right==null) { this.right = new Node(data); }else { this.right.addNode(data); } } } //遍歷節(jié)點(diǎn) public void printNode(){ if(this.left != null) { this.left.printNode(); } System.out.print(this.data+">"); if(this.right != null) { this.right.printNode(); } } } }/**運(yùn)行結(jié)果:1>2>5>6>7>8>9>*/十二、JDK1.8新特性-Lambda表達(dá)式
1、Lambda表達(dá)式(也稱為閉包)是整個(gè)Java8發(fā)行版中最受期待的Java語言層面上的改變,Lambda允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)或者把代碼看成數(shù)據(jù)。Lambda表達(dá)式用于簡(jiǎn)化Java中接口式的匿名內(nèi)部類。被稱為函數(shù)式接口的概念。函數(shù)式接口就是一個(gè)具有一個(gè)方法的普通接口,像這樣的接口可以被隱式轉(zhuǎn)換為Lambda表達(dá)式。
語法:
(參數(shù)1,參數(shù)2....)->{......}
? (1)沒有參數(shù)時(shí)使用Lambda表達(dá)式
(2)帶參數(shù)時(shí)使用Lambda表達(dá)式
(3)代碼塊中只有一句代碼時(shí)使用Lambda表達(dá)式
(4)代碼塊中有多句代碼時(shí)使用Lambda表達(dá)式
(5)有返回值的代碼塊
(6)參數(shù)中使用final關(guān)鍵字
import java.sql.SQLOutput;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;?//讓代碼更加簡(jiǎn)潔,不會(huì)單獨(dú)生成class文件public class LambdaTest { /** * lambda呈現(xiàn)入口 */ public void exeEntry(String message,HandlerArg handlerArg){ handlerArg.handleEntry(message); } /**??*?聲明一個(gè)接口(只能有一個(gè)抽象方法接口),以lambda的語法來表達(dá)該接口的方法調(diào)用 */ public interface HandlerArg{ public void handleEntry(String message); } /** * 聲明一個(gè)接口,以lambda的語法來表達(dá)該接口的方法調(diào)用 */ public interface HandlerArgs{ public int handleEntry(String message1,String message2); } /** * lambda呈現(xiàn)入口 * */ public int exeEntry(String message1,String message2,HandlerArgs handlerArgs){ return handlerArgs.handleEntry(message1, message2); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(); //一、 //1."msg"為傳入HandlerArg接口的handleEntry方法所需參數(shù),在"->前面";而后面 直接執(zhí)行方法所要做的事; //2.參數(shù)可不聲明參數(shù)類型; //3.單個(gè)參數(shù)不需要被"()"包圍起來; //lambdaTest.exeEntry("the hardest thing is to feel good everyday",msg -> System.out.println(msg)); //二、 //也可以預(yù)先實(shí)現(xiàn)接口,再將接口作為參數(shù)傳遞 //HandlerArg handlerArg = msg -> System.out.println(msg); //lambdaTest.exeEntry("the hardest thing is to feel good everyday",handlerArg); //三、 //多條語句,則直接作為一個(gè)函數(shù)來使用,其實(shí)這里就類似于javaScript的方法傳遞了 //lambdaTest.exeEntry("the hardest thing is to feel good everyday",msg -> { // String strPrefix = "chengxp said:"; // System.out.println(strPrefix + msg); //}); //四、 //多個(gè)參數(shù),并處理后返回結(jié)果// int strsLength = lambdaTest.exeEntry("sdf5745","fgdg", (msg1,msg2) -> {return msg1.length() + msg2.length();});// System.out.println("兩個(gè)字符串長度之和為:" + strsLength); //五、 //例如集合框架中用的比較多的排序,可以這么寫 List strs = new ArrayList<>(); strs.add("bb"); strs.add("cc"); strs.add("dd"); strs.add("aa"); //以前是這么寫的 Collections.sort(strs, new Comparator() { public int compare(String o1, String o2) { return o1.compareTo(o2); } }); //這里也是1.8的遍歷語法。不過試了一下,效率沒有普通的for循環(huán)效率高。 strs.forEach(str -> System.out.println(str)); //用lambda寫 Collections.sort(strs,(s1,s2) -> s1.compareTo(s2)); strs.forEach(str -> System.out.println(str)); }}Java 8 新增了接口的靜態(tài)方法和默認(rèn)方法。即接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法,通過static和default關(guān)鍵字實(shí)現(xiàn)
? ? 靜態(tài)方法和默認(rèn)方法的引進(jìn),解決了接口一旦發(fā)生修改將與現(xiàn)有的實(shí)現(xiàn)不兼容的問題
? ?默認(rèn)方法與靜態(tài)方法并不影響函數(shù)接口的契約,可以任意使用
二、示例
1、接口
package com.xl.infc; public interface Employee { /** * 抽象方法 實(shí)現(xiàn)類必須重寫,必須通過實(shí)現(xiàn)類的實(shí)例來調(diào)用 */ public void say(); /** * 靜態(tài)方法 只能通過接口的接口名來調(diào)用,實(shí)現(xiàn)類可以互不沖突的定義相同的方法并通過實(shí)現(xiàn)類的類名來調(diào)用 */ public static void work() { System.out.println("干活"); } /** * 默認(rèn)方法 必須通過實(shí)現(xiàn)類的實(shí)例來調(diào)用,可以重寫,但不能再加default關(guān)鍵字,且將覆蓋接口中的實(shí)現(xiàn) */ public default void role() { System.out.println("員工"); }}2、實(shí)現(xiàn)
package com.xl.infc; public class Programmer implements Employee { @Override public void say() { System.out.println("上班"); } /** * 實(shí)現(xiàn)類可以定義的和接口相同的靜態(tài)方法,通過類名來調(diào)用 */ public static void work() { System.out.println("擼代碼"); } /** * 重寫接口的默認(rèn)方法,不能再用default關(guān)鍵字修飾,且將覆蓋接口中的實(shí)現(xiàn),且必須通過實(shí)例來調(diào)用 */ @Override public void role() { System.out.println("程序員"); } public static void main(String[] args) { Employee.work(); Programmer.work(); Programmer p = new Programmer(); p.say(); p.role(); } }總結(jié)
以上是生活随笔為你收集整理的stringbuffer常用方法_第八讲:常用类库API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何下载php-5.5.38.tar.g
- 下一篇: c语言保存后怎么打开文件,保存打开文件之