目錄
2.3可變字符串StringBuffer/StringBuilder
一、數字類
1.1超大數浮點數
BigDecimal b1 = new BigDecimal("123456789.987654321"); // 聲明BigDecimal對象
BigDecimal b2 = new BigDecimal("987654321.123456789"); // 聲明BigDecimal對象
System.out.println("b1: " + b1 + ", b2:" + b2);
System.out.println("加法操作:" + b2.add(b1)); // 加法操作
System.out.println("減法操作:" + b2.subtract(b1)); // 減法操作
System.out.println("乘法操作:" + b2.multiply(b1)); // 乘法操作
//需要指定位數,防止無限循環,或者包含在try-catch中
System.out.println("除法操作:" + b2.divide(b1,10,BigDecimal.ROUND_HALF_UP)); // 除法操作包留十位小數進行四捨五入
System.out.println("最大數:" + b2.max(b1)); // 求出最大數
System.out.println("最小數:" + b2.min(b1)); // 求出最小數
int flag = b1.compareTo(b2);
if (flag == -1)
System.out.println("比較操作: b1<b2");
else if (flag == 0)
System.out.println("比較操作: b1==b2");
else
System.out.println("比較操作: b1>b2");
System.out.println("===================");
//儘量採用字符串賦值
System.out.println(new BigDecimal("2.3"));
1.2超大數整數
BigInteger b1 = new BigInteger("123456789"); // 聲明BigInteger對象
BigInteger b2 = new BigInteger("987654321"); // 聲明BigInteger對象
System.out.println("b1: " + b1 + ", b2:" + b2);
System.out.println("加法操作:" + b2.add(b1)); // 加法操作
System.out.println("減法操作:" + b2.subtract(b1)); // 減法操作
System.out.println("乘法操作:" + b2.multiply(b1)); // 乘法操作
System.out.println("除法操作:" + b2.divide(b1)); // 除法操作
System.out.println("最大數:" + b2.max(b1)); // 求出最大數
System.out.println("最小數:" + b2.min(b1)); // 求出最小數
BigInteger result[] = b2.divideAndRemainder(b1); // 求出餘數的除法操作
System.out.println("商是:" + result[0] + ";餘數是:" + result[1]);
System.out.println("等價性是:" + b1.equals(b2));
int flag = b1.compareTo(b2);
if (flag == -1)
System.out.println("比較操作: b1<b2");
else if (flag == 0)
System.out.println("比較操作: b1==b2");
else
System.out.println("比較操作: b1>b2");
1.3隨機數:
import java.util.Random;
public class RandomTest {
public static void main(String[] args)
{
//第一種辦法,採用Random類 隨機生成在int範圍內的隨機數
Random rd = new Random();
System.out.println(rd.nextInt());
System.out.println(rd.nextInt(100)); //0--100的隨機數
System.out.println(rd.nextLong());
System.out.println(rd.nextDouble()); //返回0.0~1.0直接的數
System.out.println("=========================");
//第二種,生成一個範圍內的隨機數 例如0到時10之間的隨機數
//Math.random[0,1)
System.out.println(Math.round(Math.random()*10));
System.out.println("=========================");
//JDK 8 新增方法
rd.ints(); //返回無限個int類型範圍內的數據
int[] arr = rd.ints(10).toArray(); //生成10個int範圍類的個數。
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("=========================");
arr = rd.ints(5, 10, 100).toArray();//限制範圍10~100
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("=========================");
arr = rd.ints(10).limit(5).toArray();//表示生成10個限定返回5個
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
1.4格式化輸出
public class MathTest {
public static void main(String[] args) {
System.out.println(Math.abs(-5)); //絕對值
System.out.println(Math.max(-5,-8)); //最大值
System.out.println(Math.pow(-5,2)); //求冪
System.out.println(Math.round(3.5)); //四捨五入
System.out.println(Math.ceil(3.5)); //向上取整
System.out.println(Math.floor(3.5)); //向下取整
}
}
輸出:
5
-5
25.0
4
4.0
3.0
1.5浮點數和雙精度
float f1 = 1.23f;
// float f2 = 1.23; error, float賦值必須帶f
double d1 = 4.56d;
double d2 = 4.56; //double 可以省略末尾d
二、字符串
2.1String
public class StringTest {
public static void main(String[] args) {
String a = "123;456;789;123 ";
System.out.println(a.charAt(0)); // 返回第0個元素
System.out.println(a.indexOf(";")); // 返回第一個;的位置
System.out.println(a.concat(";000")); // 連接一個新字符串並返回,a不變
System.out.println(a.contains("000")); // 判斷a是否包含000
System.out.println(a.endsWith("000")); // 判斷a是否以000結尾
System.out.println(a.equals("000")); // 判斷是否等於000
System.out.println(a.equalsIgnoreCase("000"));// 判斷在忽略大小寫情況下是否等於000
System.out.println(a.length()); // 返回a長度
System.out.println(a.trim()); // 返回a去除前後空格後的字符串,a不變
String[] b = a.split(";"); // 將a字符串按照;分割成數組
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
System.out.println("===================");
System.out.println(a.substring(2, 5)); // 截取a的下標爲2(第三個)到下標爲5(第6個)字符 a不變
System.out.println(a.replace("1", "a"));
System.out.println(a.replaceAll("1", "a")); // replaceAll第一個參數是正則表達式
System.out.println("===================");
String s1 = "12345?6789";
String s2 = s1.replace("?", "a");
String s3 = s1.replaceAll("[?,8]", "a");
// 這裏的[?] 才表示字符問號,這樣才能正常替換。不然在正則中會有特殊的意義就會報異常
System.out.println(s2);
System.out.println(s3);
System.out.println(s1.replaceAll("[\\d]", "a")); //將s1內所有數字替換爲a並輸出,s1的值未改變。
}
}
輸出:
1
3
123;456;789;123 ;000
false
false
false
false
16
123;456;789;123
123
456
789
123
===================
3;4
a23;456;789;a23
a23;456;789;a23
===================
12345a6789
12345a67a9
aaaaa?aaaa
2.2正則表達式的簡單說明:
?,*,+,\d,\w 都是等價字符
?等價於匹配長度{0,1}
*等價於匹配長度{0,}
+等價於匹配長度{1,}
\d等價於[0-9]
\D等價於[^0-9]
\w等價於[A-Za-z_0-9]
\W等價於[^A-Za-z_0-9]。
例1:
System.out.println("15088688388".replaceAll("(\\d{3})(\\d{4})","$1****"));
\\d{3}爲150, \\d{4}爲8868 ,$1爲第一組,就是\\d{3}。所以輸出150****8388
System.out.println("15088688388".replaceAll("(\\d{3})(\\d{4})","$1222"));輸出1502228388
例2:
System.out.println("15088688388".replaceAll("\\d","b"));輸出bbbbbbbbbbb
\d表示是數字,但是因爲含本身前面有\所以前面還需要一個\
System.out.println("15088688388".replaceAll("\\d+","b"));輸出b,
+號表示一次或者多次.所以整體被替換。
這篇博客值得一看
https://blog.csdn.net/make164492212/article/details/51656638
2.3可變字符串StringBuffer/StringBuilder
上一篇博客有舉例驗證兩者性能。
capacity>=length空間大小。
舉例證明StringBuffer字符串可變。
public class StringBufferReferenceTest {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("123");
StringBuffer sb2 = sb1;
sb1.append("2222");
System.out.println(sb1);
System.out.println(sb2); //sb1 和 sb2還是指向同一個內存的
}
}
輸出:
1232222
1232222
常見函數舉例
public class StringBuffertest {
public static void main(String[] args) {
// TODO 自動生成的方法存根
StringBuffer sb1 = new StringBuffer("123");
sb1.append("12");//12312
System.out.println(sb1);
sb1.insert(2,"haha");//在第二個字符後面插入12haha12
System.out.println(sb1);
sb1.delete(2,3);//刪除第2~3個字符,含尾不含頭
System.out.println(sb1);
sb1.replace(2,5,"222");//替換第2~5個字符(第3,4,5),含尾不含頭
System.out.println(sb1);
String s1=sb1.substring(3,6);//截取3~6個字符(第4,5,6),原字符串不變
System.out.println(s1);
System.out.println(sb1);
}
}
輸出:
12312
12haha312
12aha312
12222312
223
12222312
三、時間類
3.1Calendar
舉例:
獲取時間,年月日星期幾時分秒,計算每一個月的最後一天,設定年月日,並在修改年月日
import java.util.Calendar;
public class CalendarTest {
Calendar calendar = Calendar.getInstance();
public void test1() {
// 獲取年
int year = calendar.get(Calendar.YEAR);
// 獲取月,這裏需要需要月份的範圍爲0~11,因此獲取月份的時候需要+1纔是當前月份值
int month = calendar.get(Calendar.MONTH) + 1;
// 獲取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
// 獲取時
int hour = calendar.get(Calendar.HOUR);
// int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小時表示
// 獲取分
int minute = calendar.get(Calendar.MINUTE);
// 獲取秒
int second = calendar.get(Calendar.SECOND);
// 星期,英語國家星期從星期日開始計算
int weekday = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("現在是" + year + "年" + month + "月" + day + "日" + hour
+ "時" + minute + "分" + second + "秒" + "星期" + weekday);
}
// 一年後的今天
public void test2() {
// 同理換成下個月的今天calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.YEAR, 1);
// 獲取年
int year = calendar.get(Calendar.YEAR);
// 獲取月
int month = calendar.get(Calendar.MONTH) + 1;
// 獲取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("一年後的今天:" + year + "年" + month + "月" + day + "日");
}
// 獲取任意一個月的最後一天
public void test3() {
// 假設求6月的最後一天
int currentMonth = 6;
// 先求出7月份的第一天,實際中這裏6爲外部傳遞進來的currentMonth變量
// 1
calendar.set(calendar.get(Calendar.YEAR), currentMonth, 1);
calendar.add(Calendar.DATE, -1);
// 獲取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("6月份的最後一天爲" + day + "號");
}
// 設置日期
public void test4() {
calendar.set(Calendar.YEAR, 2000);
System.out.println("現在是" + calendar.get(Calendar.YEAR) + "年");
calendar.set(2018, 7, 8);
// 獲取年
int year = calendar.get(Calendar.YEAR);
// 獲取月
int month = calendar.get(Calendar.MONTH)+1;
// 獲取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("現在是" + year + "年" + month + "月" + day + "日");
}
//add和roll的區別,roll如果改變號,不會引起月的改變(不會改變上一級)。
public void test5() {
calendar.set(2018, 7, 8);
calendar.add(Calendar.DAY_OF_MONTH, -8);
// 獲取年
int year = calendar.get(Calendar.YEAR);
// 獲取月
int month = calendar.get(Calendar.MONTH)+1;
// 獲取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("2018.8.8, 用add減少8天,現在是" + year + "." + month + "." + day);
calendar.set(2018, 7, 8);
calendar.roll(Calendar.DAY_OF_MONTH, -8);
// 獲取年
year = calendar.get(Calendar.YEAR);
// 獲取月
month = calendar.get(Calendar.MONTH)+1;
// 獲取日
day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("2018.8.8, 用roll減少8天,現在是" + year + "." + month + "." + day);
}
public static void main(String[] args) {
CalendarTest c = new CalendarTest();
c.test1();
System.out.println("============");
c.test2();
System.out.println("============");
c.test3();
System.out.println("============");
c.test4();
System.out.println("============");
c.test5();
}
}
輸出:
現在是2020年1月12日8時13分51秒星期1
============
一年後的今天:2021年1月12日
============
6月份的最後一天爲30號
============
現在是2000年
現在是2018年8月8日
============
2018.8.8, 用add減少8天,現在是2018.7.31
2018.8.8, 用roll減少8天,現在是2018.8.31
另外還有Date,DateUtil,Duration,LocalDate,LocalTime等類控制時間。可以詳細瞭解。
四、格式化類
4.1數字格式化DecimalFormat
#表示:最多; 0表示:只能
整數部分爲0 , #認爲整數不存在,可不寫; 0認爲沒有,但至少寫一位,寫0
整數部分不爲0,0和#對整數部分多位時的處理是一致的 就是有幾位寫多少位
小數部分#代表最多有幾位,0代表必須有且只能有幾位
舉例:
科學計數法、控制整數、小數位數、百分比表示
import java.text.DecimalFormat;
public class DecimalFormaterRuleTest {
public static void main(String[]args){
DecimalFormat df1,df2;
System.out.println("整數部分爲0的情況,0/#的區別");
// 整數部分爲0 , #認爲整數不存在,可不寫; 0認爲沒有,但至少寫一位,寫0
df1 = new DecimalFormat("#.00");
df2 = new DecimalFormat("0.00");
System.out.println(df1.format(0.1)); // .10
System.out.println(df2.format(0.1)); // 0.10
System.out.println("小數部分0/#的區別");
//#代表最多有幾位,0代表必須有且只能有幾位
df1 = new DecimalFormat("0.00");
df2 = new DecimalFormat("0.##");
System.out.println(df1.format(0.1)); // 0.10
System.out.println(df2.format(0.1)); // 0.1
System.out.println(df1.format(0.006)); // 0.01
System.out.println(df2.format(0.006)); // 0.01
System.out.println("整數部分有多位");
//0和#對整數部分多位時的處理是一致的 就是有幾位寫多少位
df1 = new DecimalFormat("0.00");
df2 = new DecimalFormat("#.00");
System.out.println(df1.format(2)); // 2.00
System.out.println(df2.format(2)); // 2.00
System.out.println(df1.format(20)); // 20.00
System.out.println(df2.format(20)); // 20.00
System.out.println(df1.format(200)); // 200.00
System.out.println(df2.format(200)); // 200.00
double pi=3.1415927;//圓周率
//取一位整數
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整數和兩位小數
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取兩位整數和三位小數,整數不足部分以0填補。
System.out.println(new DecimalFormat("00.000").format(pi));//03.142
//取所有整數部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式計數,並取兩位小數
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
long c=299792458;//光速
//顯示爲科學計數法,並取五位小數
System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8
//顯示爲兩位整數的科學計數法,並取四位小數
System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7
//每三位以逗號進行分隔。
System.out.println(new DecimalFormat(",###").format(c));//299,792,458
//將格式嵌入文本
System.out.println(new DecimalFormat("光速大小爲每秒,###米").format(c)); //光速大小爲每秒299,792,458米
}
}
輸出:
整數部分爲0的情況,0/#的區別
.10
0.10
小數部分0/#的區別
0.10
0.1
0.01
0.01
整數部分有多位
2.00
2.00
20.00
20.00
200.00
200.00
3
3.14
03.142
3
314.16%
2.99792E8
29.9792E7
299,792,458
光速大小爲每秒299,792,458米
四捨五入。向上向下取值請看前文一、數字類
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class TwoDigitsTest {
public static void main(String[] args) {
double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(f1); //111231.56
DecimalFormat df =new DecimalFormat("#.00");
String f2 = df.format(f);
System.out.println(f2); //111231.56
String f3 = String.format("%.2f",f);
System.out.println(f3); //111231.56
NumberFormat ddf1=NumberFormat.getInstance() ;
System.out.println(ddf1.getClass().getName());
ddf1.setMaximumFractionDigits(2);
String f4= ddf1.format(f) ;
System.out.println(f4); //111,231.56
}
}
輸出:
111231.56
111231.56
111231.56
java.text.DecimalFormat
111,231.56
4.2字符串格式化
MessageFormat:字符串格式化,利用參數和數組進行格式化
import java.text.MessageFormat;
public class MessageFormatTest {
public static void main(String[] args) {
String message = "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}";
Object[] array = new Object[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"};
String value = MessageFormat.format(message, array);
System.out.println(value);
message = "oh, {0,number,#.##} is a good number";
array = new Object[]{new Double(3.1415)};
value = MessageFormat.format(message, array);
System.out.println(value);
}
}
輸出:
ABCDEFGHIJKLMNOPQ
oh, 3.14 is a good number
4.3時間格式化
4.3.1DateFormat
import java.text.DateFormat;
import java.util.Locale;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateTest {
public static void main(String[] args) {
String strDate = "2008-10-19 10:11:30.345" ;
// 準備第一個模板,從字符串中提取出日期數字
String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ;
// 準備第二個模板,將提取後的日期數字變爲指定的格式
String pat2 = "yyyy年MM月dd日 HH時mm分ss秒SSS毫秒" ;
SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ; // 實例化模板對象
SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ; // 實例化模板對象
Date d = null ;
try{
d = sdf1.parse(strDate) ; // 將給定的字符串中的日期提取出來
}catch(Exception e){ // 如果提供的字符串格式有錯誤,則進行異常處理
e.printStackTrace() ; // 打印異常信息
}
System.out.println(sdf2.format(d)) ; // 將日期變爲新的格式
Date date = new Date();
DateFormat df1 = DateFormat.getInstance();
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
DateFormat df3 = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒 EE",Locale.CHINA);
DateFormat df4 = new SimpleDateFormat("dd-MMMM-yyyy hh:mm:ss EE",Locale.US);
DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd");
DateFormat df6 = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println("-------將日期按不同格式進行輸出-------");
System.out.println("按照java默認的日期格式:"+df1.format(date));
System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE,系統默認區域:"+df2.format(date));
System.out.println("按照指定格式 yyyy年MM月dd日 hh時mm分ss秒 EE,區域爲中國:"+df3.format(date));
System.out.println("按照指定格式dd-MMMM-yyyy hh:mm:ss EE,區域爲美國:"+df4.format(date));
System.out.println("按照指定格式 yyyy-MM-dd :"+df5.format(date));
System.out.println("按照指定格式 yyyy年MM月dd日 :"+df6.format(date));
}
}
輸出:
2008年10月19日 10時11分30秒345毫秒
-------將日期按不同格式進行輸出-------
按照java默認的日期格式:20-1-12 下午8:55
按照指定格式 yyyy-MM-dd hh:mm:ss EE,系統默認區域:2020-01-12 08:55:22 星期日
按照指定格式 yyyy年MM月dd日 hh時mm分ss秒 EE,區域爲中國:2020年01月12日 08時55分22秒 星期日
按照指定格式dd-MMMM-yyyy hh:mm:ss EE,區域爲美國:12-January-2020 08:55:22 Sun
按照指定格式 yyyy-MM-dd :2020-01-12
按照指定格式 yyyy年MM月dd日 :2020年01月12日
4.3.2LocalDate
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateFormatterTest {
public static void main(String[] args) {
//將字符串轉化爲時間
String dateStr= "2016年10月25日";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date= LocalDate.parse(dateStr, formatter);
System.out.println(date.getYear() + "-" + date.getMonthValue() + "-" + date.getDayOfMonth());
System.out.println("==========================");
//將日期轉換爲字符串輸出
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm:ss");
String nowStr = now.format(format);
System.out.println(nowStr);
}
}
輸出:
2016-10-25
==========================
2020年01月12日 08:45:27
參考:中國大學mooc java核心技術 陳良育