且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

String

更新时间:2022-10-03 16:29:09

String的比较问题:
       · String是一个系统提供好的类,但是String可以像基本数据类型那样,直接赋值
       · String还可以通过new关键字赋值
 
public class OODemo12{
         public static void main(String args[]){
                   String str1 = "abc" ;
                   String str2 = new String("abc") ;
                   String str3 = str2 ;
         }
};
 
那么该如何去比较两个字符串是否相等呢?
· 按照“==”的方式进行比较
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
         }
};
 
       比较之后发现,虽然str1str2的内容是一样,但是通过==比较之后,结果均为“false”,而str2str3的比较结果均为“true”。
       如果使用了“==”,则最终的比较结果是比较的两个地址。
· 最终应该比较的是两个字符串的内容,所以此时,就必须使用String类中提供好的一个方法:
       public boolean equals(String str)
public class OODemo13{
         public static void main(String args[]){
                   String str1 = "abc" ;
                   String str2 = new String("abc") ;
                   String str3 = str2 ;
                   System.out.println(str1.equals(str2)) ;    // true
                   System.out.println(str1.equals(str3)) ;    // true
                   System.out.println(str3.equals(str2)) ;    // true
         }
};
使用equals方法比较的是两个字符串的内容。
 
注意点1
       实际上一个字符串就是String类的匿名对象。
       每一个字符串都会在堆内存中开辟空间。
              String str1 = "abc" ;
       · 首先要在堆内存中开辟一个空间,此空间存放的是“abc”的字符串,之后把此字符串的地址使用给了str1System.out.println("abc".equals(str2)) ;
 
注意点2
       String有两种实例化方式
       · 直接赋值
       · 使用new关键字开辟
       以上两种方式使用那种更好呢?
       · 直接赋值:它本身只会产生一个实例化对象
public class OODemo14{
         public static void main(String args[]){
                   String str1 = "abc" ;
         }
};
       · 使用new关键字开辟,会产生两个实例化对象
public class OODemo14{
         public static void main(String args[]){
                   String str1 = new String("abc") ;
         }
};
使用直接赋值的方式比较节约空间,所以绝对不要使用new关键字实例化对象。
 
注意点3
       · String中的内容一旦声明则不可改变
       String的内容是固定的,如果要改变其内容,修改的是其内存的指向。
 
public class OODemo14{
         public static void main(String args[]){
                   String str1 = "abc" ;
                   str1 += "bcd" ;
                   System.out.println(str1) ;
         }
};
 
 
注意点4
       对于一个字符串而言,在JAVA中属于共享设计模式的应用,即:如果一个字符串已经被另外一个字符串所引用,则以后如果声明的字符串内容相同,则不会再重新声明。
public class OODemo15{
         public static void main(String args[]){
                   String str1 = "abc" ;
                   String str2 = "abc" ;
                   System.out.println(str1==str2) ;
         }
};
 
注意点5
       以下的程序代码绝对不要出现,出现之后会影响系统的性能。
public class OODemo28{
         public static void main(String args[]){
                   String str1 = "a" ;
                   for(int i=0;i<100;i++){
                            str1 += i ;
                   }
                   System.out.println(str1) ;
         }
};
       如果按以上的形式编写代码,则String的内存指向(断开和重新连接)需要进行100次,性能肯定低。所以此种语句在开发中绝对不允许出现。
实际上String类还存在着大量的系统提供好的方法
1  取得字符串长度的方法
       public int length()   à 取出字符串的长度
public class OODemo16{
         public static void main(String args[]){
                   String str1 = "abcfdafdsadafsdfdssdfa" ;
                   System.out.println(str1.length()) ;
         }
};
 
2  将字符串变为一个字符数组
public class OODemo17{
         public static void main(String args[]){
                   String str1 = "abcfdafdsadafsdfdssdfa" ;
                   char c[] = str1.toCharArray() ;
                   for(int i=0;i<c.length;i++){
                            System.out.print(c[i]+"\t") ;
                   }
         }
};
 
3  将一个字符数组变为字符串
       public String(char[] value)
public class OODemo18{
         public static void main(String args[]){
                   char c[] = {'a','b','c','d','e'} ;
                   System.out.print(new String(c)) ;
         }
};
 
4  判断在一个字符串中是否包含一个一个指定的字符串
       public int indexOf(String str) ;如果查到了则返回位置,否则返回-1
public class OODemo19{
         public static void main(String args[]){
                   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{
         public static void main(String args[]){
                   String str = "ABCDEFG" ;
                   System.out.println(str.substring(0,3)) ;
         }
};
 
6  如以下的字符串:“A:B:C”,按照“:”进行字符串拆分
       public String[] split(String str) ;
public class OODemo21{
         public static void main(String args[]){
                   String str = "A:B:C" ;
                   String s[] = str.split(":") ;
                   for(int i=0;i<s.length;i++){
                            System.out.println(s[i]) ;
                   }
         }
};
 
7  将“Hello World!!!”字符串中的“o”替换成“x
       public String replace(String str)
public class OODemo22{
         public static void main(String args[]){
                   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{
         public static void main(String args[]){
                   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{
         public static void main(String args[]){
                   String str = "MIKE:70|JONES:80|TOM:75" ;
                   System.out.println("\"\'\\") ;
                   // 拆分两次
                   String s1[] = str.split("\\|") ;
                   for(int i=0;i<s1.length;i++){
                            String s2[] = s1[i].split(":") ;
                            System.out.println(s2[0]+" --> "+s2[1]) ;
                   }
         }
};
 
10、取出字符串“Hello world”中的第三个字符
       public char charAt(int ind) ;
public class OODemo25{
         public static void main(String args[]){
                   String str = "helwo" ;
                   System.out.println(str.charAt(2)) ;
         }
};
 
11、一个指定的字符数组,将其中指定位置的字符变为字符串
public String(char[] value, int offset, int count)
public class OODemo26{
         public static void main(String args[]){
                   char c[] = {'h','e','l','w','o'} ;
                   System.out.println(new String(c,1,3)) ;
         }
};
 
12、如何可以进行不区分大小写的比较?
       public boolean equalsIgnoreCase(String str)
public class OODemo27{
         public static void main(String args[]){
                   String str1 = "abc" ;
                   String str2 = "ABC" ;
                   System.out.println(str1.equalsIgnoreCase(str2)) ;
         }
};
 
继续探讨对象的引用传递
       现在观察以下三道题目,分析其内存空间的指向,并说出结果。
class Demo{
         int x ;
};
public class Demo29{
         public static void main(String args[]){
                   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{
         public static void main(String args[]){
                   String str = "abc" ;
                   fun(str) ;
                   System.out.println(str) ;
         }
         public static void fun(String s){
                   s = "bcd" ;
         }
};
class Demo{
         String name ;
};
public class Demo31{
         public static void main(String args[]){
                   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,如需转载请自行联系原作者