包装类、字符串
http://www.cnblogs.com/dolphin0520/p/3780005.html
包裝類
包裝類就是基本數據類型對應的引用類型
集合 --> 集合只能存儲對象,存儲不了基本數據類型
ps:就算是包裝類在作為參數的時候,同樣是無法完成地址傳遞還是值傳遞
---------------------------------------------------------------------
基本數據類型 默認值 包裝類類型 默認值
byte? ? ? ? ? ? ? ?0? ? ? ? ? ? ? ? ? Byte? ? ? ? ? ? null
short? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ?Short? ? ? ? ? ?null
int? ? ? ? ? ? ? ? ? 0? ? ? ? Integer? ? ? ?null
long ?? ? ?0 ???Long? ? ? ? ? null
char? ? ? ? ? ? ?' '? ? ? ? ? ? ? ? ? Character? ? null
float? ? ? ? ? ? ?0.0? ? ? ? ? ? ? ?Flo? ? ? ? ? ? ? ?null
double? ? ? ? 0.0? ? ? ? ? ? ? ? Double? ? ? ? ?null
boolean? ? ? false? ? ? ? ? ? ? Boolean? ? ? ?null
數據如何進行拆箱和裝箱
自動裝箱:將基本數據類型封裝為對應的包裝類類型
必須是Jdk1.5以上
包裝類類型 對象名 = 對應的基本數據類型?
jdk1.5以下?
手動裝箱:將基本數據類型封裝為對應的包裝類類型
包裝類類型 對象名 = new 包裝類類型(對應的基本數據類型)
必須是Jdk1.5以上
自動拆箱:將包裝類轉換為原有的基本數據類型
基本數據類型 變量 = 對應包裝類對象
jdk1.5以下?
手動拆箱:將包裝類轉換為原有的基本數據類型?
基本數據類型 變量 = 包裝對象.XXXValue();
XXX --> 對應的基本數據類型
栗子:
int a = integer.intValue();
ps:基本數據類型中 整數型 小數型 char 可以互相兼容
基本數據類型的包裝之間沒有任何關系?
一點點關系整數型 和 小數型 都是Number的子類?
String和基本類型/包裝類之間的轉換操作?
看NumberfomatString
包裝類的緩存模式(享元原則)
Byte Short Integer Long 緩存[-128 ~ 127]?
Character 緩存[0 ~ 127]
若需要比較兩個引用類型是否相等,應該使用equals
不要使用 == 來進行比較,因為比較的是 地址
看 NumberDemo2
問題 Integer 和 int 之間的區別嗎?
1.默認值:
int是值類型 --> 0
Integer是引用類型 --> null
2.包裝類提供了一些操作方法,便于對數字進行操作而int沒有這些
3.在集合框架中只能存儲對象(引用)類型,不能存儲基本數據類型
4.int是開辟在棧空間 Integer是在堆和常量池中[-128 ~ 127]
字符串
String類
如何看待字符串:
字符串就是一個字符序列:把多個字符按照一定的循序排列起來
字符串分類
不可變字符串String:
在創建了String對象之后,這個字符串會存在在字符串池中,會的到其引用
若給當前String對象重新賦值,原有字符串不會消失,在次新建一個新的字符串,從而得到一個全新的引用
可變字符串 StringBuffer和StringBuilder
就是在同一個字符串的基礎之上進行操作,所有的修改都會映射到這個字符串上
String中常用的方法看StringDemo
Stringbuffer和StringBuilder
都是可變字符串,經過對API中的方法對比發現,API中的方法時相同
也就是說,只要一動一個可變字符串會使用,另外一個也可以同使用
在多線程并發訪問的前提
StringBuffer是線程安全
StringBuilder是線程不安全
在效率StringBuilder效率是高于StringBuffer,建議大家使用StringBuilder(單線程)
以StringBuilder為例介紹方法 StringBuilderDemo
測試:String和StringBuffer和StringBuilder分別拼接1000000次字符串的時間
/*** */ package com.qfedu.Day12.Number;public class NumberDemo {public static void main(String[] args) {//基本數據類型int age = 12;//自動裝箱//反編譯原碼看到 Integer ageObj = Integer.valueOf(age);//valueof 的返回值是使用 new Integer(i);//自動裝箱底層就是手動裝箱Integer ageObj = age;//手動裝箱Integer ageObj2 = new Integer(age);//自動拆箱//底層調用還是手動拆箱 ageObj.intValue() int age2 = ageObj;//手動拆箱int age3 = ageObj2.intValue();}}/*** */ package com.qfedu.Day12.Number;public class NumberDemo2 {public static void main(String[] args) {Integer i1 = new Integer(123);Integer i2 = new Integer(123);System.out.println(i1 == i2);//false 比較是i1和i2對象的堆中地址//Object中equals 比較的是地址//Integer中的equals一定是重寫System.out.println(i1.equals(i2));//true//享元原則:-->很久很久以前內存是很寶貴 64M//如果無節制的創建Integer對象,內存終究會慢//緩存機制Byte,Short Long Integer [-128 ~ 127]//在這個范圍之間若,已經創建了對象,那么就 不會重新創建新的對象//兩個對象會引用同一個空間Integer i3 = Integer.valueOf(123);Integer i4 = Integer.valueOf(123);System.out.println(i3 == i4);//true Integer i5 = 123;Integer i6 = 123;System.out.println(i5 == i6);//true Integer i7 = new Integer(250);Integer i8 = new Integer(250);System.out.println(i7 == i8);Integer i9 = Integer.valueOf(250);Integer i10 = Integer.valueOf(250);System.out.println(i3 == i4);//true Integer i11 = 250;Integer i12 = 250;System.out.println(i11 == i12);//falseSystem.out.println(i11.equals(i12));//true } } /*** */ package com.qfedu.Day12.Number.NumberFomatString;public class NumberFormatString {public static void main(String[] args) {//將某個字符串轉換為包裝類類型//轉換可以但是必須是數字并且在數據存儲范圍之內//若摻雜其他字符就會出現/** NumberFormatException: For input string: "123a"* 數字轉換異常* */Integer i1 = Integer.valueOf("123");Integer i2 = 123;System.out.println(i1+i2);//同樣要準守上面的原則Integer i3 = new Integer("123");//將包裝類轉換為字符串String str1 = i1.toString();//將基本數據類型轉換為字符串String str2 = 17 + "";//將String轉換為基本數據類型String str3 = "12345";int num = Integer.parseInt(str3);//ps:true / false 包裝了同樣如此//之人true和false除了這兩個無論參數是什么 都返回默認值 falseBoolean b = new Boolean("小黑貓");System.out.println(b);}} /*** */ package com.qfedu.Day12.String;import java.util.Arrays;public class StringDemo {public static void main(String[] args) {//String在底層是如何存儲//字符串底層就是一個字符數組 private final char value[];//String str = "abcd";//等價于 char[] cs = {'a','b','c','d'};//1.如何創建字符串//直接賦值創建字符串//"abc"存儲在字符串池(常量池)String str1 = "abc";//通過new關鍵字創建字符串/** 當前創建方式會創建幾個對象* 至少一個* 若"abc"在常量池中沒有被創建,那么就會在常量池中創建字符串* 在通過new關鍵字在堆空間創建出一個對象* 就會兩個對象* * 若"abc"已經在常量池存在,在通過new關鍵字在堆空間創建出一個對象并且會將"abc"拷貝一份* 存儲到堆空間 * 只會創建一個對象堆空間的對象*/String str2 = new String("abc");//常用方法://1.獲取字符串中的指定字符/** 字符串底層存儲是字符數組* 這個傳入的參數值是從0開始 到字符串長度-1* 不是這個范圍就會出現異常StringIndexOutOfBoundsException*/char ch = str1.charAt(0);System.out.println(ch);//2.字符串比較大小 (ASCII碼值 )//只要有一個不一樣就能得到結果,若全一樣也能得到結果//int類型的數值/** >0 當前字符串大于傳入字符串 * ==0 當前字符串等于傳入字符串* <0 當前字符串小于傳入字符串* ps:C# 字符串中的字符串比較不是遵守ASCII值,本地字符編碼* 當前字符串: 調用方法的字符串* 傳入字符串: 方法傳入的參數 */String str3 = "abc";String str3_1 = "ABC";int result = str3.compareTo(str3_1);if(result > 0) {System.out.println("str3字符串大");}else if(result < 0) {System.out.println("str3_1字符串大");}else {System.out.println("兩個字符串相等");}//3.字符串的拼接//3.1 +拼接String str4 = "hello";String str4_1 = "world";String str4_2 = str4 + str4_1;System.out.println(str4_2);//3.2方法拼接String str4_3 = str4.concat(str4_1);System.out.println(str4_3);//4.判斷字符串中是否存在指定字符串// true 存在 / false 不存在String str5 = "好的";String str5_1 = "的";boolean result1 = str5.contains(str5_1);System.out.println(result1);//5.若判斷字符串是否相同必須使用equals//字符串相同true 不同falseString str6 = "北京";String str6_1 = "深圳";System.out.println(str6.equals(str6_1));//6.格式化字符串(靜態方法)/*第一個參數 格式化控制符* %d 整數 %f小數 %c字符 %s字符串 %C漢字* 第二個參數時要格式化的數據* 格式化控制符需要和格式化數據一一對應* *///保留小數后兩位 保留幾位小數 就.幾 支持四舍五入String str7 = String.format("%.2f", 1.23556);System.out.println(str7);//不足兩位補0String str7_1 = String.format("%02d", 11);System.out.println(str7_1);//7.從當前字符串中找到第一次出現的位置//7.1在字符串中查找指定字符串(第一次出現的位置)//找到了返回第一次出現的位置, 沒找到返回-1String str8 = "abcdefc";char ch1 = 'c';int num = str8.indexOf(ch1);System.out.println(num);//從指定索引的位置據向后查找(第一次出現的位置)//指定位置是包含在查找范圍//找到了返回第一次出現的位置, 沒找到返回-1int num1 = str8.indexOf(ch1, 3);System.out.println(num1);//還有兩個重載,這兩個重載是查找字符串方法和上面是一樣//找到了返回第一次出現的位置, 沒找到返回-1String str8_1 = "are you ok!";String str8_2 = "ok";System.out.println(str8_1.indexOf(str8_2));//8.判斷 字符串是否為空 isEmpty()//字符串是不是""空串 而不是 是不是 null//true 空串 false 不是String str9 = "";System.out.println(str9.isEmpty());//9.獲取字符串長度System.out.println("abcdefghijklmn".length());//10.替換指定字符串中指定字符String str10 = "你好北京";System.out.println(str10.replace('你', '您'));//11.判斷所以XXX開頭, XXX結尾//true 是 false 不是System.out.println("www.baidu.com".startsWith("www"));System.out.println("www.baidu.com".endsWith("com"));//12.截取字符串//12.1截取指定位置的字符串(包含當前位置,從當前位置開始截取)String str11 = "你好唄!";System.out.println(str11.substring(2));//12.2截取指定位置的字符串(開始的位置和結束的位置)/** 第一個是開始的位置(包含)* 第二個是結束的位置(不包含)*/String str12 = "你好北京,天安門!";System.out.println(str12.substring(2, 8));//13.將字符串轉換為字符數組String str13 = "故宮,長城,頤和園";char[] arr = str13.toCharArray();System.out.println(Arrays.toString(arr));//14.將字符串轉換為大寫字母或小寫字母//所有的字母都轉換,必須是字母String str14 = "abcdefg";System.out.println(str14.toUpperCase());//大寫System.out.println(str14.toLowerCase());//小寫//15.將數值轉換成字符串(重載)String str15 = String.valueOf(10);System.out.println(str15);//16.去掉字符串中前后的空格(半角空格)String str16 = " hello world ";String str16_1 = str16.trim();System.out.println(str16_1);//17.字符串的拆分String str17 = "a b c d";//字符串數組String[] str17_1 = str17.split(" ");System.out.println(Arrays.toString(str17_1));}} /*** */ package com.qfedu.Day12.StringBuilder;public class StringBuilderDemo {/*** @param args*/public static void main(String[] args) {//構建StringBuilder對象//默認使用無參構造方法創建對象,系統會自動開始一個16大小字節數組//自動擴容,創建一個更大的數組,將原有數組中成員復制到新數組中,使用這個新數組StringBuilder sbr = new StringBuilder();//使用給定容量大小的數組StringBuilder sbr1 = new StringBuilder(80);//使用字符串創建StringBuilder對象StringBuilder sbr2 = new StringBuilder("小黃人");//絕對不能使用這種方式創建//StringBuilder sbr3 = "abcdefug";//1.向字符串中添加內容,是想最后一位置添加sbr2.append("小紅人"); sbr2.append('小');sbr2.append(10);System.out.println(sbr2);//鏈式編程 就是因為當前append返回值是this-->當前對象//this關鍵字,當做參數傳遞sbr.append("你好").append("我好").append("大家好");System.out.println(sbr);//2.獲取長度 length();//3.刪除指定位置的字符串/** 第一個參數是開始的位置(包含)* 第二個參數是結束的位置(不包含)*/sbr2.delete(0, 3);System.out.println(sbr2);//4.刪除指定位置的字符串sbr2.deleteCharAt(0);System.out.println(sbr2);//將指定字符串插入到指定位置//第一個參數要插入的位置,原有字符串后移//第二個參數要插入的字符串sbr2.insert(1, "啦啦啦啦啦啦啦");System.out.println(sbr2);//替換指定位置的字符串/** 第一個參數開始的位置(包括)* 第二個參數結束的位置(不包括)* 第三個參數替換的字符串*/sbr2.replace(1, 7, "餓了么");System.out.println(sbr2);//反轉 sbr2.reverse();System.out.println(sbr2);//修改指定位置的字符sbr2.setCharAt(0, 'k');//StringBuilder轉換為String字符串String str = sbr2.toString();}} package com.qfedu.Day12.Time;public class TimeDemo {public static void main(String[] args) {System.out.println("String字符串拼接10000次的時間:"+StringTime()+"毫秒");System.out.println("StringBuffer字符串拼接10000次的時間:"+StringBufferTime()+"毫秒");System.out.println("StringBuilder字符串拼接10000次的時間:"+StringBuilderTime()+"毫秒");}//Stringpublic static long StringTime() {//獲取開始的時間long beginTime = System.currentTimeMillis();String str = "";for(int i = 0;i<1000000;i++) {str += i;}long endTime = System.currentTimeMillis();return endTime - beginTime;}//StringBufferpublic static long StringBufferTime() {//獲取開始的時間long beginTime = System.currentTimeMillis();StringBuffer sbr = new StringBuffer();for(int i = 0;i<1000000;i++) {sbr.append(i);}long endTime = System.currentTimeMillis();return endTime - beginTime;}//StringBuilderpublic static long StringBuilderTime() {//獲取開始的時間long beginTime = System.currentTimeMillis();StringBuilder sbr = new StringBuilder();for(int i = 0;i<1000000;i++) {sbr.append(i);}long endTime = System.currentTimeMillis();return endTime - beginTime;}}?
package com.tju.day12homework;import java.util.Arrays;public class exercise03 {public static void main(String[] args) {String string = "this is a test of java";char[] cs = string.toCharArray();/** 方法一:解題思路,將字符串放到char數組中,除了第一個單詞的首字母個, 其他的在空格的下一個下標的字符轉換成大寫*/// 先將第一個下標的字符轉換成大寫cs[0] = Character.toUpperCase(cs[0]);for (int i = 0; i < cs.length - 1; i++) {if (cs[i] == ' ') {// 將空格的下一個下標處的字符轉換成大寫cs[i + 1] = Character.toUpperCase(cs[i + 1]);}}for (char c : cs) {System.out.print(c);}System.out.println();/* * 方法二:解題思路是以空格為界,拆分成每一個單詞,然后再將首字母轉成大寫 */String[] strings = string.split(" ");for (int i = 0; i < strings.length; i++) {char c = strings[i].charAt(0);char c2 = Character.toUpperCase(c);// 將已經轉成大寫的字符與截取的字符進行拼接strings[i] = c2 + strings[i].substring(1);}System.out.println(Arrays.toString(strings)); // 方法三:for (String string2 : strings) { // 得到每一個單詞的第一個字母String string4 = String.valueOf(string2.charAt(0)); // 將每一個首字母轉成大寫String string5 = string2.replaceFirst(string4, string4.toUpperCase());System.out.print(string5 + " ");}}}package com.tju.day12homework;public class exercise04 {public static void main(String agrs[]){String string = "this is a test of java";word_reverse(string);}//字符反轉public static void char_reverse(String line){char[] chars = new char[line.length()];for (int i = line.length()-1,j = 0; i >= 0; i--,j++) {chars[j] = line.charAt(i);System.out.println(chars[j]);}line = String.copyValueOf(chars);System.out.println(line);//方法2 更簡單:StringBuffer sb = new StringBuffer();//方法3 更簡單 更快StringBuilder sb1 = new StringBuilder();sb.append(line);sb.append(line);System.out.println(sb.reverse());System.out.println(sb1.reverse());}//單詞反轉public static void word_reverse(String line){String[] str = line.split(" ");StringBuilder str1 = new StringBuilder();for (int i = str.length-1; i >= 0; i--) {str1.append(str[i]);if (i>0){str1.append(" ");}}System.out.println(str1);} }?
/*** */ package com.qfedu.Day13.HomeWork;import java.util.Arrays; import java.util.Scanner;import javax.swing.text.IconView;public class HomeWork {/*** 1.從控制臺錄入一個字符串,如果這個字符串以大寫字母開頭,將該字符串轉成全小寫;* 如果這個字符串以小寫字母開頭,將該字符串轉成全大寫2.去除字符串中所有的空格。例如 a b c d e f --> abcdef3.將一個字符串進行反轉。將字符串中指定部分進行反轉 例如 abcdefg --> abfedcg4.將電話號中間4位替換成XXXX 例如13842383838-->138XXXX38385.已知字符串:"this is a test of java"執行以下操作:1.統計出字符串中s出現的次數2.取出字符串中"test"3.將字符串轉換成一個字符數組4.將字符串中每個單詞的第一個字母變成大寫,輸出到控制臺5.將字符串是此案倒敘輸出 "java of test a is this"6.輸入一個時間,輸出它的下一秒時間(字符串版本)例如輸入 20:39:40輸出 20:39:4120:39:5920:40:0020:59:5921:00:0023:59:5900:00:007."華為"公司去年的營業額是:1798798099079798098格式化后的金額信息是:1,798,798,099,079,798,098*/public static void main(String[] args) {//1.// First();//2.// second();//3.// thrid();//4.// fourth();//5.// fifth();//6.// sixth();//7. seventh();}public static void First() {Scanner input = new Scanner(System.in);String str = input.next();if(str.charAt(0)>='A' && str.charAt(0)<='Z') {System.out.println(str.toLowerCase());}else {System.out.println(str.toUpperCase());}}public static void second() {String str = " a b c d e f ";StringBuffer sbr = new StringBuffer();//字符串底層是一個字符數組,提供length() 可以使用類似數組的方式直接操作字符串for(int i = 0; i<str.length();i++) {if(str.charAt(i)!=' ') {sbr.append(str.charAt(i));}}System.out.println(sbr);}public static void thrid() {Scanner input = new Scanner(System.in);String str = input.next();System.out.println("請輸入開始的位置:");int beginIndex = input.nextInt();System.out.println("請輸入結束的位置:");int endIndex = input.nextInt();//進行截取String subStr = str.substring(beginIndex, endIndex+1);StringBuffer sbr = new StringBuffer(subStr);sbr.reverse();//進行字符串翻轉String newStr = sbr.toString();//翻轉完成的str = str.replace(subStr, newStr);System.out.println(str);}public static void fourth() {String str = "13842383838";char[] buf = str.toCharArray();for(int i =0 ;i<buf.length;i++) {if(i>=3 && i<=6) {buf[i] = 'X';}}//通過字符串創建字符串String newStr = new String(buf);System.out.println(newStr);}public static void fifth() {//5.1String str = "this is a test of java";int count = 0;for(int i = 0;i<str.length();i++) {if(str.charAt(i) == 's') {count++;}}System.out.println("s的次數是:"+count);//5.2int index = str.indexOf("test");String subStr = str.substring(index,(index+"test".length()));System.out.println("截取:"+subStr);//5.3char[] buf = str.toCharArray();System.out.println("字符數組:"+Arrays.toString(buf));//5.4String[] strArray = str.split(" ");System.out.println("字符串數組存儲的元素:"+Arrays.toString(strArray));StringBuffer sbr = new StringBuffer();char[] bufs;for(String s : strArray) {bufs = s.toCharArray();bufs[0] = (char)(bufs[0] - 32);for(int i = 0;i<bufs.length;i++) {sbr.append(bufs[i]);}sbr.append(' ');}System.out.println("第一個單詞字母大寫后的字符串:"+sbr);//5.5for(int i = 0;i<strArray.length/2;i++) {String tmp = strArray[i];strArray[i] = strArray[strArray.length-1-i];strArray[strArray.length-1-i] = tmp;}//按照要求進行拼接/** 第一個參數就要按照什么隔開(拼)* 第二個參數是一個字符串數組*/String newStr = String.join(" ", strArray);System.out.println(newStr);}public static void sixth() {Scanner input = new Scanner(System.in);String time = input.next();//20:39:40String[] times = time.split(":");//20,39,40int h = new Integer(times[0]);int m = new Integer(times[1]);int s = new Integer(times[2]);s++;if(s == 60) {s = 0;m++;if(m == 60) {m = 0;h++;if(h == 24) {h = 0;}}}System.out.println(String.format("%02d", h)+":"+String.format("%02d", m)+":"+String.format("%02d", s));}public static void seventh() {String str = "1798798099079798098";StringBuffer sbr = new StringBuffer(str);for(int index = sbr.length()-3; index > 0; index -= 3) {sbr.insert(index, ',');}System.out.println(sbr);}}?
轉載于:https://www.cnblogs.com/lijun199309/p/9477002.html
總結
- 上一篇: MongoDB之python简单交互(三
- 下一篇: redis面试问题(二)