黑馬程式設計師——java-幾個常用的類(Object,Scanner,String,StringBuffer/StringBuilder)
阿新 • • 發佈:2019-01-06
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()