一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 淺談Java編程中string的理解與運用

淺談Java編程中string的理解與運用

2021-01-30 11:31山巔一寺一壺酒 Java教程

這篇文章主要介紹了淺談Java編程中string的理解與運用,還是比較不錯的,這里分享給大家,供需要的朋友參考。

一,“==”與equals()

運行以下代碼,如何解釋其輸出結(jié)果?

?
1
2
3
4
5
6
7
8
9
10
11
public class StringPool {
  public static void main(String args[])
  {
    String s0=string">"Hello";
    String s1="Hello";
    String s2="He"+"llo";
    System.out.println(s0==s1);//true
    System.out.println(s0==s2);//true
    System.out.println(new String("Hello")==new String("Hello"));//false
  }
}

首先s0==s1

Java執(zhí)行時會維護一個String堆,對于一些可以共享的字符串對象,會先在堆中查找是否存在相同的String內(nèi)容(字符相同),如果有就直接返回,不創(chuàng)建新對象。

 s0中的值是引用的s1的值,自己并沒有創(chuàng)建對象,所以比較后的結(jié)果是true。

同理,s2中的值也是引用S1的值,所以比較的結(jié)果也是true

new String("Hello")==new String("Hello")

同時在堆中new了兩個對象,這兩個對象的內(nèi)容都是Hello,

但就好比a籃子和b籃子都裝了一個蘋果,a籃子裝了蘋果后和b籃子裝了蘋果后能判相等嗎?

當然不行,假設(shè)蘋果都是一樣的,那蘋果當然能和蘋果相等,但是籃子卻是不一樣的

在Java中,內(nèi)容相同的字串常量(“Hello”)只保存一份以節(jié)約內(nèi)存,所以s0,s1,s2實際上引用的是同一個對象。

編譯器在編譯s2一句時,會去掉“+”號,直接把兩個字串連接起來得一個字串(“Hello”)。這種優(yōu)化工作由Java編譯器自動完成。

當直接使用new關(guān)鍵字創(chuàng)建字符串對象時,雖然值一致(都是“Hello”),但仍然是兩個獨立的對象。

Java中“==”的使用

1基本數(shù)據(jù)類型:比較的是內(nèi)容;
2引用數(shù)據(jù)類型:比較的是對象地址;

再看以下代碼

?
1
2
3
4
5
6
7
8
9
10
public static void main(String args[])
 {
   String s1="a";
   String s2=s1;
   System.out.println(s1==s2);//true
   s1+="b";
   System.out.println(s1==s2);//false
   System.out.println(s1=="ab");//false
   System.out.println(s1.equals("ab"));//true
 }

分析:

給字串變量賦值意味著:兩個變量(s1,s2)現(xiàn)在引用同一個字符串對象“a”!

String對象的內(nèi)容是只讀的,使用“+”修改s1變量的值,實際上是得到了一個新的字符串對象,其內(nèi)容為“ab”,它與原先s1

所引用的對象”a”無關(guān),所以,s1==s2返回false;

代碼中的“ab”字符串是一個常量,它所引用的字符串與s1所引用的“ab”對象無關(guān)。

String.equals()方法可以比較兩個字符串的內(nèi)容。

二,String,equals()方法

java中的String.equals()方法的實現(xiàn)代碼:

equals()法是根類Object中的方法。源代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public boolean equals(Object obj)
{
  return (this == obj);
}
//可見默認的equals方法,直接調(diào)用==,比較對象地址。
//
//不同的子類,可以重寫此方法,進行兩個對象的equals的判斷。
//String類源碼中重寫的equals()方法的實現(xiàn)代碼如下:
public boolean equals(Object anObject)
{
  if(this==anObject) return true;
  if(anObject instanceof String)
  {
    String anotherString=(String)anObject;
    int n=value.length;
    if(n==anotherString.value.length)
        //若兩個字符串長度一樣,則一個個進行字符比較
    {
      char v1[]=value;//字符串轉(zhuǎn)化成的對應(yīng)數(shù)組
      char v2[]=anotherString.value;
          //字符串轉(zhuǎn)化成的對應(yīng)數(shù)組
      int i=0;
      while(n--!=0)
      {
        if(v1[i]!=v2[i]) return false;
      //若比較過程中出現(xiàn)不等,則倆字符串不等,返回false
        i++;
      }
      return true;
          //直至比較完兩個字符串長度,跳出while循環(huán)
         //  此時說明倆字符串相等,返回true
    }
  }
  return false;
//兩個字符串長度不一樣,倆字符串不等,
//不必一個個比較內(nèi)容,直接返回false
}

注:instanceof是Java、php的一個二元操作符(運算符),和==,>,<是同一類東西。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回boolean類型的數(shù)據(jù)。可以用來判斷繼承中的子類的實例是否為父類的實現(xiàn)。

從上面的代碼可以得知:

(1) String類中的equals首先比較地址,如果是同一個對象的引用,可知對象相等,返回true。
(2)如果不是同有一個對象,equals方法則繼續(xù)挨個比較兩個字符串對象內(nèi)的字符,只有完全相等才返回true,否則返回false。

三,整理String類的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()toCharArray()

使用說明

Length():獲取字串長度
charAt():獲取指定位置的字符
getChars():獲取從指定位置起的子串復(fù)制到字符數(shù)組中
replace():子串替換
toUpperCase()、 toLowerCase():大小寫轉(zhuǎn)換
trim():去除頭尾空格
toCharArray():將字符串對象轉(zhuǎn)換為字符數(shù)組

四,String類的方法可以連續(xù)調(diào)用:

?
1
2
String str="abc";
String result=str.trim().toUpperCase().concat("defg");

請閱讀JDK中String類上述方法的源碼,模仿其編程方式,編寫一個MyCounter類,它的方法也支持上述的“級聯(lián)”調(diào)用特性,其調(diào)用示例為:

MyCounter counter1=new MyCounter(1);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyCounter {
  int i;
  MyCounter(int n){
    i=n;
  }
  public MyCounter increase(int n) {
    this.i=this.i+n;
    return this;
  }
  public MyCounter decrease(int n) {
    this.i=this.i-n;
    return this;
  }
  public static void main(String[] args) {
    MyCounter counter1=new MyCounter(1);
    MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
    System.out.println("counter2.i="+counter2.i);
  }
}

總結(jié)

以上就是本文關(guān)于淺談Java編程中string的理解與運用的全部內(nèi)容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://www.cnblogs.com/sdysyhj/p/7744407.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 4399h漫画 | 天堂资源在线www中文 | 99热在线获取最新地址 | 短篇同学新婚h系列小说 | 韩剧消失的眼角膜免费完整版 | 韩国男女做性全过程视频 | 冰漪丰满大乳人体图片欣赏 | julia ann黑人巨大 | 色综合欧美色综合七久久 | 无人区大片免费播放器 | 四虎最新永久免费网址 | 亚洲精品第一国产综合高清 | 成人性生交小说免费看 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 国产成人福利美女观看视频 | 天美传媒在线视频 | 成人在线一区二区 | 亚洲AV无码专区国产精品麻豆 | 狠狠躁夜夜躁人人爽天天miya | 青柠网在线观看视频 | 爱情岛论坛亚洲品质自拍视频 | 色色色色色色网 | 精品亚洲麻豆1区2区3区 | 亚洲精品短视频 | 五月天网站 | 亚洲国产欧美日韩在线一区 | 欧美se图| 国产精品成人在线播放 | 欧美日韩亚洲综合久久久 | yy111111影院理论大片 | 国产成人一区二区三区影院免费 | 男生操女生动态图 | 国产理论片在线观看 | 无限在线看免费视频大全 | 国产精品久久久久久久午夜片 | 精品视频免费在线 | 果冻传媒在线播放观看228集 | 亚洲国产精品自在自线观看 | japanese乱子mate| 黑人巨大vs北条麻妃在线 | 91噜噜噜在线观看 |