第十五次Java作业
目錄
一、包裝類——引用
1.什么是包裝類
2.對應關系
?3、已經有基本數據類型了,為什么要封裝為包裝類?
4、是不是有了包裝類以后就不用基本數據類型了??
包裝器類
二、自動裝箱、自動拆箱
包裝類-常用方法
?三、日期相關類
java.text.SimpleDateFormat類
引入新的類
JDK1.8新增日期時間API的原因
?四、Math類
?Math的概念
Math類特點
常用方法
?五、Random類
Random對象的生成
Random類中的常用方法
?自行在API文檔中初步了解Random類
六、string類
?String 的常用方法
其他常用方法
String 的內存分析
?StringBuilder類
拼接字符串
?StrinngBuilder 類
?String 和 StringBuilder
常用方法
?String、StringBuffer、StringBuilder區別與聯系
一、包裝類——引用
1.什么是包裝類
java中的數據類型int,double等不是對象,無法通過向上轉型獲取到Object提供的方法,而像String卻可以,只因為String是一個對象而不是一個類型。基本數據類型由于這樣的特性,導致無法參與轉型,泛型,反射等過程。為了彌補這個缺陷,java提供了包裝類
將基本數據類型封裝為類,使得基本數據類型可以以對象的形式進行操作。因為Object類只能接受引用類型,為了讓它能夠接收java中的所有類型,我們引入了包裝類.基本類型在實際應用場景會產生誤導.比如:int 的默認值為0,那如果我們要存的值就是0.
以前定義變量,經常使用基本數據類型對于基本數據類型來說,它就是一個數,加點屬性,加點方法,加點構造器將基本數據類型對應進行了一個封裝,產生了一個新的類,---》包裝類。
int,byte..--->基本數據類型包裝類--->引用數據類型
2.對應關系
基本數據類型 ? ? ? ? ? ?對應的包裝類 ? ? ? ? ? ? ?繼承關系?
? ? ? ?byte ? ? ? ? ? ? ? ? ? ? ? ? Byte ? ? ? ? ? ? ? ? ? ?--》Number---》Obiect?
? ? ? ?short ? ? ? ? ? ? ? ? ? ? ? ?Short ? ? ? ? ? ? ? ? ?--》Number---》Object?
? ? ? ?int ? ? ? ? ? ? ? ? ? ? ? ? ? ?Integer ? ? ? ? ? ? ? --》Number---》Object?
? ? ? Long ? ? ? ? ? ? ? ? ? ? ? ?long ? ? ? ? ? ? ? ? ? ?--》 Number---》Object?
? ? ? float ? ? ? ? ? ? ? ? ? ? ? ? ?Float ? ? ? ? ? ? ? ? ? --》Number---》Object?
? ? ? double ? ? ? ? ? ? ? ? ? ? Double ? ? ? ? ? ? ? ?---》Number---》Object?
? ? ? char ? ? ? ? ? ? ? ? ? ? ? ? Character ? ? ? ? ? ? ?Object?
? ? ? boolean ? ? ? ? ? ? ? ? ? ?Boolean ? ? ? ? ? ? ? ? Object
?3、已經有基本數據類型了,為什么要封裝為包裝類?
(1)java語言面向對象的語言,最長的操作各種各樣的類
(2)以前學習裝數據的數組?nt String doublel Student
(3)以后學習的裝數據的集合,有一個特點,只能裝引用數據類型的數據
4、是不是有了包裝類以后就不用基本數據類型了??
不是
包裝類-常用屬性-常用構造器
1.Integer 類中的構造方法有以下兩個:
Integer(int value):構造一個新分配的 Integer 對象,它表示指定的 int 值。
Integer(String s):構造一個新分配的 Integer 對象,它表示 String 參數所指示的 int 值。
integer常用方法?
子類構造方法總是先調用父類構造方法。
默認情況下,調用父類無參構造方法。
可以在子類構造方法的第一行,使用super關鍵字調用父類任意一個構造方法。
package com.imooc.collection; public class test01 {public static void main(String[] args) {//主函數//屬性System.out.println(Integer.MAX_VALUE); //最大值System.out.println(Integer.MIN_VALUE); //最小值//“物極必反”原理:System.out.println(Integer.MAX_VALUE+1); //最大值System.out.println(Integer.MIN_VALUE-1); //最小值} }?
??number類
Number 是一個抽象類,也是一個超類(即父類)。Number 類屬于 java.lang 包,所有的包裝類(如 Double、Float、Byte、Short、Integer 以及 Long)都是抽象類 Number 的子類。
?Byte 類提供了兩種構造方法的重載形式來創建 BYTE 類對象:
?Byte(byte value) 通過這種方法創建的 byte 對象,可表示指定的 byte值。
??包類-構造器
包裝器類
在Java中基本數據類型不是類,不能創建對象,這不符合面對對象編程的思想,所有從JDK1開始,Java提供了包裝器類,它將基本數據類型包裝成類,這些類是Byte,Short,Integer,Long,Float,Double(這些數值類都繼承了一個抽象類Number),Character
package com.imooc.collection; public class test01 { public static void main(String[] args) {//主函數//構造器Integer i1= new Integer(12); //調用System.out.println("i1.toString()");//輸出12} }??
String類型作為構造器的參數
取決于調用函數式接口里面的抽象方法時傳入的參數類型,比如上面代碼我們調用Converter類的convert方法,實際傳入一個String類型的參數,那么這個參數將會傳入到String的使用String類型作為參數的構造器中,上面的構造器引用將調用String類的,帶一個String參數的構造器。?
Integer i2= new Integer("12"); //調用
Integer i3= new Integer("abcdef");//調用方法
二、自動裝箱、自動拆箱
自動裝箱和拆箱從Java 1.5開始引入,目的是將原始類型值轉自動地轉換成對應的對象。自動裝箱與拆箱的機制可以讓我們在Java的變量賦值或者是方法調用等情況下使用原始類型或者對象類型更加簡單直接。
//自動裝箱 Integer total = 99;
//自動拆箱int totalprim = total;?
包裝器類的這個新特性是JDK5以后出現的,在使用包裝器類時可以直接賦對應的值,虛擬機會將值自動裝箱為對應的包裝器類,同樣可以將包裝器類當做基本數據類型使用,虛擬機會自動拆箱為對應的基本數據類型。?
package com.imooc.collection; public class test01 {public static void main(String[] args) {//主函數//自動裝箱:int--->IntegerInteger i =12; //Integer類型System.out.println(i);//輸出結果//自動拆箱:Integer--->intInteger i2 = new Integer(12);//int類型int num = 12;//Integer--->intSystem.out.println(i);//輸出結果} }?
?
?(1)?自動裝箱? ?自動拆箱? 是從jdk1.5以后新出的特征
(2)自動裝箱? ? ? 自動拆箱 :將基本數據類型和包裝類進行快速的類型轉換
public class W10 {//創建類public static void main(String[] args) {//主函數// TODO Auto-generated method stub//compareTo:只返回三個值:要么是0,-1,1 Integer i1=new Integer(value: 6); //傳入值Integer i2= new Integer(value: 12); //傳入值System.out.println(i1.compareTo(i2));//輸出結果// return(x<y)?-1∶((x==y)? 0 :1);}}?
包裝類-常用方法
包裝類常用的方法如下: 包裝類主要是兩種方法,一種是本類型和其它類型之間進行轉換,另一種是字符串和本類型以及基本類型之間的轉換的方法前五種是本類型和其他類型之間的轉換,后三種是字符串和本類型以及基本類型之間的轉換。
/* * 返回一個表示指定的 int 值的 Integer 實例。如果不需要新的 Integer 實例,則 * 通常應優先使用該方法,而不是構造方法 Integer(int),因為該方法有可能通過 * 緩存經常請求的值而顯著提高空間和時間性能。 * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); }?可以看到對于范圍在-128到127的整數,valueOf方法做了特殊處理。?
采用IntegerCache.cache[i + offset]這個方法。?
?這就是valueOf方法真正的優化方法,當-128=<i<=127的時候,返回的是IntegerCache中的數組的值;當 i>127 或 i<-128 時,返回的是Integer類對象
?三、日期相關類
在 Java 中獲取當前時間,可以使用?java.util.Date 類和 java.util.Calendar 類完成。 其中, Date 類主要封裝了系統的日期和時間的信息,Calendar 類則會根據系統的日歷來解釋 Date 對象 。
java.util.Date 類
package com.imooc.collection; import java.util.Date; public class Test041 {//這是一個main方法·是程序的人口:public static void main(String[] args){//java.util.Date:Date d=new Date(); System.out.println(d);System.out.println(d.toString());System.out.println(d.toGMTString());//過期方法·過時方法·廢棄方法。 System.out.println(d.toLocaleString());System.out.println(d.getYear());//122+1900=2022System.out.println(d.getMonth());//5:返回的值在日和11之間·值日表示1月//返回自1970年1月1日00:00:00GMT以來此Date對象表示的毫秒數。 System.out.println(d.getTime());//1592055964263 System.out.println(System.currentTimeMillis());/*(1)疑問:以后獲取時間差用:getTime()還是currentTimeMiLLis()答案:currentTimeMillis()--》因為這個方法是靜態的,可以類名,方法名直接調用(2)public static native long currentTimeMillis();本地方法為什么沒有方法體?因為這個方法的具體實現不是通過java寫的。*/ }}從前臺過來的日期數據一般都是有格式的String,需要轉換成util.Date類型
String-->sql.Date
sql.Date-->util.Date
局限性:日期必須是規定格式!
引入新類DateFormat
?java.sql.Date
Java中的java.sql.Date類適用于JDBC(數據庫連接)API,如果你需要往java.sql.PreparedStatement中設置日期,或從java.sql.ResultSet中讀取日期,你會用到java.sql.Date的。
long time = System.currentTimeMillis();
java.sql.Date date = new java.sql.Date(time);
package com.imooc.collection; import java.sql.Date; public class test {public static void main(String[] args){//java.sql.Date:Date d = new Date(1592055964263L);System.out.println(d);/*(1)java.sql.Date和java.util.Date的區別:java.util.Date: 年月日 時分秒java.sql.Date: 年月日(2)java.sql.Date和java.utilDate的聯系:java.sql.Date(子類) extends java.util.Date(父類)*///java.sql.Date和java.util.Date相互轉換://【1】util--->sqL:java.util.Date date = new Date(1592055964263L);//創建util.Date的對象//方式1:向下轉型Date date1=(Date) date;/*父類:Animal 子類:DogAnimal an =new Dog();bog d=(Dog)an;*///方式2:利用構造器Date date2 = new Date(date.getTime());//【2】sql-->util:java.util.Date date3=d;//[3]String--->sqL.Date:Date date4 = Date.valueOf("2020-5-7");} }?Calendar
Calendar是一個抽象類,不能直接創建對象,使用子類實現
可以使用靜態方法Calendar.getInstance()創建。
常用方法:get(),set()
一個Calendar的實例是系統時間的抽象表示,通過get(int field)方法來取得想要的時間信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND。?
java.text.SimpleDateFormat類
Date類的API不易于國際化,大部分被廢棄了,java.text.SimpleDateFormat類是一個不與語言環境有關的方式來格式化和解析日期的具體類。其允許進行①格式化:日期—>字符串、②解析:字符串—>日期。
String---》java.util.Date類型轉換:
分解:
(1)String--->java.sql.Date
(2)java.sql.Date--->java.util.Date
?插入數據庫時,存入當前日期,需要格式轉換
import java.text.SimpleDateFormat;
formatter = new SimpleDateFormat( "yyyy-MM-dd ");
String date = formatter.format(new Date());//格式化數據,取當前時間結果為 2014-10-30
String格式的數據轉化成Date格式
import java.text.SimpleDateFormat;
formatter = new SimpleDateFormat( "yyyy-MM-dd ");
String s = "2011-07-09 ";?
Date date = formatter.parse(s);
String直接轉sql.Date——valueOf()
java.sql.Date類的方法接受以JDBC轉義格式(yyyy-mm-dd)表示日期的String值,并進行轉換
將給定的String值轉換為Date對象。
package com.imooc.collection; public class Test04 {//這是一個main方法,是程序的入口:public static void main(String[] args) {// (1)string--->java.sql.Datejava.sq1.Date date = java.sq1.Date.valueOf("2015-9-24");//(2)java.sgl.Date--->java.util.Date java.util.Date date2 = date;System.out.println(date2.toString());}}?DateTimeFormatter?自定義格式
用于轉換LocalDateTime等與String轉換的定義和規范.
引入新的類
package com.imooc.collection;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class Test05 {//這是一個main方法,是程序的入口:public static void main(String[] args){//日期轉換://SimpleDateFormat(子類) extends DateFormat(父類是一個抽象類)//格式化的標準已經定義好了:DateFormat df =new SimpleDateFormat( "yyyy-MM-ddHH:mm:ss");//String--->Datetry {Date d=df.parse( "2019-4-6 12:23:54"); System.out.println(d);} catch (ParseException e){e.fillInStackTrace();}//Date--->StringString format=df.format(newDate()); System.out.println(format);Date date = new Date();System.out.println(date.toString()); System.out.println(date.toGMTString());System.out.println(date.toLocaleString());}private static Date newDate() {// TODO Auto-generated method stubreturn null;}} package com.imooc.collection; import java.sql.Date; import java.util.Calendar; import java.util.Scanner;public class deta {public static void main(String[] args) {//獲取日期System.out.println("請輸入你想要查看的日期(提示:格式為1990-2-5):");Scanner sc = new Scanner(System.in);String strDate = sc.next();Date date = Date.valueOf(strDate);Calendar cal = Calendar.getInstance();cal.setTime(date);//打印信息int nowday = cal.get(Calendar.DAY_OF_MONTH);System.out.println("日\t一\t二\t三\t四\t五\t六");for (int i = 0; i < cal.get(Calendar.DAY_OF_MONTH); i++) {//對齊一號是星期幾System.out.print("\t");}for (int i = 1; i <= cal.getActualMaximum(Calendar.DATE); i++) {//遍歷該月String day = i+"";if(i<=9){ //為了對齊一位數兩位數day = i+" ";}if (i==nowday){ //在指定日期打星號day = i+"";System.out.print(day+"*"+"\t");continue;}cal.set(Calendar.DATE,i);if (cal.get(Calendar.DAY_OF_WEEK)==7){ //在換行時換行System.out.println(day+"\t");continue;}System.out.print(day+"\t"); //正常日期}} }JDK1.8新增日期時間API的原因
1、java.util.Date 是從 JDK 1.0 開始提供,易用性差
默認是中歐時區(Central Europe Time)
起始年份是 1900 年? ? 起始月份從 0 開始? 對象創建之后可修改
2、JDK 1.1 廢棄了 Date 中很多方法,新增了并建議使用 java.util.Calendar 類
相比 Date 去掉了年份從 1900 年開始? ? 月份依然從 0 開始? ?選用 Date 或 Calendar,讓人更困擾
3、為了解決 JDK 中時間與日期較難使用的問題,JDK 1.8 開始,吸收了 Joda-Time 很多功能,新增 java.time 包,加了新特性:
區分適合人閱讀的和適合機器計算的時間與日期類
日期、時間及對比相關的對象創建完均不可修改? ? 可并發解析與格式化日期與時間? ? ? 支持設置不
同的時區與歷法
DK1.1引入Calendar類--》第二批日期時間API
缺陷:
可變性:像日期和時間這樣的類應該是不可變的。
偏移性:Date中的年份是從1900開始的,而月份都從0開始。
格式化:格式化只對Date有用,Calendar則不行。
JDK1.8新增日期時間API--》第三批日期時間API
JDK1.8新增日期時間API -?LocaLDate,LocaLTime,LocalDateTime
LocaLDate:日期
LocaLTime:時間
LocalDateTime:日期+時間
package com.imooc.collection; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; public class test09 {//這是一個main方法,是程序的入口:public static void main(String[] args) {//1.完成實例化:// 方法1:now()--獲取當前的日期,時間 日期+時間LocalDate localDate=LocalDate.now();System.out.println(localDate);LocalTime localTime = LocalTime.now();System.out.println(localTime);LocalDateTime localDateTime=LocalDateTime.now();System.out.println(localDateTime);//方法2:of()--設置指定的日期,時間,日期+時間LocalDate of = LocalDate.of(2010,5,6);System.out.println(of);LocalTime of1 = LocalTime.of(12,35,56);System.out.println(of1);LocalDateTime of2 = LocalDateTime.of(1890,12,23,13,24,15);System.out.println(of2);//LocaLDate,LocaLTime用的不如LocalDateTime多// 下面講解用LocaLDateTime:// 一系列常用的get***System.out.println(localDateTime.getYear());//年System.out.println(localDateTime.getMonth());//月(英語)System.out.println(localDateTime.getMonthValue());//月(數字)System.out.println(localDateTime.getDayOfMonth());//日System.out.println(localDateTime.getDayOfWeek());//星期System.out.println(localDateTime.getHour());//時System.out.println(localDateTime.getMinute());//分System.out.println(localDateTime.getSecond());//秒//不是set方法,叫with//體會:不可變性LocalDateTime localDateTime2=localDateTime.withMonth(8);System.out.println(localDateTime);System.out.println(localDateTime2);//提供了加減的操作:// 加:LocalDateTime localDateTime1=localDateTime.plusMonths(4);System.out.println(localDateTime);System.out.println(localDateTime1);//減:LocalDateTime localDateTime3=localDateTime.minusMonths(5);System.out.println(localDateTime);System.out.println(localDateTime3);}}?DateTimeFormatter
?使用舊的Date對象時,我們用**SimpleDateFormat**進行格式化顯示。使用新的LocalDateTime或ZonedLocalDateTime時,我們要進行格式化顯示,就要使用DateTimeFormatter。
和SimpleDateFormat不同的是,DateTimeFormatter不但是不變對象,它還是線程安全的。
因為SimpleDateFormat不是線程安全的,使用的時候,只能在方法內部創建新的局部變量。
而DateTimeFormatter可以只創建一個實例,到處引用。
ava 8使用線程安全類對date / Time API進行了大修,該類替換了笨拙的date和calendar類。這也向我們介紹了DateTimeFormatter類,這與舊API中的simpledateFormat相反
package com.imooc.collection; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.time.temporal.TemporalAccessor;public class test010 {//這是一個main方法,是程序的入口:public static void main(String[] args) {//格式化類:DateTimeFormatter//方式一:預定義的標準格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIMEDateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;//df1就可以幫我們完成LocalDateTime和string之間的相互轉換:// LocalDateTime-->String:LocalDateTime now=LocalDateTime.now();String str = df1.format(now);System.out.println(str);//2020-06-15T15:02:51.29//String--->LocalDateTimeTemporalAccessor parse = df1.parse("2020-06-15T15:02:51.29");System.out.println(parse);//方式二:本地化相關的格式。如:ofLocalizedDateTime()//參數:FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT// FormatStyle.LONG:2020年6月15日下午03時17分13秒// FormatStyle.MEDIUM:2022年5月7日 下午9:13:25// FormatStyle.SHORT:2022/5/7 下午9:02DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);//LocalDateTime-->String:LocalDateTime now1 = LocalDateTime.now();String str2 = df2.format(now1);System.out.println(str2);//String--->LocalDateTimeTemporalAccessor parse1 = df2.parse("2022/5/7 下午9:02");System.out.println(parse1);//方式三:自定義的格式。如:ofPattern("yyyy-MM-dd hh:mm:ss")---》重點,以后常用DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm;ss");//LocalDateTime-->String:LocalDateTime now2 = LocalDateTime.now();String format = df3.format(now2);System.out.println(format);//2020-06-15 03:22:03//String--->LocalDateTimeTemporalAccessor parse2 = df3.parse("2022-05-07 09:15;34");System.out.println(parse2);} }?四、Math類
?Math的概念
類包含用于執行基本數學運算的方法
Math 類包含用于執行基本數學運算的方法,如初等指數、對數、平方根和三角函數。
Math所有類都是靜態的。可以直接類名。調用。
Math類特點
由于Math類在java.lang包下,所以不需要導包。
因為它的成員全部是靜態的,所以私有了構造方法
?Java中的 +、-、*、/ 和 % 等基本算術運算符不能進行更復雜的數學運算,例如,三角函數、對數運算、指數運算等。于是 Java 提供了 Math 工具類來完成這些復雜的運算
?Math 類中包含 E 和 PI 兩個靜態常量,正如它們名字所暗示的,它們的值分別等于 e(自然對數)和 π(圓周率)
常用方法
System.out.println("隨機數:"+Math.random());
System.out.println("絕對值:"+Math.abs(-5.6));
System.out.println("進一:"+Math.ceil(9.1));
System.out.println("舍一:"+Math.floor(9.9));
System.out.println("四舍五入:"+Math.round(9.9));
System.out.println("取最大:"+Math.max(3,9));
System.out.println("取最小:"+Math.min(9,28));
?
?直接使用,無需導包:
package java.lang;
final修飾類,這個類不能被繼承:
public final class Math {?
}
構造器私有化,不能創建Math類的對象:
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
Math內部的所有的屬性,方法都被static修飾:類名.直接調用,無需創建對象:
?五、Random類
Random類中實現的隨機算法是偽隨機,也就是有規則的隨機。在進行隨機時,隨機算法的起源數字稱為種子數(seed),在種子數的基礎上進行一定的變換,從而產生需要的隨機數字。相同種子數的Random對象,相同次數生成的隨機數字是完全相同的。也就是說,兩個種子數相同的Random對象,第一次生成的隨機數字完全相同,第二次生成的隨機數字也完全相同。這點在生成多個隨機數字時需要特別注意。
Random對象的生成
Random類包含兩個構造方法,下面依次進行介紹:
(1)public Random()
該構造方法使用一個和當前系統時間對應的相對時間有關的數字作為種子數,然后使用這個種子數構造Random對象。
(2)public Random(long seed)
該構造方法可以通過制定一個種子數進行創建。
示例代碼:
Random r = new Random();
Random r1 = new Random(10);
再次強調:種子數只是隨機算法的起源數字,和生成的隨機數字的區間無關。
Random類中的常用方法
Random類中的方法比較簡單,每個方法的功能也很容易理解。需要說明的是,Random類中各方法生成的隨機數字都是均勻分布的,也就是說區間內部的數字生成的幾率是均等的。下面對這些方法做一下基本的介紹:
(1)public boolean nextBoolean()
該方法的作用是生成一個隨機的boolean值,生成true和false的值幾率相等,也就是都是50%的幾率。
(2)public double nextDouble()
該方法的作用是生成一個隨機的double值,數值介于[0,1.0)之間。
(3)public int nextInt()
該方法的作用是生成一個隨機的int值,該值介于int的區間,也就是-231到231-1之間。
如果需要生成指定區間的int值,則需要進行一定的數學變換,具體可以參看下面的使用示例中的代碼。
(4)public int nextInt(int n)
該方法的作用是生成一個隨機的int值,該值介于[0,n)的區間,也就是0到n之間的隨機int值,包含0而不包含n。
如果想生成指定區間的int值,也需要進行一定的數學變換,具體可以參看下面的使用示例中的代碼。
(5)public void setSeed(long seed)
該方法的作用是重新設置Random對象中的種子數。設置完種子數以后的Random對象和相同種子數使用new關鍵字創建出的Random對象相同。
??
?自行在API文檔中初步了解Random類
不管是無參數構造Random,還是Math類的random方法,最后底層都是到Random類的有參構造中。
六、string類
String表示字符串類型,屬于引用數據類型,不屬于基本數據類型
?tring是C++標準庫的一個重要的部分,主要用于字符串處理。可以使用輸入輸出流方式直接進行string操作,也可以通過文件等手段進行string操作。同時,C++的算法庫對string類也有著很好的支持,并且string類還和c語言的字符串之間有著良好的接口
?我們知道輸出格式化數字可以使用 printf() 和 format() 方法。
String 類使用靜態方法 format() 返回一個String 對象而不是 PrintStream 對象。
String 類的靜態方法 format() 能用來創建可復用的格式化字符串,而不僅僅是用于一次打印輸出
?String 的常用方法
length()字符串的長度
?charAt()截取一個字符
getchars()截取多個字符并由其他字符串接收
getBytes()將字符串變成一個byte數組
toCharArray()將字符串變成一個字符數組
equals()和equalsIgnoreCase()比較兩個字符串是否相等,前者區分大小寫,后者不區分
startsWith()和endsWith()判斷字符串是不是以特定的字符開頭或結束
toUpperCase()和toLowerCase()將字符串轉換為大寫或小寫
concat()?連接兩個字符串
trim()去掉起始和結束的空格
substring()截取字符串
indexOf()和lastIndexOf()前者是查找字符或字符串第一次出現的地方,后者是查找字符或字符串最后一次出現的地方
?compareTo()和compareToIgnoreCase()按字典順序比較兩個字符串的大小,前者區分大小寫,后者不區分
?replace() 替換
String類實現了Comparable,里面有一個抽象方法叫compareTo,所以String中一定要對這個方法進行重寫:
String s8 = new string("abc");
String s9 = new string("abc");
System.out.println(s8.compareTo(s9));?
其他常用方法
String 中常見 的方法 》字符串 的其他 用法:?*length (): 獲取當前字符串 的 長度 (返回整數)?例子: String str = "I love java!"; int count = str.length (); System.out.println (num);?
//字符串的截取:
String s10 = "abcdefhijk";
System.out.println(s10.substring(3));
System.out.println(s10.substring(3,6));//[3,6)
//字符串的合并/拼接操作:
System.out.println(s10.concat("pppp"));
//字符串中的字符的替換:
String s11 = "abcdeahija";
System.out.println(s11.replace( oldChar: 'a', newChar: 'u'));
String 的內存分析
String在常量池中放置了一個變量,如果后續有結果相同的變量那就不會在增加一個變量,比如String s = "abc";后續如果再來了一個String s1 = "ab"+"c",常量池中也只會有一個"abc",不會有兩個。但是注意使用String(String original)構造的String對象則不同。
?StringBuilder類
可變字符串類有:StringBuilder類,StringBuffer類
不可變字符串類:String類
?StringBuilder sb = new StringBuilder();//表面是空的構造器,底層對value數組初始化長度16
StringBuilder sb1 = new StringBuilder(3);//底層對value數組初始化長度為3
StringBuilder sb2 = new StringBuilder("abc");//底層對value數組初始化長度為3
sb2.append("aaa").append("bbbbbb").append("ccccccccc").append("ddddddddddddd");//鏈式調用 ?return this
拼接字符串
public class Test02 {//這是一個main方法,是程序的入口: public static void main(string[] args) {String s1 = "a"+"b"+"c";String s2 = "ab"+"c"; string s3 = "a"+"bc";String s4 = "abc";String s5 = "abc"+"".}}?上面的字符串,會進行編譯器優化,直接合并成為完整的字符串,我們可以反編譯驗證
??然后在常量池中,常量池的特點是第一次如果沒有這個字符串,就放進去,如果有這個字符串,就直接從常量池中取
?new關鍵字創建對象
?String s6 = new string("abc");
public class Test03 {//這是一個main方法,是程序的入口: public static void main(string[] args) {String a ="abc".String b = a + "def";System.out.println(b);} }?StrinngBuilder 類
String內容是不可變的,StringBuilder內容是可變的
StringBuilder又稱為可變字符序列(不再創建新的String對象),它是一個類似于 String 的字符串緩沖區,通過某些方法調用可以改變該序列的長度和內容。
原來StringBuilder是個字符串的緩沖區,即它是一個容器,容器中可以裝很多字符串。并且能夠對其中的字符串進行各種操作。
它的內部擁有一個數組用來存放字符串內容,進行字符串拼接時,直接在數組中加入新內容。StringBuilder會自動維護數組的擴容。默認16字符空間,超過自動擴充)
StringBuilder底層:非常重要的兩個屬性
?
package com.imooc.collection;public class Test02 {//這是一個main方法,是程序的入口:public static void main(String[] args) {//創建StrinqBullder的對象:StringBuilder sb3 = new StringBuilder();//表面上調用StrinqBuilder的空構造器,實際底層是對value數組進行初始化,長度為16StringBuilder sb2 =new StringBuilder(3);//表面上調用StringBuilder的有參構造器,傳入一個int類型的數,實際底層就是對 ivalue數組進行初始化,長度為你傳入的數字StringBuilder sb = new StringBuilder("abc");sb.append("def") . append("aaaaaaaa"). append("bbb").append("ooooooo");//鏈式調用方式: return thisSystem.out.println(sb.append("def") . append("aaaaaaaa"). append("bbb").append("ooooooo"));}}?String 和 StringBuilder
package com.imooc.collection;public class Test02 {//這是一個main方法,是程序的入口: public static void main(String[] args) {StringBuilder sb = new StringBuilder();System.out.println(sb.append("abc")==sb.append("def"));}}?
常用方法
package com.imooc.collection;public class Test02 {//這是一個main方法,是程序的入口:public static void main(String[] args) {StringBuilder sb=new StringBuilder("nihaojavawodeshijie");//增sb.append("這是夢想");System.out.println(sb);//nihaojavawodeshijie這是夢想// 刪sb.delete(3, 6);//刪除位置在[3,6)上的字符System.out.println(sb);//nihavawodeshijie這是夢想sb.deleteCharAt(16);//刪除位置在16上的字符System.out.println(sb);//nihavawodeshijie是夢想//改-->插入StringBuilder sb1=new StringBuilder("$23445980947");sb1.insert(3, ",");//在下標為3的位置上插入,System.out.println(sb1);StringBuilder sb2=new StringBuilder("$2你好嗎5980947");//改-->替換sb2.replace(3,5,"我好累");//在下標[3,5)位置上插入字符串System.out.println(sb2);sb.setCharAt(3,'!');System.out.println(sb);//查StringBuilder sb3=new StringBuilder("asdfa");for (int i = 0; i<sb3.length(); i++) {System.out.print(sb3.charAt(i)+"\t");}System.out.println();//截取String str=sb3.substring(2,4);//截取[2,4)返回的是一個新的String,對StringBuilder沒有影響System.out.println(str);System.out.println(sb3);}} package com.imooc.collection;public class Test02 {//這是一個main方法,是程序的入口:public static void main(String[] args) {StringBuffer sb=new StringBuffer("nihaojavawodeshijie");//增sb.append("這是夢想");System.out.println(sb);//nihaojavawodeshijie這是夢想// 刪sb.delete(3, 6);//刪除位置在[3,6)上的字符System.out.println(sb);//nihavawodeshijie這是夢想sb.deleteCharAt(16);//刪除位置在16上的字符System.out.println(sb);//nihavawodeshijie是夢想//改-->插入StringBuilder sb1=new StringBuilder("$23445980947");sb1.insert(3, ",");//在下標為3的位置上插入,System.out.println(sb1);StringBuilder sb2=new StringBuilder("$2你好嗎5980947");//改-->替換sb2.replace(3,5,"我好累");//在下標[3,5)位置上插入字符串System.out.println(sb2);sb.setCharAt(3,'!');System.out.println(sb);//查StringBuilder sb3=new StringBuilder("asdfa");for (int i = 0; i<sb3.length(); i++) {System.out.print(sb3.charAt(i)+"\t");}System.out.println();//截取String str=sb3.substring(2,4);//截取[2,4)返回的是一個新的String,對StringBuffer沒有影響System.out.println(str);System.out.println(sb3);}}?String、StringBuffer、StringBuilder區別與聯系
StringBuffer與StringBuilder雖也是final,但都是繼承自AbstractStringBuilder,其append實現方法都是重寫AbstractStringBuilder里的
而StringBuilder的方法沒有加synchronized,在多線程下是不安全的。
線程安全與不安全造成了StringBuilder與StringBuffer在效率方面有區別。
這三者的速度排序是這樣的:
String<StringBuffer<StringBuilder
所以,在經常要操作字符串的情況下,多線程下,盡量用StringBuffer,單線程下,則盡量使用StringBuilder
1、tring類是不可變類,即一日一個String對象被創建后,包含在這個對象中的字符序列是不可改變的,直至這個對象銷毀。
2、StringBuffer類則代表一個字符序列可變的字符串,可以通過append、insert、reverse、setChartAt、setLength等方法改變其內容。一旦生成了最終的字符串,調用toString方法將其轉變為String。
3、JDK1.5新增了一個StringBuilder類,與StringBuffer相似,構造方法和方法基本相同。不同是StringBuffer是線程安全的,而StringBuilder是線程不安全的,所以性能略高。通常情況下,創建一個內容可變的字符串,應該優先考慮使用StringBuilder
??三者共同之處:都是final類,不允許被繼承,主要是從性能和安全性上考慮的,因為這幾個類都是經常被使用著,且考慮到防止其中的參數被參數修改影響到其他的應用
StringBuffer是線程安全,可以不需要額外的同步用于多線程中;
? ? ? ?StringBuilder是非同步,運行于多線程中就需要使用著單獨同步處理,但是速度就比StringBuffer快多了;
? ? ? ?StringBuffer與StringBuilder兩者共同之處:可以通過append、indert進行字符串的操作。
? ? ? ?String實現了三個接口:Serializable、Comparable、CarSequence
? ? ? ?StringBuilder只實現了兩個接口Serializable、CharSequence,相比之下String的實例可以通過compareTo方法進行比較,其他兩個不可以。
StringBuilder:JDK1.5開始 效率高線程不安全
StringBuffer:JDK1.0開始效率低線程安全?
總結
以上是生活随笔為你收集整理的第十五次Java作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 清除布局缓存,andro
- 下一篇: 微点主动防御软件测试自学,微点主动防御系