1. 程式人生 > >黑馬程式設計師——java-幾個常用的類(Object,Scanner,String,StringBuffer/StringBuilder)

黑馬程式設計師——java-幾個常用的類(Object,Scanner,String,StringBuffer/StringBuilder)

1 Object類

 Object類層次結構的根類,所有的類都直接或間接的繼承自該類
Object類中常用的方法

public String toString()---//返回該物件的字串表示
public final Class  getClass()---返回的是位元組碼物件//反射時候用到
public boolean equals(Object obj)--指示其他某個物件是否與此物件“相等”。 
protected void finalize()-----當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法   
public int hashCode()----返回地址值
重要的方法:

---public String toString()

返回物件的字串表達形式--getClass().getName() + '@' + Integer.toHexString(hashCode())

一般輸出物件(s)的引用的時候,預設輸出的都是該引用呼叫的toString()方法 (s.toString() )  

         一般都重寫此方法。重寫的時候,不用自己新增,快捷鍵Alt+Shift+s,然後點選toString()即可。
package importMethod;

class Persion// 定義一個Persion類
{
    public
String name; public int age; public Persion(String name, int age)// 帶引數的構造方法 { this.name = name; this.age = age; } @Override public String toString()//重寫Object類的該方法 { return "Persion [name=" + name + ", age=" + age + "]"; } } public class ObjectDemo { public
static void main(String[] args) { Persion persion = new Persion("袁郎", 25);// 建立Persion物件 //System.out.println(persion);// 列印Persion物件(看結果) // 輸出的結果是:[email protected](說明給Persion類沒有重寫toString()方法) System.out.println(persion);// 列印Persion物件(看結果) //輸出結果為:Persion [name=袁郎, age=25](因為Persion類重寫了toString()方法) } }
---public boolean equals(Object obj)

   ==的作用
    --比較基本型別,比較的是基本型別的值是否相同
    --比較引用型別,比較的是引用型別的地址值是否相同   
預設情況下Object的equals方法比較的是物件的地址值是否相同
所以如果要比較物件的值是否相同,需要重寫equals方法,也不用手動新增,有快捷鍵    

---物件 instanceof 類名(判斷,該物件是否是該類的一個物件)

2 Scanner類的用法

   用法:用於接受使用者鍵入的資料
  構造方法:--public Scanner(InputStream source)

   Scanner in =new Scanner(System.in);

   解釋這個構造方法中的引數問題:
   System類中有一個成員變數in,是靜態修飾的:如下
   public static final InputStream in;
   所以:System.in呼叫後返回的是一個InputStream 位元組輸入流的物件(詳情看IO流那一節)

    Scanner類中的重要方法:
    --public byte nextByte()//接受位元組
    --public int nextInt()//接受int型別
    --public long nextLong()//接受long型別
    --public float nextFloat()//接受float型別
    --public double nextDouble()//接受double型別
    --public short nextShort()//接受short型別
    --public String nextLine()//接受String型別


package importMethod;

import java.util.Scanner;

public class ScannerDemo
{
    private void mian()
    {
        Scanner in =new Scanner(System.in);//定義一個掃面器物件
        System.out.println("請輸入一個整數");

        int a=in.nextInt();//接受資料
        System.out.println("輸入的數是:"+a);//輸出資料
    }

}
小問題----連續的先接受一個int在接受一個String時候在輸入一個int值後,int值預設後邊還有\n,此時 會\n當做String賦值
int i=sc.nextInt();String s=sc.nextLine();
解決方法;
     ---A在int值接受結束後再,重新定義一個Scanner 物件用於接受String
package importMethod;

import java.util.Scanner;

public class Scannerproblem
{
    public static void main(String[] args)
    {
        Scanner s=new Scanner(System.in);

        int a=s.nextInt();
        Scanner i=new Scanner(System.in);//接受一個int型別的資料後,重新定義掃描器
        String string=i.nextLine();//在接受一個String型別的資料

        System.out.println(a);
        System.out.println(string);
    }

}
  ---B 把所有的資料都用字串接受,然後要什麼型別就轉成什麼型別(用到String類)
package importMethod;

import java.util.Scanner;

public class Scannerproblem
{
    public static void main(String[] args)
    {
        Scanner i =new Scanner(System.in);

        String s=i.nextLine();
        //在接受一個String型別的資料,把所有資料都用String接受
        //在輸出的時候,需要什麼型別,就轉成什麼型別


        System.out.println(s.valueOf(s));

    }

}

3 String類

構造方法:
A--String()
B--String(byte[] bytes) 把位元組陣列轉成字串
C--String(byte[] bytes, int index, int length)把位元組陣列的一部分轉成字串
D--String(char[] value) 把字元陣列轉成字串
E--String(char[] value, int indexint count) 把字元陣列的一部分轉成字串
F--String(String original) 把字串轉成字串
package com.itheima;

/*
 * 構造方法:
 A--String()
 B--String(byte[] bytes) 把位元組陣列轉成字串
 C--String(byte[] bytes, int index, int length)把位元組陣列的一部分轉成字串
 D--String(char[] value) 把字元陣列轉成字串
 E--String(char[] value, int indexint count) 把字元陣列的一部分轉成字串
 F--String(String original) 把字串轉成字串

 */
public class string_Demo {
    public static void main(String[] args) {
        // A--String()
        String s = new String();
        System.out.println("s 物件的長度為:" + s.length());

        // String(char[] value) 把字元陣列轉成字串
        char[] ch = new char[] { 'e', 'd', 'c', 'b', 'a' };
        String bs = new String(ch);// 把字元陣列轉成字串
        String bs1 = new String(ch, 0, 2);// 把字元陣列的一部分轉成字串
        System.out.println(bs);

        // String(String original) 把字串轉成字串
        System.out.println(new String(new String("趙雲!")));// 把字串轉成字串

    }

}
  字串的特點:一但被賦值,它的值就不能被改變(但是字元物件的引用所指向的地址是可以改變的)
        字串的本質就是一個字元陣列(陣列的特點,長度是固定的)
例子:
    String s="hello";
               s+="world";
    System.out.println(s);//輸出的值是:helloworld
面試題1
 String s=new String("hello")和String s1="hello"的區別?
 s==s1(false)比較的是地址 s.equals(s1)(true)比較的是內容
畫記憶體圖可以解釋
![這裡寫圖片描述](https://img-blog.csdn.net/20150428103348930)
面試題2
String s1="hello"
String s2="world"
String s3="helloworld"
s3.equals(s1+s2)//true

s3==s1+s2//false  字元變數相加,先開空間在相加儲存 
s3=="hello"+"world"//true  字元常量相加,先相加,再在常量池中找如果有,就返回常量池的地址,否則在開空間,返回地址
String的方法(判斷方法)
  A--public boolean equals(Object anObject)
  比較字串的內容是否相同,區分大小寫
  B--public boolean equalsIgnoreCase(String anotherString)
  按字典順序比較兩個字串,不考慮大小寫

  C--public boolean contains(CharSequence s)
  判斷字串中是否包含指定的字元
  D--public boolean endsWith(String suffix)
  判斷是否是以指定的字元結尾
  E--public boolean startsWith(String prefix,int toffset)
       判斷是否是以指定的字元開頭  
  F--public boolean isEmpty()
      判斷字串是否為空
      String s=""
      s.idEmpty()//結果為true
      String s="null"
      s.idEmpty()//這樣寫要報錯,空物件,就是沒有物件,沒有物件就不能呼叫方法
package com.itheima;

/*String 的判斷方法:
 *  A--public boolean equals(Object anObject)
     比較字串的內容是否相同,區分大小寫
     B--public boolean equalsIgnoreCase(String anotherString)
       按字典順序比較兩個字串,不考慮大小寫
     C--public boolean contains(CharSequence s)
      判斷字串中是否包含指定的字元
      D--public boolean endsWith(String suffix)
      判斷是否是以指定的字元結尾
      E--public boolean startsWith(String prefix,int toffset)
           判斷是否是以指定的字元開頭               
      F--public boolean isEmpty()
        判斷字串是否為空
 */
public class string2 {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "hello";

        System.out.println(s1.equals(s2));// 結果為false,次方法比較大小寫
        System.out.println(s1.equalsIgnoreCase(s2));// 結果為true。次方法不區分大小寫
        System.out.println(s1.contains("ello"));//結果為true ,包含指定的字元
        System.out.println(s1.startsWith("He"));//結果為true,以指定的字元開頭  
        System.out.println(s1.endsWith("lo"));//結果為true,以指定的字元結尾
        System.out.println(s1.isEmpty());//結果為false,字串為空

    }

}
String的方法(獲取功能)
   A--public int length()//返回字串的長度
   B--public char charAt(int index)//返回指定索引處的字元
   C--public int indexOf(int ch)//返回指定字元在字串中第一次出現的索引
   D--public int indexOf(int ch,int fromIndex)
            //獲取ch這個字元在該字串中的指定索引後第一次出現的索引  
   E--public int indexOf(String str,int fromIndex)
   //獲取str字串在該字串中從指定索引後第一次出現的索引  

   F--public int indexOf(String str)//獲取指定字串在字串中第一次出現的索引

   G--public String substring(int beginIndex)
     //獲取字串,從指定索引到結尾
   H--public String substring(int beginIndex,int endIndex)
       //獲取字串,從beginIndex到endIndex(牢記,獲取的字串包括左邊,不包括右邊)
package com.itheima;

/*
 *    A--public int length()//返回字串的長度
 B--public char charAt(int index)//返回指定索引處的字元
 C--public int indexOf(int ch)//返回指定字元在字串中第一次出現的索引
 D--public int indexOf(int ch,int fromIndex)
 //獲取ch這個字元在該字串中的指定索引後第一次出現的索引  
 E--public int indexOf(String str,int fromIndex)
 //獲取str字串在該字串中從指定索引後第一次出現的索引  

 F--public int indexOf(String str)//獲取指定字串在字串中第一次出現的索引

 G--public String substring(int beginIndex)
 //獲取字串,從指定索引到結尾
 H--public String substring(int beginIndex,int endIndex)
 //獲取字串,從beginIndex到endIndex(牢記,獲取的字串包括左邊,不包括右邊)
 */
public class String3 {
    public static void main(String[] args) {

        String s = "heallo,java";
        System.out.println(s.length());// 返回字串的長度
        System.out.println("s字串中,下標為2處的字元為:" + s.charAt(1));// 獲取:下標為2處的字元
        System.out.println(s.indexOf("jav"));// 返回指定字元在字串中第一次出現的索引
        System.out.println(s.indexOf("a", 3));// 獲取ch這個字元在該字串中的指定索引後第一次出現的索引

        System.out.println(s.substring(2));// 結果為:allo,java--獲取字串,從指定索引到結尾
        System.out.println(s.substring(0, 3));// 結果為:hea---(牢記,獲取的字串包括左邊,不包括右邊
    }

}
String的遍歷
    通過A--public int length()方法和B--public char charAt(int index)方法可以遍歷String
package com.itheima;

public class string4 {
    public static void main(String[] args) {
        String s="androd,java";
        //字串的遍歷:兩個方法的結合
        /*
         * 通過A--public int length()方法
         * B--public char charAt(int index)方法可以遍歷String
         */
        for (int i = 0; i < s.length(); i++) {
            System.out.println(s.charAt(i));

        }

    }

}
String的方法(轉換功能)

        byte[] getByteds()把字串轉成位元組陣列
        char[] toCharArray()把字串轉成字元陣列
        static String copyValueOf(char[] chs)把字元陣列轉成字串
        static String valueOf(char[] chs)把字元陣列轉成字串
        static String valueOf(int i)基本型別,把基本型別轉成字串
        String toLowerCase()把字串轉成小寫
        String toUpperCase()把字串轉成大寫
        String concat(String str)字串拼接
package importMethod;

public class StringDemo
{
    public static void main(String[] args)
    {
        /*
         * String的方法(轉換功能)
         * 
         * byte[] getByteds()把字串轉成位元組陣列 char[] toCharArray()把字串轉成字元陣列
         * 
         * static String copyValueOf(char[] chs)把字元陣列轉成字串 static String
         * valueOf(char[] chs)把字元陣列轉成字串 static String valueOf(int
         * i)基本型別,把基本型別轉成字串
         * 
         * String toLowerCase()把字串轉成小寫 String toUpperCase()把字串轉成大寫 String
         * concat(String str)字串拼接
         */

        String s = "java-android";

        byte[] bys = s.getBytes();// 把字串轉成位元組陣列
        System.out.println("此陣列bys的長度是:" + bys.length);

        char[] ch = s.toCharArray();// 把字串轉成字元陣列
        System.out.println("此陣列ch的長度是:" + ch.length);

        char[] ch1 = new char[]
        { 'a', 'n', 'd', 'r', 'o', 'i', 'd' };
        System.out.println(String.valueOf(ch1));// 把字元陣列轉成字串
        System.out.println(String.copyValueOf(ch1));// 把字元陣列轉成字串

        int a = 100;
        System.out.println(String.valueOf(a));// 基本型別,把基本型別轉成字串

        String string = "java AND android";
        System.out.println(string.toUpperCase());// 把字串轉成大寫---JAVA AND ANDROID
        System.out.println(string.toLowerCase());// 把字串轉成小寫---java and android

        String s1 = "hello", s2 = "java";

        System.out.println(s1.concat(s2));// 字串拼接-----hellojava

    }

}
   copyValueOf(char[] chs)和 valueOf()的區別?                

--copyValueOf(char[] chs)只把字元陣列轉成string
-- valueOf()可以把任意型別轉成String
String的方法(替換功能)
    A--public String replace(char oldChar,char newChar)
    把字串中所有oldChar的字元替換為newChar
            B--public String replace(String oldChar,String newChar)     

String trim()該方法是,去除字串兩端的空格
package importMethod;

/*
 * A--public String replace(char oldChar,char newChar)
        把字串中所有oldChar的字元替換為newChar
   B--public String replace(String oldChar,String newChar)    
   c--public String replace(CharSequence target,CharSequence replacement) 

        target - 要被替換的 char 值序列
        replacement - char 值的替換序列 



   c---String trim()該方法是,去除字串兩端的空格

 */
public class string_tihuan
{
    public static void main(String[] args)
    {
        String olds="   java_an   droid   ";
        String news="hello";
        System.out.println(olds.replace(olds, news));//結果----hello
        System.out.println(olds.replace(news, olds));//結果---   java_an   droid 
        System.out.println(news.replace("l", "mm"));//結果----hemmmmo
        System.out.println(olds.trim());//結果為----java_an   droid只能去除兩端的空格
    }

}

4
StringBuffer/StringBuilder

(1)字串緩衝區類。
(2)String,StringBuffer/StringBuilder的區別?
    A:String的字串長度固定。而StringBuffer/StringBuilder的字串長度是可以改變的。
    B:StringBuffer是執行緒安全的,效率低。
      StringBuilder是執行緒不安全的,效率高。
(3)構造方法:
    A:StringBuffer sb = new StringBuffer();//沒有引數的構造方法,其初始容量為16
    B:StringBuffer sb = new StringBuffer(50);//帶引數的,初始容量為指定的值
    C:StringBuffer sb = new StringBuffer("hello");//初始容量為String.length()+16
(4)成員方法:
   public int capacity()//獲得理論值
   public int length()//獲得字串中的實際長度
    A:新增功能
    append

    StringBuffer操作後,如果返回的是StringBuffer型別,實質返回的是本身物件
    StringBuffer sb=new StringBuffer();
    StringBuffer s1=sb.append("hello");
    StringBuffer s2=sb.apped("world");
    s1==s2//true   返回的是true,說明s1和s2同一個物件
    所以,可以改為,sb.append("hello").append("world");鏈式操作

    public StringBuffer insert(int offset,char c)
        在指定位置上插入字元,以前位置上的字元先後移動

    B:刪除功能
        public StringBuffer delete(int start,int end)
                     刪除從start到end的字元
        public StringBuffer deleteCharAt(int index)
        刪除指定位置的字元
    C:替換功能
        public StringBuffer replace(int start,int end,String str)
                    把從[start,end)包左不包右的字元全部替換為str    

    D:擷取功能
        public String substring(int start)
        public CharSequence subSequence(int start,int end)包左不包右

    E:反轉功能
        public StringBuffer reverse()//"你愛我"----->“我愛你”
package importMethod;

/*
 *       public int capacity()//獲得理論值
 public int length()//獲得字串中的實際長度
 A:新增功能
 append

 StringBuffer操作後,如果返回的是StringBuffer型別,實質返回的是本身物件
 StringBuffer sb=new StringBuffer();
 StringBuffer s1=sb.append("hello");
 StringBuffer s2=sb.apped("world");
 s1==s2//true   返回的是true,說明s1和s2同一個物件
 所以,可以改為,sb.append("hello").append("world");鏈式操作

 public StringBuffer insert(int offset,char c)
 在指定位置上插入字元,以前位置上的字元先後移動

 B:刪除功能
 public StringBuffer delete(int start,int end)
 刪除從start到end的字元(包左不包右)
 public StringBuffer deleteCharAt(int index)
 刪除指定位置的字元
 C:替換功能
 public StringBuffer replace(int start,int end,String str)
 把從[start,end)包左不包右的字元全部替換為str    

 D:擷取功能
 public String substring(int start)
 public CharSequence subSequence(int start,int end)包左不包右

 E:反轉功能
 public StringBuffer reverse()//"你愛我"----->“我愛你”
 */

public class stringBufferDemo
{
    public static void main(String[] args)
    {
        StringBuffer sb = new StringBuffer("android_i am coming!");

        System.out.println("字串的實際長度為:" + sb.length() + " |加上16就是總容量: " + sb.capacity());
        // 結果為:字串的實際長度為:20 |加上16就是總容量: 36

        StringBuffer sb1 = new StringBuffer();// 新增功能
        sb1.append("android").append(" ").append("hello");
        System.out.println(sb1);// 結果為:android hello

        // 在指定位置上插入字元,以前位置上的字元先後移動
        System.out.println(sb1.insert(2, 'M'));// 結果為:anMdroid hello

        // 刪除指定位置的字元
        System.out.println(sb1.deleteCharAt(0));// 結果為:nMdroid hello
        // 在指定位置上插入字元,以前位置上的字元先後移動
        System.out.println(sb1.delete(0, 2));// 結果為:droid hello--注意:(包左不包右)

        // 替換功能
        System.out.println(sb1.replace(0, 2, "MH"));// 結果為:MHoid
                                                    // hello--注意:(包左不包右)

        // 擷取功能
        System.out.println(sb1.substring(4));// 結果為:d hello
        System.out.println("沒有擷取之前sb1為:" + sb1 + "擷取之後為:" + sb1.substring(0, 4));// 結果為:MHoi

        // 反轉功能
        System.out.println("沒有翻轉之前sb1為:" + sb1 + "翻轉之後為:" + sb1.reverse());
        // 結果為:沒有翻轉之前sb1為:MHoid hello翻轉之後為:olleh dioHM
    }

}
   String和StringBuffer的相互轉化:
String------->StringBuffer
         String s="hello";
            方式一: StringBuffer的構造方法
             StringBuffer sb=new StringBuffer(s);
            方式二: StringBuffer的append()方法
            StringBuffer sb=new StringBuffer();
                sd.append(s);//public StringBuffer append(String str)

StringBuffer------->string
              StringBuffer sb=new StringBuffer(“hehe”);
                方式一:String的構造方法
                String s=new String(sb);
               方式二:StringBuffer的toString()方法
               String s=sb.toString();////public String toString()