java学习五:字符串

本文详细介绍了Java中String、StringBuffer和StringBuilder类的特性、创建方式、操作方法比较,以及在多线程环境下的适用场景。重点讲解了字符串常量的不可变性、对象创建原理和高效操作技巧。
摘要由CSDN通过智能技术生成

一:Java中字符串可以分为两大类:

         String类
         StringBuffer和StringBuilder类

二:String类

         String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。

        2.1 String类声明与创建

                 字符串声明:String stringName;
                 字符串创建:stringName = new String(字符串常量);或stringName = 字符串常量;

        2.2 注意

                1.String str1='abc',这种形式创建的字符串,是在常量池(内存)中写入了'abc'这个数据, str1这是一个引用指向'abc'这个地址,str1这个引用存在栈中,栈中str放的是常量池中'abc'的地址。当再有String str2 ='abc'时,这是str2也是一个引用,指向常量池中的'abc'的值。
                2.String str3 = New String('abc')是在堆中创建一个对象,对象的地址指向常量池中的'abc'的值,str3是指向堆中对象的地址。
                3.String类对象保存的是不可修改(immutable)的Unicode字符序列
                    因此String类的一些操作方法是创建并返回一个新的String对象实例:
                    concat,replace,replaceAll,substring,toLowerCase,toUpperCase,trim,toString
                    查找:endsWith,startsWith,indexOf,lastIndexOf
                    比较:equals。equalsIgnoreCase
                    字符及长度:charAt,length
                4.字符串和各种数据类型之间的转换。

三:StringBuffer和StringBuilder类 

        StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。 

        StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。

 四:共同和区别

   4.1相同    

         1.三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。

        2.StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。

   4.2主要的区别:

         1.运行速度,或者说是执行速度:
            在这方面运行速度快慢为:StringBuilder > StringBuffer > String。
            String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的
            Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
            而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

        2.线程安全:
           在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。
      如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
    (一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞)。

 上述三类一些常用方法的例子

public class TypeStringTest01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
//		1,public String(),无参构造方法,用来创建空字符串的String对象。
		String string1 = new String();  // 则有string1==null
		System.out.print(string1);    //什么也不输出
		
//		2.public String(String value),用已知的字符串value创建一个String对象。
		String string2 = new String("Helllo,world!");    // 则string2 = "Hello,world!"
		String string3 = new String(string2);      // 则string3 = "Hello,world!"
		
//		3.public String(char[] value),用字符数组value创建一个String对象。
		char ch[]= {'a','b','c','d'};
		String string4 = new String(ch);
		System.out.println(string4.length());
		
//		4.public String(char chars[], int startIndex, int numChars),
//		用字符数组chars的startIndex(开始位置的下标)开始的numChars(字符个数)个字符创建一个String对象。
		char[] chars = {'a','b','c','d'};
		String string5 = new String(chars,1,2);
		System.out.println("新字符串长度是:"+string5.length()+",字符是:"+string5);
		
//		5.String str = "xxxx";直接用字符串赋值,这种构造的是引用,不是对象。
		String str1 = "anAdEfgnsghk";
		
//		6.获取字符串的长度 stringName.length() 获取字符串的长度,返回int型;
		int length =str1.length();
		System.out.println(length);
		
//		7.获取指定索引位置的字符  stringName.charAt(int index) 
		char c1 =str1.charAt(0);   // a
		char c2 =str1.charAt(1);   // n
		System.out.println(c1);
		System.out.println(c2);
		
//		8.字符串查找
//返回指定 字符或字符串 在此字符串中第一次出现处的索引,如果有返回索引值,否则返回-1
//stringName.indexOf(String str);  返回指定字符串在此字符串中第一次出现的索引.
//stringName.indexOf(int ch);    返回此字符串中第一个出现ascii的值 或者第一次出现字符ch 的字符索引。
//public int indexOf(int ch, int fromIndex)   返回指定字符在此字符串中从指定位置后第一次出现处的索引。
//public int indexOf(String str, int fromIndex)   返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
//注意,int ch,ch可以是一个字符,也可以是一个ascii的值.		
		int location1 = str1.indexOf('d');  //3
		int location2 = str1.indexOf('m');
		int location3 = str1.indexOf("Ef");   
		int location4 = str1.indexOf("Em");  //-1
		int location5 = str1.indexOf(103);    //103对应g的ascii的值。
		int location6 = str1.indexOf('g', 7);
		int location7 = str1.indexOf("Ef", 7);
		System.out.println("location1:"+location1);
		System.out.println("location2:"+location2);
		System.out.println("location3:"+location3);
		System.out.println("location4:"+location4);
		System.out.println("location5:"+location5);         // g的位置。
		System.out.println("location6:"+location6);
		
//		9.从指定位置开始截取字符串,默认到末尾,也可以截止到某个位置。
		String string6 =str1.substring(2);
		String string7 =str1.substring(2, 5);
		System.out.println("string6:"+string6);
		System.out.println("string7:"+string7);
		
//      10.连接两个字符串。
//		public String concat(String str),+ 这两个都起相同作用
		String name = new String("hejunran");   
		String str2 = str1.concat(name);      // 把字符串"hejunran"加在str1之后
		System.out.println("str2:" + str2);
		System.out.println("str1:" + str1);  // 可以看出来str1没有改变,concat是产生了一个新对象。
		
		
//		11。替换字符串
//public String replace(char oldChar, char newChar)
//用字符newChar替换当前字符串中 所有 的oldChar字符,并返回一个新的字符串。		
//public String replaceAll(String regex, String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。		
//public String replaceFirst(String regex, String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。	
		
		String str3 = str2.replace("Ef", "ss");   // 用字符串"ss"替换str2中字符串"Ef"
		String str4 = str2.replace('n', 's');
		String str5 = str2.replaceAll("g", "v");  // 用字符串"v"替换str2中所有字符串"g"
		String str6 = str2.replaceFirst("g", "v");
		System.out.println("str2:" + str2);
		System.out.println("str3:" + str3);
		System.out.println("str4:" + str4);
		System.out.println("str5:" + str5);
		System.out.println("str6:" + str6);
		
//		12.字符串中字符的大小写转换
//		public String toLowerCase() //返回将当前字符串中所有字符转换成小写后的新串
//		public String toUpperCase() //返回将当前字符串中所有字符转换成大写后的新串
		String str7 = str2.toLowerCase();
		String str8 = str2.toUpperCase();
		System.out.println("str7:" + str7);
		System.out.println("str8:" + str8);
		
//		13.字符串比较
//public int compareTo(String anotherString)
//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。
//若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
//public int compareToIgnore(String anotherString)
//与compareTo方法相似,但忽略大小写。
//public boolean equals(Object anotherObject)
//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
//public boolean equalsIgnoreCase(String anotherString)
//与equals方法相似,但忽略大小写。
		int temp_compare1 = str2.compareTo(str8);
		System.out.println("temp_compare1:"+temp_compare1);
		int temp_compare2 = str2.compareTo("anAdEfgnsghkhejunran");
		System.out.println("temp_compare2:"+temp_compare2);
		int temp_compare3 = str2.compareTo(str7);
		System.out.println("temp_compare3:"+temp_compare3);
		
		int temp_compare4 = str2.compareToIgnoreCase("anAdEfgnsghkHEJUNRAN");
		System.out.println("temp_compare4:"+temp_compare4);
		boolean bool1 = str2.equals(str8);
		System.out.println("bool1:"+bool1);
		boolean bool2 = str2.equals(str2);
		System.out.println("bool2:"+bool2);

//		14.字符串与基本数据类型的转换
//		字符串转为基本数据类型
//		java.lang包中有Byte、Short、Integer、Float、Double类的调用方法:
//		1)public static byte parseByte(String s)
//		2)public static short parseShort(String s)
//		3)public static short parseInt(String s)
//		4)public static long parseLong(String s)
//		5)public static float parseFloat(String s)
//		6)public static double parseDouble(String s)	
		byte b1 = Byte.parseByte("12");
		System.out.println("b1:"+b1);
		int n1 = Integer.parseInt("289");
		System.out.println("n1:"+n1);
		float f1 = Float.parseFloat("3.14");
		System.out.println("f1:"+f1);
		double d1 = Double.parseDouble("3.1415926782");
		System.out.println("d1:"+d1);
		short sh1 = Short.parseShort("24");
		System.out.println("sh1:"+sh1);
		
//		15.基本类型转换为字符串
//		String类中提供了String valueOf()放法,用作基本类型转换为字符串类型。
//		1)static String valueOf(char data[])
//		2)static String valueOf(char data[], int offset, int count)
//		3)static String valueOf(boolean b)
//		4)static String valueOf(char c)
//		5)static String valueOf(int i)
//		6)static String valueOf(long l)
//		7)static String valueOf(float f)
//		8)static String valueOf(double d)

		String s1 = String.valueOf('s');
		System.out.println("字符转换为字符串s1:"+s1);
		String s2 = String.valueOf(23);
		System.out.println("整型转换为字符串s2:"+s2);
		String s3 = String.valueOf(true);
		System.out.println("布尔类型转换为字符串s3:"+s3);
		String s4 = String.valueOf("hddd");
		System.out.println("字符串转换为字符串s4:"+s4);
		
		
//		StringBuilder字符串构造器,可以避免字符串连接造成的效率低的问题。
//		每次依次添加自己需要的字符串或者字符即可,然后再根据需要转换成String字符串。
        StringBuilder stringbuil1 = new StringBuilder();  //构建一个空白的字符串构造器
        stringbuil1.append("hejunran");  //append(String str)
        System.out.println("stringbuil1:"+stringbuil1);
        stringbuil1.append('c');        // append(char c)
        System.out.println("stringbuil1:"+stringbuil1);
        stringbuil1.append(true);      //  append(boolean b)
        System.out.println("stringbuil1:"+stringbuil1);
        stringbuil1.append(12);      //  append(int i)
        System.out.println("stringbuil1:"+stringbuil1);
        stringbuil1.append(1999L);      //  append(long lng)
        System.out.println("stringbuil1:"+stringbuil1);
        stringbuil1.append(3.14f);      //  append(float f)
        System.out.println("stringbuil1:"+stringbuil1);
        stringbuil1.append(6.14);      //  append(double d)
        System.out.println("stringbuil1:"+stringbuil1);
        char chs[] = {'l','o','v','e'};
        stringbuil1.append(chs);      //append(char[] str)
        System.out.println("stringbuil1:"+stringbuil1);
        short sh = 4;
        stringbuil1.append(sh);      // append(int i)
        System.out.println("stringbuil1:"+stringbuil1);       // stringbuil1:hejunranctrue1219993.146.14love4
	
        //int length ( ) 返回构建器或缓冲器中的代码单元(字符的数量)数量
        System.out.println(stringbuil1.length());   // 32
        
        //String toString ( ) 返回一个与构建器或缓冲器内容相同的字符串
        String str9 = stringbuil1.toString();   // hejunranctrue1219993.146.14love4
        System.out.println(str9);
        
        //  StringBuilder insert ( int offset , Char c )在 offset 位置插入一个代码单元并返回 this
        // insert() 方法可以插入很多类型数据。
        stringbuil1.insert(2, 'L');    // insert(int offset, char c)
        System.out.println("stringbuil1:"+stringbuil1);   //heLjunranctrue1219993.146.14love4
        stringbuil1.insert(0, false);
        System.out.println("stringbuil1:"+stringbuil1);  // falseheLjunranctrue1219993.146.14love4
        
//   appendCodePoint(int codePoint) 增加一个代码点(ascii值),并将其转换成一个或两个代码单元,并返回this
        stringbuil1.appendCodePoint(67);   
        System.out.println("stringbuil1:"+stringbuil1);
        
        //delete(int start, int end)删除构造器中从start位置到end位置的代码单元。
        stringbuil1.delete(5, 6);
        System.out.println("stringbuil1:"+stringbuil1);   // falseeLjunranctrue1219993.146.14love4C
		
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值