• 第七课:String类 M


    1、String的两种实例化方法

      String本身是一个类,在String类中定义了如下的构造方法:

        public String (String original)

      可以接收一个String类的对象,并重新实例化String对象,除了此方法之外,String还可以采用直接赋值的方式进行对象的实例化。

    public class StringDemo01{
    	public static void main(String args[]){
    		String str1 = "hello" ;	//使用直接赋值的方式完成
    		String str2 = new String("WORLD") ;	//通过构造方法完成
    		System.out.println(str1 + str2) ;	//进行字符串的连接操作
    	}
    }
    

      此时,两个String类型的对象都实例化。

    2、String的比较方式

      现有如下一道程序,观察String的比较问题:

    public class StringDemo01{
    	public static void main(String args[]){
    		String str1 = "hello" ;	//使用直接赋值的方式完成
    		String str2 = new String("hello") ;	//通过构造方法完成
    		String str3 = str2 ;	//通过构造方法完成
    		System.out.println("str1 == str2 --> " + (str1 == str2)) ;	//false
    		System.out.println("str1 == str3 --> " + (str1 == str3)) ;	//false
    		System.out.println("str2 == str3 --> " + (str2 == str3)) ;	//true
    	}
    }
    

      从内存关系来分析结果:

      得到一个结果,实际上对于“==”,比较的是两个对象的地址是否相等,具体来讲实际上比较的是地址的值,因为地址是以数值的形式存在的。

      但是现在真正要比较的不是地址的值,而是两个字符串的内容,所以现在就需要使用String类中的equals()方法完成比较,此方法定义如下:

        public boolean equals(String str)

      比如:使用equals()修改程序

    public class StringDemo01{
    	public static void main(String args[]){
    		String str1 = "hello" ;	//使用直接赋值的方式完成
    		String str2 = new String("hello") ;	//通过构造方法完成
    		String str3 = str2 ;	//通过构造方法完成
    		System.out.println("str1 equals str2 --> " + str1.equals(str2)) ;	//true
    		System.out.println("str1 equals str3 --> " + str1.equals(str3)) ;	//true
    		System.out.println("str2 equals str3 --> " + str2.equals(str3)) ;	//true
    	}
    }
    

      此时,因为三个字符串的内容完全相等,所以此时equals用于比较字符串内容。

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

      一个字符串是使用“"”括起来的,那么一个字符串的常量实际上本身就属于String的一个匿名对象。

    public class StringDemo01{
    	public static void main(String args[]){
    		String str1 = "hello" ;	//使用直接赋值的方式完成
    		System.out.println("hello".equals(str1)) ;	//true
    	}
    }
    

      

    4、String的两种实例化方式的区别

      内存图形表示:

        String str1 = "hello" ;

        

        现在在堆内存空间中,只开辟了有一个空间,不会产生多余的内容。

      现在使用关键字new的方式:

        String str2 = new String("hello") ;

        可以发现,程序开辟了两个空间,与直接赋值相比,肯定使用直接赋值的方式方便,所以在开发中绝对不能使用关键字new调用String(String original)的构造方法。

        而且,如果使用直接赋值的方式也可以减少堆内存的开销。

    public class StringDemo01{
    	public static void main(String args[]){
    		String str1 = "hello" ;	//使用直接赋值的方式完成
    		String str2 = "hello" ;	//使用直接赋值的方式完成
    		String str3 = "hello" ;	//使用直接赋值的方式完成
    		System.out.println("str1 == str2 --> " + (str1 == str2)) ;	//true
    		System.out.println("str1 == str3 --> " + (str1 == str3)) ;	//true
    		System.out.println("str2 == str3 --> " + (str2 == str3)) ;	//true
    	}
    }
    

        实际上,以上的三个对象表示的都是同一个空间的引用,因为对于String来讲,使用直接赋值的方式,会在字符串池中保存内容。如果之后再声明字符串的时候发现内容相同,则不会重新开辟空间,而是从内存池中取出数据继续使用。

    5、字符串的内容一旦声明之后则无法修改

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello" ;	//使用直接赋值的方式完成
    		str += " world" ;
    		System.out.println(str) ;
    	}
    }
    

      虽然最终输出的结果改变了,但是字符串的内容没有改变:

      实际上来讲,字符串变量的改变是改变的内存空间地址的指向,而本身的字符串内容没有任何变化。所以,在开发中一下的操作代码绝对要避免:

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello" ;	//使用直接赋值的方式完成
    		for (int i = 0; i < 100; i++){
    			str += i ;
    		}
    		System.out.println(str) ;
    	}
    }
    

        以上的操作代码要不断的断开已有的连接,指向新连接100次,整体代码的性能及其低,所以遇到此类绝对不要使用。

    6、String的常用操作方法

      (1)、字符与字符串

        在各个语言中实际上个一个字符串就表示一组字符。所以在String类中提供了以下的方法操作字符与字符串间的转换关系:

          根据字符串中的索引找到指定位置的字符:public char charAt(int index)

          将字符串变为字符数组:public char[] toCharArray()

          将字符数组变为字符串:

            将全部的字符数组变为String类型:public String(char[] value)

            将部分的字符数组变为String类型:public String(char[] value, int offset, int count)

      例1:取出字符串中指定位置的字符

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello" ;
    		char c = str.charAt(1) ;
    		System.out.println(c) ;
    	}
    }
    

      

      例2:字符串 <--> 字符数组

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world!!!" ;
    		char c[] = str.toCharArray() ;	//将字符串变为字符数组
    		for (int i=0; i<c.length; i++){
    			System.out.print(c[i] + "、") ;
    		}
    		String str1 = new String(c) ;	//将全部的字符数组重新变为String
    		String str2 = new String(c, 0 ,5) ;	//将0~5的字符数组重新变为String
    		System.out.println() ;
    		System.out.println(str1) ;
    		System.out.println(str2) ;
    	}
    }
    

      

      (2)、字节与字符串

        与字符数组的操作一致,一个字符串也可以变为字节数组,一个字节数组也可以变为字符串:

          String --> 字节数组:public bytr[] getBytes()

          字节数组 --> String:

            全部转换:public String(byte[] bytes)

            部分转换:public String(byte[] bytes, int offset, int length)

      例:字节数组 --> String

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world!!!" ;
    		byte c[] = str.getBytes() ;	//将字符串变为byte数组
    		String str1 = new String(c) ;	//将全部的byte数组重新变为String
    		String str2 = new String(c, 0 ,5) ;	//将0~5的byte数组重新变为String
    		System.out.println(str1) ;
    		System.out.println(str2) ;
    	}
    }
    

      

      (3)、判断是否以指定的字符串开头或结尾

        判断是否以指定的字符串开头:public boolean sttsWith(String prefix)

        判断是否以指定的字符串结尾:public boolean endsWith(String suffix)

      例:验证操作

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "**hello world!!!##" ;
    		System.out.println(str.startsWith("**")) ;	//true
    		System.out.println(str.endsWith("##")) ;	//true
    	}
    }
    

      

      (4)、替换操作

        使用以下的方法可以完成替换的操作:

          public String replaceAll(String regex, String replacement)

      例:替换内容

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world" ;
    		String newStr = str.replaceAll("l", "x") ;	//将全部的l用x替换
    		System.out.println(newStr) ;
    	}
    }
    

      

      (5)、字符串截取

        使用以下两个方法可以完成字符串的截取操作:

          全部截取:public String substring(int beginIndex)

          部分截取:public String substring(int beginIndex, int endIndex)

      例:验证操作

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world" ;
    		String sub1 = str.substring(6) ;	//world
    		String sub2 = str.substring(0, 4) ;	//hello
    		System.out.println(sub1) ;
    		System.out.println(sub2) ;
    	}
    }
    

      

      (6)、字符串的拆分操作

        可以将字符串按照指定的内容进行拆分操作:

          public String[] split(string regex)

      例:拆分字符串

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world" ;
    		String s[] = str.split(" ") ;	//按照空格拆分
    		for (String st:s ){
    			System.out.println(st) ;
    		}
    	}
    }
    

      

      (7)、字符串查找

        如果需要在一个字符串中查找是否存在指定的内容,可以使用以下的两个方法:

          取得指定字符串的位置:public int indexOf(String str)

            此方法返回int型数据,如果查找到了则返回位置,查找不到,返回-1

          从指定位置开始查找:public int indexOf(String str, int fromIndex)

          直接查找:public boolean contains(String s)

      例1:查找操作

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world" ;
    		System.out.println(str.contains("hello")) ;	//true
    		System.out.println(str.contains("hl")) ;	//false
    	}
    }
    

      

      例2:查找位置

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world" ;
    		System.out.println(str.indexOf("hello")) ;
    		System.out.println(str.indexOf("hl")) ;
    		if (str.indexOf("hello") != -1){
    			System.out.println("查找到了所需要的内容") ;
    		}
    	}
    }
    

      

      例3:指定查找的开始位置

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "hello world" ;
    		System.out.println(str.indexOf("h" ,5)) ;	//true
    	}
    }
    

      

      (8)、字符串的其他操作

        去掉左右空格:public String trim()

        取得字符串长度:public int length()

        转大写:public String toUpperCase()

        转小写:public String toLowerCase()

      例:验证操作

    public class StringDemo01{
    	public static void main(String args[]){
    		String str = "   hello world   " ;
    		System.out.println(str.trim()) ;	//去掉空格
    		System.out.println(str.trim().toUpperCase()) ;	//转换为大写
    		System.out.println(str.trim().length()) ;	//求出去掉空格后的字符串的长的
    	}
    }
    

      

    【2012-01-03】

  • 相关阅读:
    修改服务器时间及时区
    风情万种awk
    追忆似水流年sed
    lvm笔记
    正则不怎么会用
    在CentOS7.5的虚拟环境下新建你的django项目
    Django学习过程中的排错总结
    我一直记不住的vim用法
    关于自建yum源拾遗
    Djangp2.x版本报错找不到模版目录下的文件
  • 原文地址:https://www.cnblogs.com/chuanstone/p/2311184.html
Copyright © 2020-2023  润新知