欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

String StringBuffer StringBuilder

程序员文章站 2024-01-20 22:05:46
...
package day14;
/*
 * 字符串类:java将与字符串相关的功能面向对象了,形成的类就是字符串类,表示方法""
 * 分类:
 * 1不可变字符串--String:字符串本身不能发生改变,与引用无关。如果改变会创建一个新的String字符创
 * 2可变字符串--StringBuffer/StringBuider:字符串本身可以发生改变
 * 
 * 首先讲解不可变字符串
 * 字符串存储的位置:在常量区,在堆当中的一块特殊的区域
 * 字符串常量的特点:同一个内容的字符串常量在内存中只允许存储一份,目的:节省内存
 * 
 */
public class Demo5 {

	public static void main(String[] args) {
//		//不可变字符串,指:字符串
//		String s1="hello";
//		//可变字符串,指:字符串的长度可变。内存使用灵活度更高
//		StringBuffer s2=new StringBuffer("world");
//		System.out.println(s1+"   "+s2);
////		首先讲解不可变字符串
		
		String s1="1000phone";
		//"1000phone"被系统看做是对象处理,但是它又不是对象,所以把它放在堆中的一块特殊区域里
		//这块区域只处理字符串
		
		String s2="1000phone";
		String s3=new String("1000phone");
		String s4=new String("1000phone");
		System.out.println(s1==s2);//true
		System.out.println(s1==s3);//false
		System.out.println(s1==s4);//false
		System.out.println(s3==s4);//false
		//说明字符串重写了equals方法,重新制定了比较规则,规则编程:如果直接是字符串,就比较地址
		//如果有内容就比较内容中的地址
		System.out.println(s1.equals(s2));//true

	}

}
package day14;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Demo6 {

	public static void main(String[] args) throws UnsupportedEncodingException {
		
		//1.判断:
		//判断是否包含一个子字符串
		//boolean contains(String s) 
		String a1="abcde";
		System.out.println(a1.contains("abc"));//true
		
		//判断两个字符串的内容是否相同
		//boolean equals(Object anObject) 
		String a2="abcde";
		System.out.println(a1.equals(a2));//true
		
		//忽略大小写判断两个字符串的内容是否相同
		//boolean equalsIgnoreCase(String anotherString)
		String a3="ABcdE";
		System.out.println(a1.equalsIgnoreCase(a3));//true
		
		//判断是否以某字符串开头
		//boolean startsWith(String prefix)
		System.out.println(a1.startsWith("ab"));
		//判断是否以某字符串结尾
		//boolean endsWith(String suffix)
		System.out.println(a1.endsWith("bcde"));


		//2.转换:字符数组和字符串的转换
		//1:使用构造方法
		//String(char[] value)
		char[] c1=new char[] {'h','e','l','l','o'};
		String s1=new String(c1);
		System.out.println(s1);//hello
		//String(char[] value,开始位置,取多少个)
		String s2=new String(c1,1,2);
		System.out.println(s2);//el
		//将字符串转成字符数组
		//char[] toCharArray() 
		String s3= "123456";
		char[] c2=s3.toCharArray();
		System.out.println(c2);//123456为什么不是打印c2这个数组的地址???
		
		//使用静态方法
		//static String copyValueOf(char[] data) 
		//static String copyValueOf(char[] data, int offset, int count) 
		

		
		//2将字节数组转成字符串
		//String(byte[] bytes) 
		byte[] b1=new byte[] {97,98,99};
		String s4=new String(b1);//将每一个byte转化为一个char
		System.out.println(s4);//abc
		//String(byte[] bytes, 开始位置,长度)
		String s5=new String(b1,0,2);
		System.out.println(s5);//a,b
		
		//String(byte[] bytes, String charsetName)//使用指定的编码将字节数组转换成字符成
		//GBK一个汉字两个字节
		//utf-8一个汉字三个字节
		byte[] b2="你好".getBytes();//编码
		System.out.println(Arrays.toString(b2));
		String s6=new String(b2,"gbk");//解码: new String(s)会用该类的编码方式进行解码
		System.out.println(s6);
		
		//将字符串转成字节数组
		//byte[] getBytes() 
		
		//将基本数据类型转换成字符串
		//String.valueOf()
		String s7=String.valueOf(23);
		System.out.println(s7);


		//3.替换:
		//String replace(String 老的子串, String 新的子串) 
		String str1="abc1234abc";
		System.out.println(str1.replace("a","AA"));
		//子串:
		//String substring(int beginIndex)  //区间左闭右开
		//String substring(int beginIndex, int endIndex) //包含起始位置,不包含结束位置,到结束位置的前一位
		//转换,去除空格,比较:
		//大小写转换
		//String toLowerCase() 
		//String toUpperCase()
		
		//将字符串两端的空格去掉
		//注:只能去掉两边的空格
		//String trim()
		String str2="   hello world            ";
		System.out.println(str2.trim()+"skrr");
		
		
		//按字典顺序比较两个字符串
		//两个字符串从第一个开始比较,如果相等比较下一个,如果不相等,返回当前字符的ascii码的差值(s1的-s2的),结束比较
		//int compareTo(String anotherString)s1.compareTo(s1) s1>s2返回正数  s1==s2返回0 s1<s2返回负数
		String a="123";
		String b="123";
		System.out.println(a.compareTo(b));//0
		


		//4.切割: String[] split(String刀)
		//注意:作为刀的部分不会出现在内容里
		String str3="a b c d e ";
		String[] str4=str3.split(" ");
		for(String i:str4)
			System.out.println(i+"skr");
		
		String str5="a,b,c,d,";
		String[] str6=str5.split("");
		for(String j:str6)
			System.out.println(j);
	}

}
package day14;

public class Demo7 {

	//String,StringBuffer,StringBuilder的直接父类都是Object
	//他们三者之间没有继承关系
	//只是写了同名的方法
	/*
	 * 可变字符串和不可变字符串的区别:内存长度是否可变
	 * 可变字符串(也成为字符串的缓冲区):有StringBuffer和StringBuilder
	 * 区别:1出现的时间不一样StringBuffer(jdk1.0),StringBuilder(jdk1.5)
	 *     2StringBuffer是线程安全的,StringBuilder是线程不安全 的
	 *     
	 *     出现的问题:StringBuffer中的每个方法都有处理线程安全的代码,这会影响
	 *     程序的效率。所以在单线程(不用考虑线程安全问题)时使用StringBuilder,在考虑线程安全时使用StringBuffer)
	 *     
	 *     注:StringBuffer和StringBuilder的方法名字完全相同
	 *     
	 *     为什么进行jdk版本的更新?
	 *     1需要新增功能
	 *     2需要进行代码的优化
	 *     3需要更新现有的功能
	 *     4增加用户体验
	 *     
	 *     String类是被final修饰的
	 *     当一个类被final修饰了:1不能被继承2不能重写
	 *     
	 */
	
	public static void main(String[] args) {
		//创建StringBuffer对象
		//创建了一个空的可变字符串对象
		StringBuffer sf1=new StringBuffer();
		//StringBuffer stringbuffer="hello";报错,注意:"hello"默认为String类型的
		StringBuffer sf2=new StringBuffer("hello");

//StringBuffer:

    	//1.存储:
    	//StringBuffer append(boolean b)   从最后插入
		sf1.append("hello ");
		sf1.append("world");
		System.out.println(sf1);
		
        //StringBuffer insert(int 指定字符索引, 任何类型的数据)   从指定位置插入
		
        //2.删除:
        //StringBuffer delete(int start, int end) 左闭右开,删除一个区间内的字符串
		 sf1.delete(3,5);
		 System.out.println(sf1);
        //StringBuffer deleteCharAt(int index) 删除一个字符
		 sf1.deleteCharAt(0);
		 System.out.println(sf1);
        //3.修改:
        //StringBuffer replace(int start, int end, String str)  把[start,end)范围内的字符串替换成指定的子字符串
		 sf1.replace(0, 1, "hahaha");
		 System.out.println(sf1);
		//void setCharAt(int index, char ch) 修改一个字符

        //4.获取:
        //char charAt(int index)获取指定索引出的字符 
		 char c1=sf1.charAt(0);
		 System.out.println(c1);
    	//int indexOf(String str)//从左往右查
		 System.out.println(sf1.indexOf("l"));
    	//int indexOf(String str, int fromIndex)//从指定所引出开始从左往右查
		 System.out.println(sf1.indexOf("l",7));
    	//int lastIndexOf(String str) //从右往左查
		 System.out.println(sf1.lastIndexOf("l"));
        //返回指定子字符串(从右边开始计数)在此字符串第一次出现时的索引
        //int lastIndexOf(String str, int fromIndex)//从该所引出从右往左查找字符串 
		 System.out.println(sf1.lastIndexOf("l",7));
        //返回指定子字符串(从右边开始计数,范围:当前指定的位置-0)在此字符串第一次出现时的索引 
		 
        //int length() 
        //返回长度(字符数)。 

        //5.反转:
        //StringBuffer reverse()
		
	}

}