JAVA基礎學習-數字與字串學習總結
9.1 裝箱拆箱
-
封裝類
所有的 基本型別,都有對應的 類型別。比如int對應的類是Integer,這種類就叫做封裝類。
package digit
;
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
int i
=
5
;
//把一個基本型別的變數,轉換為Integer型別
Integer it
=
new
Integer
(i
)
;
//把一個Integer物件,轉換為一個基本型別的int
int i2
= it
.
intValue
(
)
;
}
}
-
Number類
數字封裝類有Byte,Short,Integer,Long,Float,Double。這些類都是抽象類Number的子類。
-
自動裝箱與拆箱
不需要呼叫構造方法,通過**=**符號自動把 基本型別 轉換為 類型別 就叫裝箱
不需要呼叫Integer的intValue方法,通過**= 就自動轉換成int型別**,就叫拆箱
package digit
;
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
int i
=
5
;
//基本型別轉換成封裝型別
Integer it
=
new
Integer
(i
)
;
//自動轉換就叫裝箱
Integer it2
= i
;
//封裝型別轉換成基本型別
int i2
= it
.
intValue
(
)
;
//自動轉換就叫拆箱
int i3
= it
;
}
}
-
int的最大值和最小值
int的最大值可以通過其對應的封裝類Integer.MAX_VALUE獲取
package digit
;
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
//int的最大值
System
.out
.
println
(Integer
.
MAX_VALUE
)
;
//int的最小值
System
.out
.
println
(Integer
.
MIN_VALUE
)
;
}
9.2字串轉換
-
數字轉成字串
方法1: 使用String類的靜態方法 valueOf 方法2: 先把基本型別裝箱為物件,然後呼叫物件的 toString
package digit
;
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
int i
=
5
;
//方法1
String str
= String
.
valueOf
(i
)
;
//方法2
Integer it
= i
;
String str2
= it
.
toString
(
)
;
}
}
-
字串轉成數字
呼叫Integer的靜態方法 parseInt
package digit
;
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
String str
=
"999"
;
int i
= Integer
.
parseInt
(str
)
;
System
.out
.
println
(i
)
;
}
}
-
練習
把浮點數 3.14 轉換為 字串 "3.14" 再把字串 “3.14” 轉換為 浮點數 3.14
如果字串是 3.1a4,轉換為浮點數會得到什麼?
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
double i
=
3.14
;
String str
= String
.
valueOf
(i
)
;
System
.out
.
println
(
"3.14轉換成的字串 "
+ str
)
;
double i2
= Float
.
parseFloat
(str
)
;
System
.out
.
println
(
"\"3.14\"轉換成的浮點數 "
+ i2
)
;
String str2
=
"3.1a4"
;
double i3
= Float
.
parseFloat
(str2
)
;
System
.out
.
println
(
"\"3.1s4\"轉換成的浮點數 "
+ i3
)
;
}
}
9.3數學方法
-
四捨五入, 隨機數,開方,次方,π,自然常數
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
float f1
=
5.4f
;
float f2
=
5.5f
;
//5.4四捨五入即5
System
.out
.
println
(Math
.
round
(f1
)
)
;
//5.5四捨五入即6
System
.out
.
println
(Math
.
round
(f2
)
)
;
//得到一個0-1之間的隨機浮點數(取不到1)
System
.out
.
println
(Math
.
random
(
)
)
;
//得到一個0-10之間的隨機整數 (取不到10)
System
.out
.
println
(
(int
)
( Math
.
random
(
)
*
10
)
)
;
//開方
System
.out
.
println
(Math
.
sqrt
(
9
)
)
;
//次方(2的4次方)
System
.out
.
println
(Math
.
pow
(
2
,
4
)
)
;
//π
System
.out
.
println
(Math
.
PI
)
;
//自然常數
System
.out
.
println
(Math
.
E
)
;
}
}
-
練習-數學方法
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
int n
= Integer
.
MAX_VALUE
;
double value
= Math
.
pow
(
(
1
+
1
/
(double
)n
)
,n
)
;
System
.out
.
println
(
"n 取最大整數時value: "
+ value
)
;
double error
= Math
.
abs
(Math
.
E
- value
)
;
System
.out
.
println
(
"error = "
+ error
)
;
}
}
-
練習-質數
統計找出一千萬以內,一共有多少質數。
質數概念: 只能被1和自己整除的數。
public
class
TestNumber
{
public
static boolean
IsZ
(
int i
)
{
for
(int j
=
2
;j
<= Math
.
sqrt
(i
)
;j
++
)
{
if
(i
% j
==
0
)
{
return
false
;
}
}
return
true
;
}
public
static
void
main
(
String
[
] args
)
{
int max_n
=
10000000
;
int count
=
0
;
for
(int i
=
2
;i
< max_n
;i
++
)
{
if
(
IsZ
(i
)
)
{
count
++
;
}
}
System
.out
.
println
(
"一千萬以內的質數共有"
+ count
)
;
}
}
9.4 格式化輸出
-
格式化輸出
如果不使用格式化輸出,就需要進行字串連線,如果變數比較多,拼接就會顯得繁瑣 使用格式化輸出,就可以簡潔明瞭。
%s 表示字串 %d 表示數字 %n 表示換行
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
String name
=
"蓋倫"
;
int kill
=
8
;
String title
=
"超神"
;
//直接使用+進行字串連線,編碼感覺會比較繁瑣,並且維護性差,易讀性差
String sentence
= name
+
" 在進行了連續 "
+ kill
+
" 次擊殺後,獲得了 "
+ title
+
" 的稱號"
;
System
.out
.
println
(sentence
)
;
//使用格式化輸出
//%s表示字串,%d表示數字,%n表示換行
String sentenceFormat
=
"%s 在進行了連續 %d 次擊殺後,獲得了 %s 的稱號%n"
;
System
.out
.
printf
(sentenceFormat
,name
,kill
,title
)
;
//使用format格式化輸出
System
.out
.
format
(sentenceFormat
,name
,kill
,title
)
;
}
}
-
總長度,左對齊,補0,千位分隔符,小數點位數,本地化表達
package digit
;
import java
.util
.Locale
;
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
int year
=
2020
;
//總長度,左對齊,補0,千位分隔符,小數點位數,本地化表達
//直接列印數字
System
.out
.
format
(
"%d%n"
,year
)
;
//總長度是8,預設右對齊
System
.out
.
format
(
"%8d%n"
,year
)
;
//總長度是8,左對齊
System
.out
.
format
(
"%-8d%n"
,year
)
;
//總長度是8,不夠補0
System
.out
.
format
(
"%08d%n"
,year
)
;
//千位分隔符
System
.out
.
format
(
"%,8d%n"
,year
*
10000
)
;
//小數點位數
System
.out
.
format
(
"%.2f%n"
,Math
.
PI
)
;
//不同國家的千位分隔符
System
.out
.
format
(Locale
.
FRANCE
,
"%,.2f%n"
,Math
.
PI
*
10000
)
;
System
.out
.
format
(Locale
.
US
,
"%,.2f%n"
,Math
.
PI
*
10000
)
;
System
.out
.
format
(Locale
.
UK
,
"%,.2f%n"
,Math
.
PI
*
10000
)
;
}
}
9.5 字元char
-
儲存一個字元的時候使用char
-
char對應的封裝類是Character
-
Character常見方法
public
class
TestChar
{
public
static
void
main
(
String
[
] args
)
{
System
.out
.
println
(Character
.
isLetter
(
'a'
)
)
;
//判斷是否為字母
System
.out
.
println
(Character
.
isDigit
(
'a'
)
)
;
//判斷是否為數字
System
.out
.
println
(Character
.
isWhitespace
(
' '
)
)
;
//是否是空白
System
.out
.
println
(Character
.
isUpperCase
(
'a'
)
)
;
//是否是大寫
System
.out
.
println
(Character
.
isLowerCase
(
'a'
)
)
;
//是否是小寫
System
.out
.
println
(Character
.
toUpperCase
(
'a'
)
)
;
//轉換為大寫
System
.out
.
println
(Character
.
toLowerCase
(
'A'
)
)
;
//轉換為小寫
String a
=
'a'
;
//不能夠直接把一個字元轉換成字串
String a2
= Character
.
toString
(
'a'
)
;
//轉換為字串
}
}
-
常見轉義
public
class
TestChar
{
public
static
void
main
(
String
[
] args
)
{
System
.out
.
println
(
"使用空格無法達到對齊的效果"
)
;
System
.out
.
println
(
"abc def"
)
;
System
.out
.
println
(
"ab def"
)
;
System
.out
.
println
(
"a def"
)
;
System
.out
.
println
(
"使用\\t製表符可以達到對齊的效果"
)
;
System
.out
.
println
(
"abc\tdef"
)
;
System
.out
.
println
(
"ab\tdef"
)
;
System
.out
.
println
(
"a\tdef"
)
;
System
.out
.
println
(
"一個\\t製表符長度是8"
)
;
System
.out
.
println
(
"換行符 abc\ndef"
)
;
System
.out
.
println
(
"單引號 abc\'def"
)
;
System
.out
.
println
(
"雙引號 abc\"def"
)
;
System
.out
.
println
(
"反斜槓 abc\\def"
)
;
}
}
-
練習-Character
通過Scanner從控制檯讀取字串,然後把字串轉換為字元陣列。
轉換為字元陣列後,篩選出控制檯讀取到的字串中的大寫字母和數字,並列印出來。
public
class
TestNumber
{
public
static
void
main
(
String
[
] args
)
{
Scanner sc
=
new
Scanner
(System
.in
)
;
String str
= sc
.
next
(
)
;
char
[
]cs
= str
.
toCharArray
(
)
;
System
.out
.
println
(String
.
valueOf
(cs
)
)
;
System
.out
.
println
(Arrays
.
toString
(cs
)
)
;
String str2
=
""
;
for
(int i
=
0
;i
< str
.
length
(
)
;i
++
)
{
if
(Character
.
isDigit
(cs
[i
]
)
|| Character
.
isUpperCase
(cs
[i
]
)
)
str2
+= cs
[i
]
;
}
System
.out
.
println
(str2
)
;
}
}
9.6 字串*
-
建立字串
字串即字元的組合,在Java中,字串是一個類,所以我們見到的字串都是物件 常見建立字串手段:
-
每當有一個 字面值出現的時候,虛擬機器就會建立一個字串。
-
呼叫String的構造方法建立一個字串物件。
-
通過+加號進行字串拼接也會建立新的字串物件。
public
class
TestString
{
public
static
void
main
(
String
[
] args
)
{
String garen
=
"蓋倫"
;
//字面值,虛擬機器碰到字面值就會建立一個字串物件
String teemo
=
new
String
(
"提莫"
)
;
//建立了兩個字串物件
char
[
] cs
=
new
char
[
]
{
'崔'
,
'斯'
,
'特'
}
;
String hero
=
new
String
(cs
)
;
// 通過字元陣列建立一個字串物件
String hero3
= garen
+ teemo
;
// 通過+加號進行字串拼接
}
}
-
String 被修飾為final,所以是不能被繼承的
/*這裡會報錯,因為String不能被繼承*/
static
class
MyString
extends
String
{
}
-
immutable - 不可改變的
比如建立了一個字串物件 String garen ="蓋倫";
不可改變的具體含義是指:
-
不能增加長度
-
不能減少長度
-
不能插入字元
-
不能刪除字元
-
不能修改字元
一旦建立好這個字串,裡面的內容 永遠 不能改變,String 的表現就像是一個 常量。
-
字串格式化
//%s表示字串,%d表示數字,%n表示換行
String sentenceFormat
=
"%s 在進行了連續 %d 次擊殺後,獲得了 %s 的稱號%n"
;
String sentence2
= String
.
format
(sentenceFormat
, name
,kill
,title
)
;
-
練習1-隨機字串
建立一個長度是5的隨機字串,隨機字元有可能是數字,大寫字母或者小寫字母。
public
class
TestNumber
{
public char
get_char
(
)
{
/*0-9 corresponds to Ascii 48-57
*A-Z 65-90
*a-z 97-122
* */
Random random
=
new
Random
(
)
;
//隨機生成122-48範圍類的ascii碼
int num
;
switch
(random
.
nextInt
(
3
)
)
{
//獲取數字ascii
case
0
:
num
= random
.
nextInt
(
58
-
48
)
+
48
;
break
;
//獲取大寫字母
case
1
:
num
= random
.
nextInt
(
91
-
65
)
+
65
;
break
;
case
2
:
num
= random
.
nextInt
(
123
-
97
)
+
97
;
break
;
default
:
num
=
48
;
}
char c
=
(char
)num
;
return c
;
}
public String
get_String
(
int length
)
{
String str
=
""
;
for
(int i
=
0
;i
< length
;i
++
)
{
str
+=
get_char
(
)
;
}
return str
;
}
public
static
void
main
(
String
[
] args
)
{
TestNumber t
=
new
TestNumber
(
)
;
String str
= t
.
get_String
(
5
)
;
System
.out
.
println
(str
)
;
}
}
-
練習2 - 字串陣列排序
public String
[
]
stringDataGroup_sort
(
String
[
] strings
)
{
/*字串陣列排序 按首字母排序**/
for
(int i
=
0
; i
< strings
.length
-
1
; i
++
)
{
for
(int j
= i
+
1
; j
< strings
.length
; j
++
)
{
char str1
= strings
[i
]
.
charAt
(
0
)
;
char str2
= strings
[j
]
.
charAt
(
0
)
;
int num1
= str1
;
int num2
= str2
;
if
(num1
> num2
)
{
String string
= strings
[i
]
;
strings
[i
]
= strings
[j
]
;
strings
[j
]
= string
;
}
}
}
return strings
;
}
public
static
void
main
(
String
[
] args
)
{
TestNumber t
=
new
TestNumber
(
)
;
String
[
]strs
=
new
String
[
8
]
;
for
(int i
=
0
;i
<
8
;i
++
)
{
strs
[i
]
= t
.
get_String
(
5
)
;
}
System
.out
.
println
(Arrays
.
toString
(strs
)
)
;
String
[
] sorted_str
= t
.
stringDataGroup_sort
(strs
)
;
System
.out
.
println
(Arrays
.
toString
(sorted_str
)
)
;
}
-
練習3 - 窮舉法破解-密碼
-
生成一個長度是3的
,把這個字串作為當做密碼 -
使用窮舉法生成長度是3個字串,匹配上述生成的密碼
要求: 使用 遞迴解決 上述問題
9.7 操縱字串
-
獲取字元 charAt(int index)獲取指定位置的字元
String sentence = "蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號"; char c = sentence.charAt(0); 複製程式碼
-
獲取對應的字元陣列 toCharArray()
String sentence
=
"蓋倫,在進行了連續8次擊殺後,獲得了超神 的稱號"
;
char
[
] cs
= sentence
.
toCharArray
(
)
;
//獲取對應的字元陣列
-
擷取子字串 subString
String sentence
=
"蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號"
;
//擷取從第3個開始的字串 (基0)
//到5-1的位置的字串
//左閉右開
String subString2
= sentence
.
substring
(
3
,
5
)
;
System
.out
.
println
(subString2
)
;
-
split 根據分隔符進行分隔
String sentence
=
"蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號"
;
//根據,進行分割,得到3個子字串
String subSentences
[
]
= sentence
.
split
(
","
)
;
for
(String sub
: subSentences
)
{
System
.out
.
println
(sub
)
;
}
-
trim 去掉首位空格
String sentence
=
"蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號 "
;
System
.out
.
println
(sentence
)
;
//去掉首尾空格
System
.out
.
println
(sentence
.
trim
(
)
)
;
-
大小寫
toLowerCase 全部變成小寫;toUpperCase 全部變成大寫。
String sentence
=
"Garen"
;
//全部變成小寫
System
.out
.
println
(sentence
.
toLowerCase
(
)
)
;
//全部變成大寫
System
.out
.
println
(sentence
.
toUpperCase
(
)
)
;
-
定位
indexOf 判斷字元或者子字串出現的位置 contains 是否包含子字串
String sentence
=
"蓋倫,在進行了連續8次擊殺後,獲得了超神 的稱號"
;
System
.out
.
println
(sentence
.
indexOf
(
'8'
)
)
;
//字元第一次出現的位置
System
.out
.
println
(sentence
.
indexOf
(
"超神"
)
)
;
//字串第一次出現的位置
System
.out
.
println
(sentence
.
lastIndexOf
(
"了"
)
)
;
//字串最後出現的位置
System
.out
.
println
(sentence
.
indexOf
(
','
,
5
)
)
;
//從位置5開始,出現的第一次,的位置
System
.out
.
println
(sentence
.
contains
(
"擊殺"
)
)
;
//是否包含字串"擊殺"
-
替換
replaceAll 替換所有的;replaceFirst 只替換第一個。
String sentence
=
"蓋倫,在進行了連續8次擊殺後,獲得了超神 的稱號"
;
String temp
= sentence
.
replaceAll
(
"擊殺"
,
"被擊殺"
)
;
//替換所有的
temp
= temp
.
replaceAll
(
"超神"
,
"超鬼"
)
;
System
.out
.
println
(temp
)
;
temp
= sentence
.
replaceFirst
(
","
,
""
)
;
//只替換第一個
System
.out
.
println
(temp
)
;
-
練習1 - 每個單詞的首字母都轉換為大寫
給出一句英文句子: "let there be light" 得到一個新的字串,每個單詞的首字母都轉換為大寫
-
練習2 - 英文繞口令
英文繞口令 peter piper picked a peck of pickled peppers 統計這段繞口令有多少個以p開頭的單詞
-
練習3 - 間隔大寫小寫模式
把 lengendary 改成間隔大寫小寫模式,即 LeNgEnDaRy
-
練習4 - 最後一個字母變大寫
把 lengendary 最後一個字母變大寫
-
練習5 - 把最後一個two單詞首字母大寫
Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak 把最後一個two單詞首字母大寫
public
class
StringTest
{
//問題1 - 每個單詞的首字母都轉換為大寫
public
static String
[
]
Split_Space
(
String str
)
{
return str
.
split
(
" "
)
;
}
//java學習交流:737251827 進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
public
static String
[
]
Toupcase
(
String
[
] strs
)
{
String
[
]newstrs
=
new
String
[strs
.length
]
;
int i
=
0
;
for
(String str
: strs
)
{
char
[
]cs
= str
.
toCharArray
(
)
;
cs
[
0
]
= Character
.
toUpperCase
(cs
[
0
]
)
;
newstrs
[i
++
]
= String
.
valueOf
(cs
)
;
}
return newstrs
;
}
//練習2 - 英文繞口令
public
static int
countp
(
String
[
] strs
)
{
int count
=
0
;
for
(String str
:strs
)
{
if
(str
.
charAt
(
0
)
==
'p'
)
count
++
;
}
return count
;
}
//練習3 - 間隔大寫小寫模式
public
static String
updownChange
(
String str
)
{
String upstr
= str
.
toUpperCase
(
)
;
char
[
]cs
= upstr
.
toCharArray
(
)
;
for
(int i
=
1
;i
< cs
.length
;i
+=
2
)
{
cs
[i
]
= Character
.
toLowerCase
(cs
[i
]
)
;
}
return
new
String
(cs
)
;
}
//練習4-最後一個字母變大寫
public
static String
lastup
(
String str
)
{
char
[
]cs
= str
.
toCharArray
(
)
;
cs
[cs
.length
-
1
]
= Character
.
toUpperCase
(cs
[cs
.length
-
1
]
)
;
return
new
String
(cs
)
;
}
//練習5 - 把最後一個two單詞首字母大寫
public
static String
last2up
(
String s
)
{
char
[
] c
= s
.
toCharArray
(
)
;
String n
=
"two"
;
c
[s
.
lastIndexOf
(n
)
]
= Character
.
toUpperCase
(s
.
charAt
(s
.
lastIndexOf
(n
)
)
)
;
return
new
String
(c
)
;
}
public
static
void
main
(
String
[
] args
)
{
//問題1 - 每個單詞的首字母都轉換為大寫
String str
=
"let there be light"
;
String
[
]newstrs
=
Toupcase
(
Split_Space
(str
)
)
;
String result
=
""
;
for
(String s
: newstrs
)
{
result
+= s
+
" "
;
}
System
.out
.
println
(result
)
;
//練習2 - 英文繞口令
String str2
=
"peter piper picked a peck of pickled peppers"
;
int count
=
countp
(
Split_Space
(str2
)
)
;
System
.out
.
println
(
"首字母為p的單詞有"
+ count
)
;
//練習3 - 間隔大寫小寫模式
String str3
=
"lengendary"
;
System
.out
.
println
(
"間隔大小寫模式:"
+
updownChange
(str3
)
)
;
//練習4-最後一個字母變大寫
System
.out
.
println
(
"最後一個字元變成大寫:"
+
lastup
(str3
)
)
;
//練習5 - 把最後一個two單詞首字母大寫
String str5
=
"Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak"
;
System
.out
.
println
(
last2up
(str5
)
)
;
}
}
9.8 比較字串
-
是否是同一個物件
str1和str2的內容一定是一樣的!但是,並不是同一個字串物件。
==用於判斷是否是同一個字串物件。
-
是否是同一個物件-特例
String str1
=
"the light"
;
String str3
=
"the light"
;
System
.out
.
println
( str1
== str3
)
;
一般說來,編譯器每碰到一個字串的字面值,就會建立一個新的物件。 所以在第6行會建立了一個新的字串"the light"; 但是在第7行,編譯器發現已經存在現成的"the light",那麼就直接拿來使用,而沒有進行重複建立。
-
內容是否相同
使用equals進行字串內容的比較,必須大小寫一致; equalsIgnoreCase,忽略大小寫判斷內容是否一致。
-
是否以子字串開始或者結束
startsWith //以...開始;endsWith //以...結束。
-
練習-比較字串
建立一個長度是100的字串陣列,使用長度是2的隨機字元填充該字串陣列。 統計這個字串陣列裡 重複的字串有多少種
學了hash再來做吧..
9.9 StringBuffer*
StringBuffer是可變長的字串
-
追加 刪除 插入 反轉
append追加;delete 刪除;insert 插入;reverse 反轉.
package character
;
public
class
TestString
{
public
static
void
main
(
String
[
] args
)
{
String str1
=
"let there "
;
StringBuffer sb
=
new
StringBuffer
(str1
)
;
//根據str1建立一個StringBuffer物件
sb
.
append
(
"be light"
)
;
//在最後追加
System
.out
.
println
(sb
)
;
sb
.
delete
(
4
,
10
)
;
//刪除4-10之間的字元
System
.out
.
println
(sb
)
;
sb
.
insert
(
4
,
"there "
)
;
//在4這個位置插入 there
System
.out
.
println
(sb
)
;
sb
.
reverse
(
)
;
//反轉
System
.out
.
println
(sb
)
;
}
}
-
長度 容量
為什麼StringBuffer可以變長? 和String 內部是一個字元陣列一樣,StringBuffer也維護了一個字元陣列。 但是,這個字元陣列, 留有冗餘長度。
-
比如說new StringBuffer("the"),其內部的字元陣列的長度,是19,而不是3,這樣呼叫插入和追加,在現成的陣列的基礎上就可以完成了。 如果追加的長度超過了19,就會分配一個新的陣列,長度比原來多一些,把原來的資料複製到新的陣列中, 看上去 陣列長度就變長了。
length: “the”的長度 3;capacity: 分配的總空間 19。
public
class
TestString
{
public
static
void
main
(
String
[
] args
)
{
String str1
=
"the"
;
StringBuffer sb
=
new
StringBuffer
(str1
)
;
System
.out
.
println
(sb
.
length
(
)
)
;
//內容長度
System
.out
.
println
(sb
.
capacity
(
)
)
;
//總空間
}
}
-
練習-StringBuffer效能
String與StringBuffer的效能區別?
生成10位長度的隨機字串 然後,先使用String的+,連線10000個隨機字串,計算消耗的時間 然後,再使用StringBuffer連線10000個隨機字串,計算消耗的時間
提示: 使用System.currentTimeMillis() 獲取當前時間(毫秒)
public
static
void
main
(
String
[
] args
)
{
long start
= System
.
currentTimeMillis
(
)
;
String s1
=
""
;
for
(int i
=
0
;i
<
10000
;i
++
)
{
s1
+=
'a'
;
}
long end
= System
.
currentTimeMillis
(
)
;
System
.out
.
println
(
"string總共耗時了:"
+
(end
-start
)
)
;
long start2
= System
.
currentTimeMillis
(
)
;
StringBuffer sb
=
new
StringBuffer
(
)
;
for
(int i
=
0
;i
<
10000
;i
++
)
{
sb
.
append
(
'a'
)
;
}
long end2
= System
.
currentTimeMillis
(
)
;
System
.out
.
println
(
"stringbuffer總共耗時了:"
+
(end2
-start2
)
)
;
}
-
練習-MyStringBuffer
根據介面IStringBuffer ,自己做一個MyStringBuffer
IStringBuffer.java
package character
;
public
interface
IStringBuffer
{
public
void
append
(String str
)
;
//追加字串
public
void
append
(char c
)
;
//追加字元
public
void
insert
(int pos
,char b
)
;
//指定位置插入字元
public
void
insert
(int pos
,String b
)
;
//指定位置插入字串
public
void
delete
(int start
)
;
//從開始位置刪除剩下的
public
void
delete
(int start
,int end
)
;
//從開始位置刪除結束位置-1
public
void
reverse
(
)
;
//反轉
public int
length
(
)
;
//返回長度
}
MyStringBuffer.java
package character
;
public
class
MyStringBuffer
implements
IStringBuffer
{
}
9.10 MyStringBuffer
具體文字說明:
package digit
;
public
class
MyStringBuffer
implements
IStringBuffer
{
int capacity
=
19
;
int length
=
0
;
char
[
]value
;
//java學習交流:737251827 進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
// 無參構造方法
public
MyStringBuffer
(
)
{
value
=
new
char
[capacity
]
;
}
// 帶引數構造方法
public
MyStringBuffer
(
String str
)
{
this
(
)
;
if
(
null
== str
)
return
;
if
(capacity
< str
.
length
(
)
)
{
capacity
= value
.length
*
2
;
value
=
new
char
[capacity
]
;
}
if
(capacity
>= str
.
length
(
)
)
{
System
.
arraycopy
(str
.
toCharArray
(
)
,
0
,value
,
0
,str
.
length
(
)
)
;
}
length
= str
.
length
(
)
;
}
//追加字串
@Override
public
void
append
(
String str
)
{
insert
(length
,str
)
;
}
//追加字元
@Override
public
void
append
(
char c
)
{
append
(String
.
valueOf
(c
)
)
;
}
//指定位置插入字元
@Override
public
void
insert
(
int pos
,char b
)
{
insert
(pos
,String
.
valueOf
(b
)
)
;
}
//指定位置插入字串
@Override
public
void
insert
(
int pos
,String b
)
{
//邊界條件判斷
if
(pos
<
0
)
return
;
if
(pos
> length
)
return
;
if
(
null
== b
)
return
;
//擴容
while
(length
+ b
.
length
(
)
> capacity
)
{
capacity
=
(int
)
(
(length
+ b
.
length
(
)
)
*
2
)
;
char
[
]new_value
=
new
char
[capacity
]
;
System
.
arraycopy
(value
,
0
,new_value
,
0
,length
)
;
value
= new_value
;
}
char
[
]cs
= b
.
toCharArray
(
)
;
//先把已經存在的資料往後移
System
.
arraycopy
(value
,pos
,value
,pos
+cs
.length
,length
-pos
)
;
//把要插入的資料插入到指定位置
System
.
arraycopy
(cs
,
0
, value
, pos
, cs
.length
)
;
length
= length
+cs
.length
;
}
//從開始位置刪除剩下的
@Override
public
void
delete
(int start
)
{
delete
(start
,length
)
;
}
//從開始位置刪除結束位置-1
@Override
public
void
delete
(int start
,int end
)
{
//邊界條件判斷
if
(start
<
0
)
return
;
if
(start
>length
)
return
;
if
(end
<
0
)
return
;
if
(end
>length
)
return
;
if
(start
>=end
)
return
;
System
.
arraycopy
(value
, end
, value
, start
, length
- end
)
;
length
-=end
-start
;
}
//反轉
@Override
public
void
reverse
(
)
{
for
(int i
=
0
; i
< length
/
2
; i
++
)
{
char temp
= value
[i
]
;
value
[i
]
= value
[length
- i
-
1
]
;
value
[length
- i
-
1
]
= temp
;
}
}
//返回長度
@Override
public int
length
(
)
{
return length
;
}
public String
toString
(
)
{
char
[
] realValue
=
new
char
[length
]
;
System
.
arraycopy
(value
,
0
, realValue
,
0
, length
)
;
return
new
String
(realValue
)
;
}
public
static
void
main
(
String
[
] args
)
{
MyStringBuffer sb
=
new
MyStringBuffer
(
"there light"
)
;
System
.out
.
println
(sb
)
;
sb
.
insert
(
0
,
"let "
)
;
System
.out
.
println
(sb
)
;
sb
.
insert
(
10
,
"be "
)
;
System
.out
.
println
(sb
)
;
sb
.
insert
(
0
,
"God Say:"
)
;
System
.out
.
println
(sb
)
;
sb
.
append
(
"!"
)
;
System
.out
.
println
(sb
)
;
sb
.
append
(
'?'
)
;
System
.out
.
println
(sb
)
;
sb
.
reverse
(
)
;
System
.out
.
println
(sb
)
;
sb
.
reverse
(
)
;
System
.out
.
println
(sb
)
;
sb
.
delete
(
0
,
4
)
;
System
.out
.
println
(sb
)
;
sb
.
delete
(
4
)
;
System
.out
.
println
(sb
)
;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2847158/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 學習canvas基礎的總結Canvas
- Kotlin 基礎學習總結(一)Kotlin
- 機器學習基礎總結機器學習
- Java 基礎學習總結(一)抽象類和介面Java抽象
- PHP 學習總結之字串PHP字串
- 零基礎學習 Python 之數字與運算Python
- Python學習筆記 - 字串,數字Python筆記字串
- 字串學習總結(Hash & Manacher & KMP)字串KMP
- 零基礎學習Java,全方位知識點總結!Java
- JAVA學習--JAVA基礎(一)Java
- python學習:變數與字串Python變數字串
- Java集合學習總結Java
- 前端學習之PHP基礎函式總結前端PHP函式
- 2020-11-17 學習總結:bootstrap基礎boot
- java基礎學習:JavaWeb之ServletConfig與ServletContextJavaWebServletContext
- 零基礎學習 Python 之字串Python字串
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- Java集合類學習總結Java
- java基礎學習(目錄)Java
- Java基礎學習筆記Java筆記
- Flutter學習總結系列----Flutter基礎全面詳解Flutter
- 學習mysql之後的一點總結(基礎)MySql
- JavaScript入門指南(學習筆記) 兩萬餘字的基礎總結JavaScript筆記
- Java學習之基礎語法練習Java
- 大資料-數倉學習總結與分享大資料
- 【java學習】java知識點總結Java
- 《計算機基礎與程式設計》第八週學習總結計算機程式設計
- 《計算機基礎與程式設計》第二週學習總結計算機程式設計
- 《計算機基礎與程式設計》第7周學習總結計算機程式設計
- 《計算機基礎與程式設計》第十週學習總結計算機程式設計
- 《計算機基礎與程式設計》第七週學習總結計算機程式設計
- 《計算機基礎與程式設計》第11周學習總結計算機程式設計
- Python基礎學習篇-2-數值運算和字串Python字串
- 免殺學習-基礎學習
- 0基礎怎麼學習Python?Python學習方法彙總!Python
- Java中IO流學習總結Java
- 學習Java第六週總結Java