【Java面试题】String,StringBuffer,StringBuilder和StringTokenizer有什么区别

前言

在Java程序中有关字符或者字符串操作的有以上几种类可以使用,初学者可能用String类比较多,因为方便使用。然而在实际开发或者面试的时候会经常遇到这几个类的比较,下面介绍下他们之间都有什么关系。

String类

  • 在Java中String类是不可变类,就是说String类创建完了之后自身的值不会再改变,原因是String类是被申明为final类型,除了hash属性不是final,其他的属性全部都是final。
  • 在实例化对象的时候,可以使用构造方法来初始化也可以用赋值的方式来初始化。
  • 在进行字符串拼接的时候,是先创建一个StringBuffer对象,然后调用StringBufferappend()方法。举个栗子:

String str = "hello";
str += "world";
//上面第二段在编译的时候会转换成如下代码
StringBuffer sb = new StringBuffer(str);
sb.append("world");
str = sb.toString();
如下图所示:一开始str指向的是堆内存中的某个位置,后来通过更换所指向的内存地址来实现字符串的拼接,如果在大型项目中多次进行这样的操作是不仅在一定程度上浪费内存,同时在Java内存会后回收的时候也十分浪费时间。在这里插入图片描述

StringBuffer类

  • 在Java中其为可变类,这是和String类最大的区别,也就意味着不会产生一些无用的对象。其是继承了AbstractStringBuilder并且是线程安全的。
  • 在实例化的时候只能通过构造方法的形式来初始化对象。
  • 在进行字符串拼接的时候,可以通过append()方法来实现,但是速度要比StringBuilder要慢一点。

StringBuilder类

  • 在Java中也为可变类,也是继承了AbstractStringBuilder,但是不是线程安全的。
  • 在实例化的时候只能通过构造方法的形式来初始化对象。
  • 在进行字符串拼接的时候,可以通过append()方法来实现,在字符串操作的函数方面几乎和StringBuffer一样。
    在这里插入图片描述

StringTokenizer类

  • 这个类主要是用于字符串的分割的,像在大数据文本处理中可能会用到这个类中的方法。

实验比较

在单线程的程序中,前三者对于字符串拼接的速度从快到慢依次是:StringBuilder > StringBuffer > String。例如我们以100000次的拼接进行对比发现事实正是如此。代码如下:

public class AboutString {
	public static void main(String[]  args){
		showDifference();
	}
	/**
	 * String, StringBuffer, StringBuilder和StringTokenizer区别
	 */
	private static void showDifference() {
		//分别创建字符串
		String str1 = new String("Hello");
		String Str2 = "Hello";
		
		StringBuffer sb1 = new StringBuffer("Hello");
		StringBuilder sbd1 = new StringBuilder("Hello");
		
		//记录String类进行字符串拼接时的时间
		long startTime = System.currentTimeMillis();
		for(int i=0;i<100000;i++){
			str1 += "world";
		}
		long endTime = System.currentTimeMillis();
		System.out.println("String加长所需时间为:" + (endTime - startTime));
		
		//记录StringBuffer类进行字符串拼接时的时间
		startTime = System.currentTimeMillis();
		for(int i=0;i<100000;i++){
			sb1.append("word");
		}
		endTime = System.currentTimeMillis();
		System.out.println("StringBuffer加长所需时间为:" + (endTime - startTime));
	
		//记录StringBuilder类进行字符串拼接时的时间
		startTime = System.currentTimeMillis();
		for(int i=0;i<100000;i++){
			sbd1.append("word");
		}
		endTime = System.currentTimeMillis();
		System.out.println("StringBuilder加长所需时间为:" + (endTime - startTime));

		StringTokenizer st = new StringTokenizer("Hello World Welcome to Nanjing");
		while(st.hasMoreElements()){//也可以使用hasMoreTokens()方法
			System.out.println(st.nextElement());//或者是nextToken()
		}
	}
}

最终结果如下:

String加长所需时间为:20059
StringBuffer加长所需时间为:4
StringBuilder加长所需时间为:1
Hello
World
Welcome
to
Nanjing
University
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值