包裝類
包裝類是把八大基本數(shù)據(jù)類型封裝到一個類中,并提供屬性和方法。
是為了更方便的操作基本數(shù)據(jù)類型越驻,而不是取代基本數(shù)據(jù)類型。
Number 類
Number數(shù)值類型是byte道偷、double缀旁、float、int勺鸦、long 和 short類的抽象父類并巍,提供把包裝類轉(zhuǎn)化成基本數(shù)據(jù)類型的方法(xxxValue)。
Integer
Integer是int基本數(shù)據(jù)類型的包裝類换途,在Integer內(nèi)部封裝了一個final int value 的屬性
常用方法:
1.構(gòu)造方法
Integer(int?value)
構(gòu)造一個新分配的Integer對象懊渡,它表示指定的int值刽射。
Integer(String?s)
構(gòu)造一個新分配的Integer對象,它表示String參數(shù)所指示的int值剃执。
2.int<->Integer<->string
????????????//int->Integer
???????? Integer? i1 = new Integer(10);
???????? Integer? i2= Integer.valueOf(20);
????????????// Integer->int
???????? int a = i1.intValue();
???????? // String->Integer
???????? Integer? i3 = new Integer("30");
???????? Integer? i4= Integer.valueOf("40");
???????? //Integer->String
???????? System.out.println(i3.toString());
???????????? // String->int
???????? int b= Integer.parseInt("50");
???????????? //int->String
???????? String? str= Integer.toString(10);
???????? //String str2 = Integer.toString(8, 2);
???????? //System.out.println(str2);
3.Comparable接口
Comparable 表示具有比較能力誓禁,對象可比較大小,此接口強行對實現(xiàn)它的每個類的對象進行整體排序肾档。這種排序被稱為類的自然排序摹恰。
????????a.compareTo(b)
在數(shù)字上比較 如果該 Integer 等于 Integer 參數(shù),則返回 0 值怒见;
如果該 Integer 在數(shù)字上小于 Integer 參數(shù)俗慈,則返回小于 0 的值;?
如果 Integer 在數(shù)字上大于 Integer 參數(shù)速种,則返回大于 0 的值;?
自動裝箱和自動拆箱
把基本數(shù)據(jù)類型自動轉(zhuǎn)化成對象的包裝類的過程稱為自動裝箱(auto-boxing)
如? ? ? ? ?Integer? i = 10;? ? ?//Integer i=new Integer(10);
把包裝類自動轉(zhuǎn)化成對于的基本數(shù)據(jù)類型的過程稱為自動拆箱(auto-unboxing)
如? ? ? ? ? int? a = i;? ? ? ? ? ? ? //int? a =i.intValue();
使得代碼較為簡便低千,但不要過于頻繁使用拆裝箱操作配阵。
String?
String 類代表字符串。Java 程序中的所有字符串字面值(如"abc" )都作為此類的對象示血。
字符串本質(zhì)上是一個字符數(shù)組棋傍,它們的值在創(chuàng)建之后不能更改,所以字符串是常量难审;
可以把字符串看出是字符數(shù)組的包裝類瘫拣,內(nèi)部聲明一個private final char value[];
若
????String a="abc";
? ? String b="abc";
? System.out.print(a==b);
?????結(jié)果:true
原因:編譯時,這兩個"abc"被認為是同一個對象保存到了常量池中告喊;運行時JVM則認為這兩個變量賦的是同一個對象麸拄,所以返回true。
?String 對象是不可變的黔姜,可以共享拢切。
通過字面量創(chuàng)建的字符串分配在常量區(qū)。
字符串常用方法
1.構(gòu)造方法
byte[] bytes1= {97,98,99};
String str= new String(bytes1);
------------------------------------
byte[] byte2 = {-42,-48};
??????? String str3 = null;
??????? try {
??????????? // 使用指定的字符集對字節(jié)序列進行解碼
??????????? str3 = new String(byte2,"GBK");
??????? }catch (UnsupportedEncodingException e) {
??????????? e.printStackTrace();
??????? }
------------------------------------
對一個utf-8的字節(jié)序列進行解碼
??????? byte[] byte3 ={-28,-72,-83,-28,-72,-83};
??????? try {
??????????? // String str4 = new String(byte3, "UTF-8");
??????????? String str4 = new String(byte3,0,3, "UTF-8");
??????? }catch (UnsupportedEncodingException e) {
??????????? e.printStackTrace();
??????? }
--------------------------------------
通過字符數(shù)組構(gòu)建字符串
??????? char[] c1 = {'a','b','c','中','國'};
??????? // String str5 = new String(c1);
??????? Stringstr5 = new String(c1,0,3);
2.字符串的比較
public static void main(String[] args) {
???????? // 【3】字符串比較
???????? String str1 = "abc";
???????? String str2 = "Abc";
???????? System.out.println(str1.compareTo(str2));
???????? // 忽略大小寫比較
???????? System.out.println(str1.compareToIgnoreCase(str2));
???????? // 需求:請輸入驗證碼
???????? /*String validCode = "a4Df";
???????? System.out.println("請輸入驗證碼:"+validCode);
???????? Scanner sc= new Scanner(System.in);
???????? String? inputStr = sc.next();
???????? if(inputStr.compareToIgnoreCase(validCode)? == 0) {
????????????? System.out.println("驗證碼正確");
???????? }else? {
????????????? System.out.println("驗證碼錯誤");
???????? }*/
???????? System.out.println(str1.contentEquals(str2));
???????? System.out.println(str1.equals(str2));
???????? System.out.println(str1.equalsIgnoreCase(str2));
???? }
3.查找秆吵、搜索字符串
public static void main(String[] args) {
??????? // 查找淮椰、搜索字符串中是否包含其他子串
??????? String str1 = "hello world";
??????? // 是否包含子串
??????? System.out.println(str1.contains("world"));
??????? System.out.println(str1.startsWith("he"));
??????? System.out.println(str1.endsWith("world"));
??????? System.out.println(str1.startsWith("ll", 2));
??????? // 需求:判斷一個文件是否是png圖片
??????? String fileName = "logo.png";
??????? if(fileName.endsWith(".png")) {
??????????? System.out.println(fileName+"是一張圖片");
??????? }
??????? // 查找字符串
??????? String str2 = "hello world hello";
??????? // 從左向右查找字符'o'第一次出現(xiàn)的位置,找到返回索引,沒找到返回-1
??????? System.out.println(str2.indexOf('t'));
??????? System.out.println(str2.indexOf('o',5));
??????? // 從左向右查找字符串“l(fā)l”第一次出現(xiàn)的位置,找到返回索引纳寂,沒找到返回-1
??????? System.out.println(str2.indexOf("ll"));
??????? System.out.println(str2.indexOf("ll",5));
??????? // 從右向左查找字符'o'第一次出現(xiàn)的位置,找到返回索引主穗,沒找到返回-1
??????? System.out.println(str2.lastIndexOf('o'));
??????? // lastIndex(char,fromIndex)
??????? // lastIndex(string);
??????? // lastIndex(string,fromIndex);
??? }
4.格式化字符串
通過指定占位符(%開始)格式化字符串
????????????????????%d? ? ? ? ? ? ? ? 格式化整形
????????????????????%f? ? ? ? ? ? ? ? ?格式化浮點型
????????????????????%.nf? ? ? ? ? ? ? 格式化浮點型四舍五入保留n為小數(shù)
????????????????????%c????????????????格式化字符
????????????????????%s????????????????格式化字符串
???????? // 格式化字符串
???????? float price = 998.126f;
???????? int a? = 10;
???????? int b = 2;
???????? // 10 / 2 = 5
???????? String str1= String.format("%d / %d = %d", a,b,(a/b));
???????? System.out.println(str1);
???????? // 四舍五入保留兩位小數(shù)
???????? String str2? =String.format("$%.2f", price);
???????? System.out.println(str2);
???? }
5.把字符串按指定編碼集編碼成對于的字節(jié)序列
????????//String str3 = "abc";
??????? String str3 = "中國";???????
??????? // 使用默認的字符集(GBK)
??????? byte[] byte1 = str3.getBytes();
??????? System.out.println(Arrays.toString(byte1));
??????? //String str4 = "abc";
??????? String str4 = "中國";???
??????? // 使用utf8編碼
??????? byte[] bytes2 = str4.getBytes("UTF-8");
??????? System.out.println(Arrays.toString(bytes2));
6.替換字符串
public static void main(String[] args)? {
???????? String str1 = "hello,world";
???????? String newStr1 = str1.replace('o', '8');
???????? System.out.println(newStr1);
???????? String newStr2 = str1.replace("ll", "");
???????? System.out.println(newStr2);
???????? // 需求:186-1234-2234
???????? String str3 = "186-1234-2234";
???????? System.out.println(str3.replace("-", ""));
???????? // 正則表達式專門用于驗證字符串是否符合特定的格式。
???????? String str4 = "6764";
???????? // 驗證str4是否輸入的是一串數(shù)字
???????? boolean r = str4.matches("\\d+");
???????? System.out.println(r);
???????? // 需求:abc123te23daf去掉數(shù)字
???????? String str5 = "abc123te23daf";
????????//String newStr5 = str5.replaceAll("\\d+","");
???????? String newStr5 = str5.replaceFirst("\\d+", "");
???????? System.out.println(newStr5);
}
7.拆分字符串
public static void main(String[] args)? {
???????? // 根據(jù)指定字符串拆分字符串
???????? String str1 = "abc-123";
???????? String[] arr = str1.split("-");
???????? System.out.println(Arrays.toString(arr));
???????? // 需求:請快速構(gòu)建一個26個小寫英文字母的數(shù)組
???????? String str2= "abcdefghijklmnopqrstuvwxyz";
???????? String[] arr2 = str2.split("");?????
???????? System.out.println(Arrays.toString(arr2));
???????? // 根據(jù)正則拆分字符串
???????? String str3 = "abc123ta12asd";
???????? String[] arr3 = str3.split("\\d+");
???????? System.out.println(Arrays.toString(arr3));
???????? // 需求:請獲取一個文件的文件名
???????? String fileName = "logo.png";
???????? String[]arr4 = fileName.split("\\.");
???????? System.out.println(Arrays.toString(arr4));
???? }
8.求子串毙芜、大小寫轉(zhuǎn)換
public static void main(String[] args)? {
??????? //求子串
??????? String str1 = "abc123";
??????? // fromIndex:開始位置忽媒,endInde 結(jié)束的位置
??????? // 含頭不含尾
??????? String sub1 = str1.substring(0, 3);
??????? System.out.println(sub1);
??????? String sub2 = str1.substring(3);
??????? System.out.println(sub2);
??????? // 大小寫轉(zhuǎn)換
??????? String str3 = "Abc";
??????? System.out.println(str3.toUpperCase());
??????? System.out.println(str3.toLowerCase());
??? }
9.其他方法
public static void main(String[] args)? {
??????? // 去掉前導空格和后導空格
??????? String str1 = "? abc? ? ";
??????? String newStr1 = str1.trim();
??????? System.out.println(str1.length());
??????? // 獲取字符串的字符數(shù)組
??????? char[] arr = str1.toCharArray();
??????? System.out.println(Arrays.toString(arr));
??????? // 把其他數(shù)據(jù)類型轉(zhuǎn)化為字符串
??????? String str2= String.valueOf(10);
??????? System.out.println(str2);
??? }
StringBuffer和StringBuilder
StringBuffer
StringBuffer是字符的可變?nèi)萜鳌腋粥?梢栽诔绦蜻\行過程中向容器中添加猾浦、刪除陆错、修改字符。
StringBuffer 本質(zhì)上是一個字符數(shù)組的包裝類金赦,并提供了很多方法向這個字符數(shù)組中添加音瓷、刪除、修改字符夹抗。
StringBuffer 是線程安全的
StringBuffer工作原理
StringBuffer 內(nèi)部維護了一個字符數(shù)組绳慎,默認字符數(shù)組的長度是16.當開發(fā)者向這個字符數(shù)組中添加元素時,如果有額外空間漠烧,直接添加到數(shù)組中杏愤,如果沒有額外空間,StringBuffer內(nèi)部自動拓容已脓。
拓容規(guī)則:當前容量*2+2,根據(jù)拓容的新空間珊楼,復(fù)制當前的數(shù)組內(nèi)容到新數(shù)組中。
public static void main(String[] args) {
???????? String Buffersb = new StringBuffer();
???????? sb.append("a");
???????? sb.append("b");
???????? System.out.println(sb.capacity());
???????? sb.append("1234567890ABCD");
???????? sb.append('x');
???????? System.out.println(sb);
???????? System.out.println(sb.capacity());
???????? // 未來如果確定不再向sb中添加字符度液,
???????? // 優(yōu)化內(nèi)部的數(shù)組到指定的長度
???????? sb.trimToSize();
???????? System.out.println(sb.capacity());
???? }
常用方法
public class Test01 {
???? public static void? main(String[] args) {
???????? StringBuffer sb1 = new StringBuffer();
???????? // 【1】添加
???????? sb1.append("hello");
???????? sb1.append('d');
???????? // 返回字符串的長度
???????? System.out.println(sb1.length());
???????? // 返回容器的大小
???????? System.out.println(sb1.capacity());
???????? // 【2】刪除
???????? //System.out.println(sb1);
???????? //sb1.delete(0, 5);
???????? //System.out.println(sb1);
???????? // 【3】insert(index,t) 在指定位置index添加t
???????? sb1.insert(0, "123");
???????? System.out.println(sb1);
???????? // 【4】修改
???????? sb1.setCharAt(0,? 'A');
???????? System.out.println(sb1);
???????? // 【5】setLength
???????? sb1.setLength(0);
????? // 清空容器內(nèi)容
???????? sb1.append("中國");
???????? System.out.println(sb1);
???? }
}
StringBuilder
StringBuiler就是為了緩解StringBuffer的執(zhí)行效率低而產(chǎn)生的厕宗,但線程不安全。
兩者工作原理與使用方法相似