天天看点

String

<b>String</b><b>的比较问题:</b>

       · String是一个系统提供好的类,但是String可以像基本数据类型那样,直接赋值

       · String还可以通过new关键字赋值

public class OODemo12{

         public static void main(String args[]){

                   String str1 = "abc" ;

                   String str2 = new String("abc") ;

                   String str3 = str2 ;

         }

};

那么该如何去比较两个字符串是否相等呢?

· 按照“==”的方式进行比较

                   System.out.println(str1==str2) ;    // false

                   System.out.println(str1==str3) ;    // false

                   System.out.println(str3==str2) ;    // true

       比较之后发现,虽然str1和str2的内容是一样,但是通过==比较之后,结果均为“false”,而str2和str3的比较结果均为“true”。

       如果使用了“==”,则最终的比较结果是比较的两个地址。

· 最终应该比较的是两个字符串的内容,所以此时,就必须使用String类中提供好的一个方法:

       public boolean equals(String str)

public class OODemo13{

                   System.out.println(str1.equals(str2)) ;    // true

                   System.out.println(str1.equals(str3)) ;    // true

                   System.out.println(str3.equals(str2)) ;    // true

使用equals方法比较的是两个字符串的内容。

<b>注意点1</b><b>:</b>

       实际上一个字符串就是String类的匿名对象。

       每一个字符串都会在堆内存中开辟空间。

              String str1 = "abc" ;

       · 首先要在堆内存中开辟一个空间,此空间存放的是“abc”的字符串,之后把此字符串的地址使用给了str1:System.out.println("abc".equals(str2)) ;

<b>注意点2</b><b>:</b>

       String有两种实例化方式

       · 直接赋值

       · 使用new关键字开辟

       以上两种方式使用那种更好呢?

       · 直接赋值:它本身只会产生一个实例化对象

public class OODemo14{

       · 使用new关键字开辟,会产生两个实例化对象

                   String str1 = new String("abc") ;

使用直接赋值的方式比较节约空间,所以绝对不要使用new关键字实例化对象。

<b>注意点3</b><b>:</b>

       · String中的内容一旦声明则不可改变

       String的内容是固定的,如果要改变其内容,修改的是其内存的指向。

                   str1 += "bcd" ;

                   System.out.println(str1) ;

<b>注意点4</b><b>:</b>

       对于一个字符串而言,在JAVA中属于共享设计模式的应用,即:如果一个字符串已经被另外一个字符串所引用,则以后如果声明的字符串内容相同,则不会再重新声明。

public class OODemo15{

                   String str2 = "abc" ;

                   System.out.println(str1==str2) ;

<b>注意点5</b><b>:</b>

       以下的程序代码绝对不要出现,出现之后会影响系统的性能。

public class OODemo28{

                   String str1 = "a" ;

                   for(int i=0;i&lt;100;i++){

                            str1 += i ;

                   }

       如果按以上的形式编写代码,则String的内存指向(断开和重新连接)需要进行100次,性能肯定低。所以此种语句在开发中绝对不允许出现。

实际上String类还存在着大量的系统提供好的方法

1、  取得字符串长度的方法

       public int length()   à 取出字符串的长度

public class OODemo16{

                   String str1 = "abcfdafdsadafsdfdssdfa" ;

                   System.out.println(str1.length()) ;

2、  将字符串变为一个字符数组

public class OODemo17{

                   char c[] = str1.toCharArray() ;

                   for(int i=0;i&lt;c.length;i++){

                            System.out.print(c[i]+"\t") ;

3、  将一个字符数组变为字符串

       public <b>String</b>(char[] value)

public class OODemo18{

                   char c[] = {'a','b','c','d','e'} ;

                   System.out.print(new String(c)) ;

4、  判断在一个字符串中是否包含一个一个指定的字符串

       public int indexOf(String str) ;如果查到了则返回位置,否则返回-1。

public class OODemo19{

                   String str = "ABCDEFG" ;

                   System.out.println(str.indexOf("ABC")) ;

                   if(str.indexOf("ABC")!=-1){

                            System.out.println("查到了指定内容。") ;

                   }else{

                            System.out.println("没有查到指定内容。") ;

5、  按照位置截取一定长度的字符串

       public String substring(int beging,int end)

public class OODemo20{

                   System.out.println(str.substring(0,3)) ;

6、  如以下的字符串:“A:B:C”,按照“:”进行字符串拆分

       public String[] split(String str) ;

public class OODemo21{

                   String str = "A:B:C" ;

                   String s[] = str.split(":") ;

                   for(int i=0;i&lt;s.length;i++){

                            System.out.println(s[i]) ;

7、  将“Hello World!!!”字符串中的“o”替换成“x”

       public String replace(String str)

public class OODemo22{

                   String str = "hello world!!!" ;

                   System.out.println(str.replace("o","x")) ;

8、  判断一个字符串是否是以“**”开头或结尾。

       以指定的字符串开头:public boolean startsWith(String str)

       以指定的字符串结尾:public boolean endsWith(String str)

public class OODemo23{

                   String str = "**hello**" ;

                   System.out.println(str.startsWith("**")) ;

                   System.out.println(str.endsWith("**")) ;

9、  给定以下字符串:“MIKE:70|JONES:80|TOM:75”

       要求拆分成以下格式:

              · MIKE       à    70

              · JONES     à    80

              · TOM        à   75

public class OODemo24{

                   String str = "MIKE:70|JONES:80|TOM:75" ;

                   System.out.println("\"\'\\") ;

                   // 拆分两次

                   String s1[] = str.split("\\|") ;

                   for(int i=0;i&lt;s1.length;i++){

                            String s2[] = s1[i].split(":") ;

                            System.out.println(s2[0]+" --&gt; "+s2[1]) ;

10、取出字符串“Hello world”中的第三个字符

       public char charAt(int ind) ;

public class OODemo25{

                   String str = "helwo" ;

                   System.out.println(str.charAt(2)) ;

11、一个指定的字符数组,将其中指定位置的字符变为字符串

public <b>String</b>(char[] value, int offset, int count)

public class OODemo26{

                   char c[] = {'h','e','l','w','o'} ;

                   System.out.println(new String(c,1,3)) ;

12、如何可以进行不区分大小写的比较?

       public boolean equalsIgnoreCase(String str)

public class OODemo27{

                   String str2 = "ABC" ;

                   System.out.println(str1.equalsIgnoreCase(str2)) ;

<b>继续探讨对象的引用传递</b>

       现在观察以下三道题目,分析其内存空间的指向,并说出结果。

class Demo{

         int x ;

public class Demo29{

                   Demo d1 = new Demo() ;

                   d1.x = 30 ;

                   fun(d1) ;

                   System.out.println(d1.x) ;

         public static void fun(Demo d2){

                   d2.x = 50 ;

public class Demo30{

                   String str = "abc" ;

                   fun(str) ;

                   System.out.println(str) ;

         public static void fun(String s){

                   s = "bcd" ;

         String name ;

public class Demo31{

                   Demo d = new Demo() ;

                   d.name = "abc" ;

                   fun(d) ;

                   System.out.println(d.name) ;

         public static void fun(Demo x){

                   x.name = "bcd" ;

本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/91235,如需转载请自行联系原作者