String StringBuffer StringBuilder

本文详细介绍了String、StringBuffer和StringBuilder的区别及应用场景,并通过实例演示了它们在Java中的使用方式。
package com.atguigu.java;

import org.junit.Test;

public class StringBufferBuilderTest {
	
	@Test
	public void test4(){
		String str = null;
		StringBuffer sb = new StringBuffer();
		sb.append(str);

		System.out.println(sb.length());//4

		System.out.println(sb);//"null"
		
		StringBuffer sb1 = new StringBuffer(str);//报异常
		System.out.println(sb1);
		
	}
	
	/*
	 *  StringBuffer append(String s),   StringBuffer append(int n) ,  
		StringBuffer append(Object o) ,  StringBuffer append(char n),
		StringBuffer append(long n),  StringBuffer append(boolean n),
		StringBuffer insert(int index, String str) 
		public StringBuffer reverse() :反转
		StringBuffer delete(int startIndex, int endIndex) 
		public char charAt(int n )
		public void setCharAt(int n ,char ch)
		StringBuffer replace( int startIndex ,int endIndex, String str) 
		public int indexOf(String str)
		public String substring(int start,int end)
		public int length()
		
		总结:
			增加:append()
			删除:delete(int startIndex, int endIndex)
			修改:setCharAt(int n ,char ch) / replace( int startIndex ,int endIndex, String str) 
			查询:charAt(int n )
			插入:insert(int index, String str)
			长度:length();
		
	 */
	@Test
	public void test3(){
		StringBuffer sb1 = new StringBuffer("abc");//new char[19]
		sb1.append("123").append("hello");//方法链的调用
		System.out.println(sb1.length());
		System.out.println(sb1);
		StringBuffer sb2 = sb1.delete(1, 3);
		System.out.println(sb1);
		System.out.println(sb2);
	}
	
	/*
	 * 测试String/StringBuffer/StringBuilder三者的效率。
	 * 操作数据的效率从高到低:StringBuilder > StringBuffer > String
	 */
	@Test
	public void test2(){
		String text = "";
		StringBuffer buffer = new StringBuffer("");
		StringBuilder builder = new StringBuilder("");
		
		long startTime = 0L;
		long endTime = 0L;
		
		
		startTime = System.currentTimeMillis();
		
		for(int i = 0;i<20000;i++){
			buffer.append(String.valueOf(i));
		}
		endTime = System.currentTimeMillis();
		
		System.out.println("StringBuffer的执行时间:"+(endTime-startTime));
		
		
		startTime = System.currentTimeMillis();
		for(int i = 0;i<20000;i++){
			builder.append(String.valueOf(i));
		}
		endTime = System.currentTimeMillis();
		System.out.println("StringBuilder的执行时间:"+(endTime-startTime));
		
		
		startTime = System.currentTimeMillis();
		for(int i = 0;i<20000;i++){
			text = text + i;
		}
		endTime = System.currentTimeMillis();
		System.out.println("String的执行时间:"+(endTime-startTime));

	}
	
	/*
	 * 面试题:
	 * String:不可变的字符序列;使用char[]存储
	 * StringBuffer:可变的字符序列;线程安全的,效率低;使用char[]存储
	 * StringBuilder:可变的字符序列;线程不安全的,效率高;(jdk 5.0)使用char[]存储
	 * 
	 * 
	 * 
	 * new ArrayList();//new Object[10];
	 * new StringBuffer();//new char[16];// abfedc
	 * 
	 * 建议:new StringBuffer(int size);//new char[size];
	 * 
	 */
	@Test
	public void test1(){
		
	}
}


     面试题:
      String:不可变的字符序列;使用char[]存储
      StringBuffer:可变的字符序列;线程安全的,效率低;使用char[]存储
      StringBuilder:可变的字符序列;线程不安全的,效率高;(jdk 5.0)使用char[]存储

package com.atguigu.java;

import org.junit.Test;

public class StringTest {
	
	/*
	 * String中常用的方法?
	 * length();equals();charAt();comparaTo();substring();
	 * contains();....
	 * 
	 * 
	 * String与包装类、基本数据类型的转换:
	 * String--->包装类、基本数据类型:调用包装类的parseXxx();
	 * 包装类、基本数据类型--->String:调用String类的valueOf(Xxx xxx)
	 * 
	 * String与字节数组间的转换:
	 * String---->字节数组:getBytes();
	 * 字节数组---->String:new String(byte[] buf)
	 * 
	 * String与字符数组间的转换:
	 * String---->字符数组:toCharArray();
	 * 字符数组---->String:new String(char[] cuf)
	 * 
	 */
	
	/*
	 *  public String substring(int startpoint):获取从startpoint开始的子串
		public String substring(int start,int end):获取从start开始,到end结束左闭右开区间的子串
		pubic String replace(char oldChar,char newChar)
		public String replaceAll(String old,String new)
		public String trim():去除当前字符串中左右两端的空格。
		public String concat(String str):连接两个字符串
		public boolean contains(CharSequence s):当前字符串是否包含s
		public String[] split(String regex)

	 */
	@Test
	public void test5(){
		String s1 = "   h  e   llo   ";
		String s2 = s1.trim();
		System.out.println("----" + s1 + "----");
		System.out.println("----" + s2 + "----");
		
		
		
		String[] fakeFileData = {
		          "justin\t64/5/26\t0939002302\t5433343",
		          "momor\t68/7/23\t0939100391\t5432343" }; 
        for(String data : fakeFileData) {
            String[] tokens = data.split("\t");
             //\t为字符串的分割符号。          
            for(String token : tokens) {
                System.out.print(token + "\t| ");}
            System.out.println(); 
        }
	}
	
	/*
	 *  public int length():求长度
		public char charAt(int index):获取指定索引位置的字符
		public boolean equals(Object anObject):比较两个对象是否相等
		public int compareTo(String anotherString):比较两个字符串的大小
		public int indexOf(String s):获取当前字符串中s字符串首次出现的位置。如果不存在,返回-1
		public int indexOf(String s ,int startpoint):
		public int lastIndexOf(String s):获取当前字符串中s字符串末次出现的位置。如果不存在,返回-1
		public int lastIndexOf(String s ,int startpoint)
		public boolean startsWith(String prefix):当前字符串是否以prefix开头
		public boolean endsWith(String suffix):当前字符串是否以suffix结尾
		public boolean regionMatches(int firstStart,String other,int otherStart ,int length)
	 * 
	 * 
	 */
	@Test
	public void test4(){
		String s1 = "helwoloworld";
		String s2 = "wo";
		System.out.println(s1.indexOf(s2));//3
		System.out.println(s1.indexOf(s2,4));//7
		
		System.out.println(s1.startsWith("hel"));
		
		String s3 = "hooworld";
		System.out.println(s1.regionMatches(7, s3, 3, 5));//true
	}
	
	/*
	 * 
	 * 举例:s5,s6,s7所赋的值中,都出现了变量。只要出现变量,都理解为在堆空间中声明的值。
	 * 
	 */
	@Test
	public void test3(){
		String s1 = "hello";
		String s2 = "world";
		
		String s3 = "helloworld";
		String s4 = "hello" + "world";
		String s5 = s1 + s2;
		String s6 = s1 + "world";
		String s7 = "hello" + s2;
		//intern():表示在字符串常量池中声明。如果在常量池中已经存在,则复用。否则,声明一个新的字符串
		String s8 = (s1 + s2).intern();
		
		
		System.out.println(s3 == s4);
		System.out.println(s3 == s5);
		System.out.println(s3 == s6);
		System.out.println(s3 == s7);
		System.out.println(s5 == s6);
		System.out.println(s5 == s7);
		
		System.out.println(s3 == s8);//true
		
		
	}
	
	/*
	 * String:不可变的字符序列。(String的不可变性)
	 * ①给现有的字符串赋新的值 ②向现有的字符串后面添加新的字符串 ③修改现有的字符串中的某个字符
	 * 以上三种情况都算修改,都必须创建新的字符串才可。
	 */
	@Test
	public void test2(){
		String s1 = "java";
		String s2 = "java";
		s1 = "bigdata";
		
		System.out.println(s1);//bigdata
		System.out.println(s2);//java
		
		System.out.println("********************");
		String s3 = "hello";
		String s4 = "hello";
		s3 += "world";
		System.out.println(s4);//hello
		
		System.out.println("********************");
		
		String s5 = "helloworld";
		String s6 = "helloworld";
		String s7 = s5.replace('h', 'm');
		System.out.println(s7);//melloworld
		System.out.println(s5);//helloworld
		System.out.println(s6);//helloworld
		
	}
	
	/*
	 * String:
	 * 1.final的 
	 * 2. 实现了Serializable:可序列化,字符串可以直接在不同的进程间,前端与后台
	 * 之间的通信。 
	 * 3. 实现了Comparable接口,可比较大小 
	 * 4.实现了CharSequence:String内部提供了一个char[] ,用于存储数据
	 *  
	 *  String在内存中的存储结构。
	 *  本质上,声明的字符串存储在字符串常量池中。
	 *  
	 *  面试题:String s3 = new String("hello");在内存中创建了几个对象?
	 *        在堆空间和常量池中会分别创建对象。
	 */
	@Test
	public void test1(){
		String s1 = "hello";//int num = 10; 
		String s2 = "hello";
		String s3 = new String("hello");
		
		System.out.println(s1 == s2);//true
		
		System.out.println(s1 == s3);//false
		
		System.out.println(s1.equals(s2));//true
		System.out.println(s1.equals(s3));//true
		
		System.out.println("****************");
		Person p1 = new Person("Tom",12);
		Person p2 = new Person("Tom",14);
		System.out.println(p1.name == p2.name);
		
		p1.name = "jerry";
		System.out.println(p2.name);//Tom
		
		
	}
	
}

class Person{
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
}

容易出错的题型


	@Test
	public void test4(){
		String str = null;
		 
		StringBuffer sb = new StringBuffer();
		sb.append(str);

		System.out.println(sb.length());//4

		System.out.println(sb);//"null"
		
		StringBuffer sb1 = new StringBuffer(str);//报异常 空指针异常
		System.out.println(sb1);
		
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值