1. 程式人生 > 其它 >Java學習第三十八天<包裝類><String類><StringBuffer><StringBuilder>

Java學習第三十八天<包裝類><String類><StringBuffer><StringBuilder>

包裝類

package chapter16.包裝類;
​
public class WrapperType {
    public static void main(String[] args) {
          //父類object
​
         //boolean>Boolean
         //char>Character
        // Number子類
​
         //byte>Byte
         //short>Short
         //int>Integer
         //long>Long
         //float>Float
         //double>Double
​
        //int >Integer jdk5以前是手動裝箱和拆箱
        int n1=100;
        Integer integer = new Integer(n1);
        Integer integer1 = Integer.valueOf(n1);
        //Integer>int 手動拆箱
        int i=integer.intValue();
        //jdk5後自動裝箱拆箱
        int n2=200;
        Integer integer2=n2;//底層仍是Integer.valueOf(n2);
        int n3=integer2;//底層仍用integer.intValue();
        //其他包裝類用法一致
    }
}

 

package chapter16.包裝類;
​
public class WrapperVSString {
    public static void main(String[] args) {
        //包裝類 Integer >> String
        Integer i=100;
        String str1=i+"";             //方式1 不影響 i 的型別
        String str2=i.toString();     //方式2
        String str3=String.valueOf(i);//方式3
​
        //String >> Integer
        String str4="12345";
        Integer i2 =Integer.parseInt(str4);//方式1
        Integer i3 =new Integer(str4);     //方式2
​
    }
}

 

package chapter16.包裝類;
//右鍵 show diagram 點m可看方法
public class WrapperMethod {
    public static void main(String[] args) {
        System.out.println(Integer.MIN_VALUE);//返回最小值
        System.out.println(Integer.MAX_VALUE);
​
        System.out.println(Character.isDigit('a'));//判斷是否數字
        System.out.println(Character.isLetter('a'));//判斷是否字母
        System.out.println(Character.isUpperCase('a'));//是否大寫
        System.out.println(Character.isLowerCase('a'));
​
        System.out.println(Character.isWhitespace('a'));//是否空格
        System.out.println(Character.toUpperCase('a'));//轉大寫
        System.out.println(Character.toLowerCase('A'));
    }
}

 

package chapter16.包裝類;
​
public class WrapperExercise {
    public static void main(String[] args) {
        Integer i=new Integer(1);
        Integer j=new Integer(1);
        System.out.println(i==j);//F new後物件不同
        Integer m=1;
        Integer n=1;//底層Integer.valueOf(1) 閱讀原碼 在-128--127之間直接返回,否則new
        System.out.println(m==n);//T
        Integer x=128;
        Integer y=128;//超出範圍,會new
        System.out.println(x==y);//F
        Integer i9=127;//底層Integer.valueOf(127)
        Integer i10=new Integer(127);
        System.out.println(i9==i10);//F 一個是從cache裡拿的,一個是new的
        Integer i11=127;
        int i12=127;
        System.out.println(i11==i12);//T 有基本資料型別判斷值是否相等
        Integer i13=128;
        int i14=128;
        System.out.println(i13==i14);//T
    }
}

 

String類

 

 

package chapter16.String類;
​
public class String01 {
    public static void main(String[] args) {
        //String實現 介面 Serializable 可序列化:在網路中傳輸
        //          介面 Comparable   物件可比較大小
        //有屬性 private final char value[] 用於存放字串內容 value陣列是final類,一旦賦值地址不能修改(不能指向新的物件) 單個字元內容可修改
        String a="abc";
        String b="abc";
        System.out.println(a.equals(b));//T 方法重寫,比較每個字元
        System.out.println(a==b);//T
        //記憶體圖
        System.out.println("===============================");
        String c=new String("abc");
        System.out.println(a.equals(c));//T 比較每個字元
        System.out.println(a==c);//F 地址不同
        System.out.println(a==c.intern());//T intern()返回常量池地址
        System.out.println(c==c.intern());//F 一個指向堆 一個是常量池 地址不同
        System.out.println("===============================");
        Person p1 = new Person();
        p1.name="xx";
        Person p2 = new Person();
        p2.name="xx";
        System.out.println(p1.name.equals(p2.name));//T
        System.out.println(p1.name==p2.name);//T
        System.out.println(p1.name=="xx");//T
        System.out.println(p1.name.intern()=="xx");//T
        System.out.println(p1.name.intern()==p1.name);//T
        System.out.println("==============================");
        String s1=new String("yy");
        String s2=new String("yy");
        String s3="y"+"y";//會優化成 String s3="yy"; 只建立一個物件 常量相加看池
        System.out.println(s1==s2);//F 指向不同堆
        System.out.println(s1==s3);//F
        System.out.println(s1.intern()==s3);//T
        System.out.println("===============================");
        String e="hello";
        String f="world";
        String g=e+f;//g先指向堆中陣列物件,陣列再指向常量池“helloworld” 變數相加看堆
        //共建立三個物件
        String h="helloworld";
        System.out.println(g==h);//F
        System.out.println(g.intern()==h);//T
    }
}
class Person{
    public String name;
}

 

package chapter16.String類;
​
public class String02 {
    String str =new String("xx");
    final char[] ch={'j','a','v','a'};
    public void change(String str,char ch[]){
        str ="java";//change裡的str直接指向常量池,不影響物件的str指向xx
        ch[0]='h';//change裡的ch指向了物件的ch,並修改了第一個值
    }
​
    public static void main(String[] args) {
        String02 ex = new String02();
        System.out.println(ex.ch);//java
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str+"and");// “xx” + “and”
        System.out.println(ex.ch);//hava
    }
}

 

package chapter16.String類;
​
public class StringMethod {
    public static void main(String[] args) {
        String str1="hello";
        String str2="Hello";
        System.out.println(str1.equals(str2));//F 區分大小寫
        System.out.println(str1.equalsIgnoreCase(str2));//T 不區分大小寫
        System.out.println(str1.length());//5
        System.out.println(str2.indexOf('e'));//1 找字元索引,找不到返回-1
        System.out.println(str2.indexOf('y'));//-1
​
​
        System.out.println(str1.substring(1));//ello 擷取制定索引位置後邊字串
        System.out.println(str1.substring(1,3));//el [1,3)個字串
​
        System.out.println(str1.indexOf("llo"));//2 第一次出現的索引
        System.out.println(str1.lastIndexOf("lo"));//3 最後一次出現的索引
        System.out.println(str1.indexOf("rr"));//-1
​
        System.out.println(str1.toUpperCase());//HELLO 換成大寫
        System.out.println(str2.toLowerCase());//hello 換小寫
        System.out.println(str1.concat(str2));//helloHello 拼接
        System.out.println(str1.replace('l','u'));//heuuo 將所有l換成u
        System.out.println(str1.replace("he","HH"));//HHllo 換字串
        System.out.println("=====================");
        String[] s = str1.split("l");//以 l 為分隔符 將字串分隔為字串陣列 l變成空格回車 特殊字元首尾要加轉義符“\”
        for (int i = 0; i < s.length; i++) {
            System.out.println(s[i]);
        }
        System.out.println("=====================");
        char []chs=str1.toCharArray();
        for (int i = 0; i < chs.length ; i++) {//轉化成字元陣列
            System.out.println(chs[i]);
        }
        System.out.println("======================");
        String a="jaui";
        String b="jcty";
        String c="ja";
        String d="gh";
        System.out.println(a.compareTo(b));//-2 從前往後比較字母大小,得到差值
        System.out.println(a.compareTo(c));//2 前面字母一致,長度不一致,則是長度之差
        System.out.println(a.compareTo(d));//3
        System.out.println("=======================");
        String name="John";
        int age =10;
        double score=98.3;
        char gender='男';
        String info=String.format("我的名字是%s年齡%d,成績是%.2f性別是%c",name,age,score,gender);//佔位符填資訊
        System.out.println(info);
​
    }
}

 

StringBuffer

 

package chapter16.String類;
​
public class StringBuffer01 {
    public static void main(String[] args) {
        //StringBuffer 的直接父類是 AbstractStringBuilder
        //StringBuffer 實現了 Serializable 即StringBuffer物件可序列化
        //在父類AbstractStringBuilder中 有屬性 char[] value,不是final 存放字串內容,因此是存放在堆中
        //StringBuffer 是final類 不能被繼承
        //因為StringBuffer 字元內容是存在 char[] value中,增加的字元補上空的空間即可 不用每次更換地址(建立新物件)除非陣列空間不夠
        StringBuffer stringBuffer = new StringBuffer();//建立一個容量為16的char[] 存放字元內容
        StringBuffer stringBuffer1 = new StringBuffer(100);//可通過構造器指定空間大小
        StringBuffer hello = new StringBuffer("hello");//給一個字串str建立StringBuffer char[]的大小就是 str+16
​
        //String>StringBuffer
        String str="hello tom";
        StringBuffer stringBuffer2 = new StringBuffer(str);//方式1 返回StringBuffer物件,對str本身沒影響
        StringBuffer stringBuffer3 = new StringBuffer();
        stringBuffer3=stringBuffer3.append(str);//方式2
​
        //StringBuffer>String
        StringBuffer stringBuffer4 = new StringBuffer("xx");//方式1 使用StringBuffer 提供的toString
        String s=stringBuffer4.toString();
​
        //使用構造器來搞定
        String s1=new String(stringBuffer4);//方式2 用構造器
​
    }
}

 

package chapter16.String類;
​
public class StringBuffer02 {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //新增append
        s.append(',');
        s.append("張三丰");
        s.append("趙敏").append(100).append(true).append(10.5);//轉成字元
        System.out.println(s);
        //刪除
        s.delete(11,14);//刪除[11,14)內容
        System.out.println(s);
        s.replace(9,11,"哈哈");//替換[9,11)內容為哈哈
        System.out.println(s);
​
        System.out.println(s.indexOf("張三丰"));//查詢字串第一次出現的索引
        s.insert(9,"趙敏");//在索引9位置插入字串
        System.out.println(s);
        System.out.println(s.length());//字串長度
​
    }
}

 

package chapter16.String類;
​
public class StringBufferExercise01 {
    public static void main(String[] args) {
        String str=null;
        StringBuffer sb = new StringBuffer();
        sb.append(str);//底層呼叫的是AbstractStringBuilder 的appendNull
        System.out.println(sb.length());
        System.out.println(sb);
    }
}

 

package chapter16.String類;
​
import java.util.Scanner;
​
public class StringBufferExercise02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuffer sb = new StringBuffer(scanner.next());
​
        for (int i=sb.lastIndexOf(".")-3; i>0; i-=3) {//先-3後判斷 不然會有最前面加,
            sb=sb.insert(i,",");
        }
        System.out.println(sb);
    }
}

 

StringBuilder

package chapter16.String類;
​
public class StringBuilder01 {
    public static void main(String[] args) {
        /*
        1 繼承AbstractStringBuilder類
        2.實現了Serializable, CharSequence 可序列化(網路傳輸,儲存到檔案)
        3.是final類 不能被繼承
        4.StringBuilder 物件字元序列仍然是存放在父類 AbstractStringBuilder 的 char[] value 因此字元序列存放堆中
        5.StringBuilder 方法沒有做互斥處理,即沒有synchronized關鍵字 因此單執行緒情況下使用StringBuilder 效率最高
         */
        StringBuilder stringBuilder = new StringBuilder();
        //使用同 StringBuffer
    }
​
}