首页 > 其他分享 >字符串相关的类(String类、StringBuffer、StringBuilder)的使用

字符串相关的类(String类、StringBuffer、StringBuilder)的使用

时间:2023-06-09 18:02:22浏览次数:34  
标签:String StringBuilder System str StringBuffer println sb out

String类的使用

package com.qf.string_class;

import java.util.Arrays;

public class Test01 {
	/**
	 * 知识点:字符串相关的类
	 * 分类:
	 * 		String、StringBuffer、StringBuilder
	 * 
	 * 知识点:String类的使用
	 */
	public static void main(String[] args) {
		
		
		String str = "123abc";
		
		str = str.concat("DEF123");//凭接字符串,并返回新的字符串
		
		str = str.substring(2);//从开始下标出截取到字符串末尾,并返回新的字符串
		
		str = str.substring(1, 5);//从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串
		
		str = str.toUpperCase();//转大写,并返回新的字符串
		
		str = str.toLowerCase();//转小写
		
		str = "   123 abc    DEF  123    ";
		str = str.trim();//去除首尾空格,并返回新的字符串
		str = str.replace('a', 'A');//替换字符,并返回新的字符串
		str = str.replaceAll("bc", "BBCC");//替换字符串,并返回新的字符串
		str = str.replaceAll(" ", "");//将空格替换成空内容的字符串,达到去空格的效果
		
		System.out.println("判断两个字符串内容是否相同(区分大小写):" + str.equals("123ABBCCDEF123"));//true
		System.out.println("判断两个字符串内容是否相同(不区分大小写):" + str.equalsIgnoreCase("123abbccDEF123"));//true
		System.out.println("判断字符串是否以某个字符串开头:" + str.startsWith("123"));//true
		System.out.println("判断字符串是否以某个字符串结尾:" + str.endsWith("123"));//true
		
		System.out.println("判断字符串第一次出现的下标:" + str.indexOf("B"));//4
		System.out.println("判断字符串最后一次出现的下标:" + str.lastIndexOf("B"));//5
		System.out.println("获取指定下标上的字符:" + str.charAt(3));//A
		System.out.println("获取长度:" + str.length());//14

		char[] cs = str.toCharArray();//将字符串转换为字符数组(获取字符串底层的字符数组)
		System.out.println(Arrays.toString(cs));

		System.out.println(str);//123ABBCCDEF123

		//将其他类型转换为字符串 -- 方式一
		System.out.println(String.valueOf(100));//int -> String
		System.out.println(String.valueOf(123.123));//double -> String
		System.out.println(String.valueOf(true));//boolean -> String
		System.out.println(String.valueOf('A'));//char -> String

		//将其他类型转换为字符串 -- 方式二
		System.out.println(100 + "");//int -> String  自动向上转
		System.out.println(123.123 + "");//double -> String
		System.out.println(true + "");//boolean -> String
		System.out.println('A' + "");//char -> String
		
		System.out.println(str);
		
		}

}

StringBuffer的使用

public static void main(String[] args) {
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("123abc");//在末尾追加字符串
		sb.append("DEF123");//在末尾追加字符串
		
		sb.insert(6, "XXXYYY");//在指定下标处插入字符串
		sb.replace(6, 12, "xxyy");//从开始下标处(包含)替换到结束下标处(排他)的字符串
		
		sb.deleteCharAt(4);//删除指定下标上的字符
		sb.delete(3, 12);//从开始下标处(包含)删除到结束下标处(排他)的字符串
		
		sb.reverse();//反转字符串
		
		//321321
		System.out.println(sb);//123abcDEF123
	}

StringBuilder的使用

public static void main(String[] args) {
		
		StringBuilder sb = new StringBuilder();
		
		sb.append("123abc");//在末尾追加字符串
		sb.append("DEF123");//在末尾追加字符串
		
		sb.insert(6, "XXXYYY");//在指定下标处插入字符串
		sb.replace(6, 12, "xxyy");//从开始下标处(包含)替换到结束下标处(排他)的字符串
		
		sb.deleteCharAt(4);//删除指定下标上的字符
		sb.delete(3, 12);//从开始下标处(包含)删除到结束下标处(排他)的字符串
		
		sb.reverse();//反转字符串
		
		//321321
		System.out.println(sb);//123abcDEF123
	}

深入String 之 创建对象问题

String str1 = "abc";//0X11
String str2 = "abc";//0X11
System.out.println(str1 == str2);//true


String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);//false
//创建了三个对象,“abc”放在常量池中+还new了两个对象

深入String 之 拼接字符串问题

public static void main(String[] args) {
		String str1 = "abc";
		String str2 = "abc";
		System.out.println(str1 == str2);//true
		
		//注意:字面值常量在编译时就直接拼接
		String str3 = "ab" + "c";
		System.out.println(str1 == str3);//true
		
		//注意:常量在编译时就直接拼接
		final String s1 = "ab";
		final String s2 = "c";
		String str4 = s1 + s2;
		System.out.println(str1 == str4);//true
		
		String s3 = "ab";
		String s4 = "c";
		String str5 = s3 + s4;//底层实现:new StringBuilder(String.valueOf(s3)).append(s4).toString()
		System.out.println(str1 == str5);//false
	}

StringBuilder和StringBuffer的底层原理

  • 知识点:StringBuilder和StringBuffer的底层原理
    继承关系:
    StringBuilder extends AbstractStringBuilder
    StringBuffer extends AbstractStringBuilder
    小结:
    1.StringBuilder和StringBuffer将数据存储在父类AbstractStringBuilder中的char类型的数组中
    2.缓冲数组的默认大小16
    3.StringBuilder的功能完全依赖父类AbstractStringBuilder
    4.StringBuffer的功能完全依赖父类AbstractStringBuilder
    5.StringBuilder和StringBuffer的使用是一模一样的
    6.StringBuilder是线程不安全的,单线程下使用
    7.StringBuffer是线程安全的,多线程下使用 - synchronized
public static void main(String[] args) {

		//默认缓冲区大小:16
		//StringBuilder sb = new StringBuilder();
		//自定义缓冲区大小:100
		//StringBuilder sb = new StringBuilder(100);
		//自定义缓冲区大小:"123aaa".length() + 16
		//		StringBuilder sb = new StringBuilder("123aaa");
		//		sb.append("123abc");
		//		sb.append("DEF123");
		//		System.out.println(sb);

		//默认缓冲区大小:16
		//MyStringBuilder msb = new MyStringBuilder();
		//自定义缓冲区大小:100
		//MyStringBuilder msb = new MyStringBuilder(100);
		//自定义缓冲区大小:"123aaa".length() + 16
		//		MyStringBuilder msb = new MyStringBuilder("123aaa");
		//		msb.append("123abc");
		//		msb.append("DEF123");
		//		System.out.println(msb);

		//--------------------------------------------------------------------------------

		//默认缓冲区大小:16
		//StringBuffer sb = new StringBuffer();
		//自定义缓冲区大小:100
		//StringBuffer sb = new StringBuffer(100);
		//自定义缓冲区大小:"123aaa".length() + 16
		//		StringBuffer sb = new StringBuffer("123aaa");
		//		sb.append("123abc");
		//		sb.append("DEF123");
		//		System.out.println(sb);

		//默认缓冲区大小:16
		//MyStringBuffer msb = new MyStringBuffer();
		//自定义缓冲区大小:100
		//MyStringBuffer msb = new MyStringBuffer(100);
		//自定义缓冲区大小:"123aaa".length() + 16
		MyStringBuffer msb = new MyStringBuffer("123aaa");
		msb.append("123abc");
		msb.append("DEF123");
		System.out.println(msb);
}

String vs StringBuilder vs StringBuffer

  • String的理解:
String是不可变类, 即一旦一个String对象被创建,
包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁。
String类是final类,不能有子类。
public class String{
private final char[] value;
}
  • StringBuilder和StringBuffer的理解:
StringBuilder和StringBuffer称为字符串缓冲区,
它的工作原理是:new对象预先申请一块内存,存放字符序列(字符数组),
默认大小为16个长度,如果字符序列满了,会重新改变缓存区的大小(扩容机制:原来长度*2+2),
以容纳更多的字符序列。
StringBuilder和StringBuffer是可变对象(可扩容),这个是String最大的不同
StringBuilder和StringBuffer代表可变的字符序列。

频繁的字符串拼接请使用StringBuilder或StringBuffer

public static void main(String[] args) {
		//获取1970年1月1日到现在的毫秒数(1秒 = 1000毫秒)
		//long currentTime = System.currentTimeMillis()ss

//		long startTime = System.currentTimeMillis();
//		String str = "用良心做教育";
//		for (int i = 0; i < 10000; i++) {
//			str += "用良心做教育";
//			//底层原理:
//			//	str = str + "用良心做教育";
//			//	str = new StringBuidler(String.valueOf(str)).append("用良心做教育").toString();
//		}
//		System.out.println("字符串长度:" + str.length());
//		long endTime = System.currentTimeMillis();
//		System.out.println("消耗时长:" + (endTime-startTime));//380毫秒

		long startTime = System.currentTimeMillis();//单例模式,懒汉式
		StringBuilder sb = new StringBuilder(60006);
		sb.append("用良心做教育");
		for (int i = 0; i < 10000; i++) {
			sb.append("用良心做教育");
		}
		System.out.println("字符串长度:" + sb.length());
		long endTime = System.currentTimeMillis();
		System.out.println("消耗时长:" + (endTime-startTime));//1毫秒

	}

标签:String,StringBuilder,System,str,StringBuffer,println,sb,out
From: https://blog.51cto.com/u_16154651/6449719

相关文章

  • CString TO Double (zz)
    //z2013-10-2115:01:30IS2120@BG57IV3T3345574402.K.F3396121938[T3,L303,R3,V37]1.atlCString转换成double浮点数A CString canconverttoan LPCTSTR,whichisbasicallya constchar* (constwchar_t*atof():CStringthestring("13.37");doubled=a......
  • 在Non-Mfc下使用CString
    UsersofVisualStudio2003andnewermaydirectlygotobelowandskipthisone.//z2012-1-1310:36is2120方法一---Q:Howtouse'CString'innon-MFCapplications?A:Inmostcases,youdon'tneedtodothat.Inordertouse'CString......
  • Handling Invalid Characters in an XML String (zz.IS2120.BG57IV3)
    Thereare5predefinedentityreferencesinXML://z2013-08-2018:03:27IS2120@BG57IV3.T3597203987.K[T191,L2147,R75,V2925]<<lessthan>>greaterthan&amp;&ampersand &apos;'apostrophe""quotationmark//z2014-04-1017:47......
  • DataTable DataRow String Tips...
       与datatable奋战了一天,记录一下。。。      1.查看得到的datatable是否为空datatable.Rows.Count   2.查看得到的DataRow[]是否为空,可用DataRow.Length   3.DataTable在进行select的时候,默认是CaseSensitive为false   4.......
  • Gorm 处理时间为string类型
    Gorm处理时间为string类型标签(空格分隔):go,gormpackage_typeimport( "database/sql/driver" "fmt" "time")typeTimeStringtime.Timefunc(s*TimeString)MarshalJSON()([]byte,error){ tmp:=time.Time(*s) return[]byte(fmt.S......
  • Searching for a String in Multiple Files
    常用命令:grep-r-n-B1-A1--include=*.cstrstr*findstr/S"MB_ICONHAND"*.h Everneedtosearchthroughallyourfilesforacertainwordorphrase?Idid,andtomakemattersmorecomplicated,thefileswereallindifferentsub-directories.......
  • JAVA面试题解惑系列(六)——字符串(String)杂谈
    关键字:java面试题字符串string作者:臧圩人(zangweiren)网址:http://zangweiren.javaeye.com上一次我们已经一起回顾了面试题中常考的到底创建了几个String对象的相关知识,这一次我们以几个常见面试题为引子,来回顾一下String对象相关的其它一些方面。String的l......
  • toString方法
    //Student2类/**一般情况下toString方法堆我们来说没有什么用,所以要重写toString方法*Alt+enter*Alt+insert**/publicclassStudent2extendsObject{privateStringname;privateintage;publicStudent2(){super();}publicStudent2(String......
  • Java中的substring真的会引起内存泄露么?
    在Java中开发,String是我们开发程序可以说必须要使用的类型,String有一个substring方法用来截取字符串,我们想必也常常使用。但是你知道么,关于Java6中的substring是否会引起内存泄露,在国外的论坛和社区有着一些讨论,以至于Java官方已经将其标记成bug,并且为此Java7还重新进行了实现。......
  • 在List<String>中找出重复的字符串元素__简单高效
    点击查看代码publicvoidassertNoDuplicateStr(List<String>list,Stringkey){if(ObjectUtils.isEmpty(list)){return;}Set<String>set=newHashSet<>();list.stream().forEach(e->Assert.isTrue(set.add(e),String......