Java之String、StringBuffer、StringBuilder
String、StringBuffer和StringBuilder的理解
这三个类学过已经有一段时间了,想通过这篇文章再将其复习一下,以求温故知新。
首先说一下三者各自的特性
- String:
- String是不可变类。为什么说是不可变呢,进入String的源码即可知道,String底层维护的是一个数组,而这个数组是用private final修饰的。private说明它是不对外暴露的,final是不可以更改的。
- String的不可变性导致一旦一个String对象被创建后,包含在这个对象中的字符序列是不可以改变的,直至这个对象的销毁。在这里或许有人会提出这样的问题:String s="abc"; s=s+"def"; 这不是字符串明明被改变了嘛,为什么说不可变呢?原因就是:这是两个对象,每次对String类的字符串进行更改就等同于创建了一个新的对象。所以如果会对字符串对象进行频繁的更改,不建议使用String类。
- 创建String对象的两种方法:① String s ="";② String s =new String();
- 再说一种情况:String s1=“hello”;String s2=“world”;String s3=s1+s2;很明显最后s3输出为helloworld。而这是为什么呢?有些人会说是JVM直接在s1后面将s2加上的。但这就违反了String类的不可变性。其实是JVM首先开辟出了一块新的内存区域,然后再将s1和s2复制到这块区域中。这样很明显造成了内存空间的浪费和效率的降低,于是便引出下面将要说明的StringBuilder和StringBuffer。
- 这里再说一个小知识点:
String str1="hello";
String str2="hello";
String str3=new String("hello");
String str4=new String("hello");
①System.out.println("str1==str2?"+(str1==str2)); //true
②System.out.println("str2==str3?"+(str2==str3)); //false
③System.out.println("str3==str4?"+(str3==str4)); //false
④System.out.println("str3.equals(str4)?"+(str3.equals(str4)));//true
String str1="hello"; 这种方式创建字符串的时候,JVM首先会检查字符串常量池中是否存在该字符串的对象,如果已经存在,那么就不会在字符串常量池中再创建了,直接返回该字符串再字符串常量池中的内存地址,如果该字符串对象还不存在在字符串常量池中,那么就会在字符串常量池中先创建该字符串的对象,然后再返回。
String str3=new String("hello");这种方式创建字符串对象的时候,首先JVM先会检查字符串常量池中是否存在“hello”的字符串,如果已经存在,则不会在字符串常量池中创建了,如果还未存在,那么就在字符串常量池中创建“hello”字符串对象,然后还会到堆内存中再创建一份字符串对象,把字符串常量池中的“hello”字符串内容拷贝到堆内存中的字符串对象,然后返回堆内存中的字符串对象的内存地址。
代码①:结果为true,因为创建str2时字符串常量池中已经存在“hello”了,所以就不会再创建了,直接将str1的地址赋给str2。
剩下的②、③、④代码就不作解释了,请自行思考。需要说明的一点就是String类重写了equals()方法。
- StringBuffer:
- 在进行介绍之前先介绍一下Buffer。
- Buffer的意思为缓冲区。就是在内存中有一小块区域,要放什么内容,首先要放在这一小块区域中,然后再准备往其他地方放。就比如说有一个水流很小的水龙头,我们去接水都是用桶等容器去接,接满后再将桶中的水倒入其他地方。而这个桶就相当于一个缓冲区。
下面开始StringBuffer的正文:
- StringBuffer代表的是一个字符序列可变的字符串。当一个StringBuffer对象被创建以后,通过StringBuffer提供的append()、insert()、reverse()等方法,就可以改变这个字符串对象的字符序列。
- StringBuffer底层维护的是一个字符数组。如果使用无参构造方法,这个字符数组的默认初始容量为16。 如果长度不够用,就自动增长为原来的两倍加2。
- 一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
- StringBuffer是线程安全的,操作效率低。所谓线程安全是指在一个时间段内只允许一个线程来操作这份代码。
- StringBuilder:
- StringBuilder类也代表了字符串对象,和StringBuffer基本相似。
- StringBuilder是线程非安全的,操作效率高。所谓线程不安全指在一个时间段内一个代码可以由多个线程同时来执行。
- 总结:如果对字符串操作的少就用String,否则每次操作字符串都会产生一个新的对象,内存会吃不消的。如果单线程就用StringBuilder,因为StringBuilder是并没有实现线程安全,但是操作效率高。如果是多线程就使用StringBuffer,因为StringBuffer是线程安全的。
以上内容为自己整理的所学到的知识,当然还有很多不足,这需要您的指出。其中还有很多知识点没有列出,毕竟知识点太多了,越学习就越发现知识的海洋的广阔以及自己的渺小与无知,自己需要学的东西还非常多。路漫漫其修远兮,吾将上下而求索。
Java之String、StringBuffer、StringBuilder的更多相关文章
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- java中String,StringBuffer,StringBuilder之间的区别
文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...
- java 比较String StringBuffer StringBuilder
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- Java学习|String,StringBuffer,StringBuilder?
1 String (1) String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池.其运行机制是:创建一个字 ...
- Java中String/StringBuffer/StringBuilder区别(转)
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- Java之String,StringBuffer,StringBuilder类
在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2 ...
- Java的String&StringBuffer&StringBuilder
一:String类 1.String对象的初始化 由于String对象特别用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "ab ...
- java中string , StringBuffer , StringBuilder 区别
1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- Java学习笔记--String StringBuffer StringBuilder
String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...
随机推荐
- Python网络数据采集2-wikipedia
Python网络数据采集2-wikipedia 随机链接跳转 获取维基百科的词条超链接,并随机跳转.可能侧边栏和低栏会有其他链接.这不是我们想要的,所以定位到正文.正文在id为bodyContent的 ...
- 24. leetcode 409. Longest Palindrome
409. Longest Palindrome Given a string which consists of lowercase or uppercase letters, find the le ...
- 6-最基础的服务-es6写法
创建server.js 'use strict'; //http模块 var http = require('http'); //封装的方法 var handlers = require('./han ...
- 度度熊与邪恶大魔王 DP | 完全背包
Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式 ...
- oAuth 认证
这段时间公司开发项目用到oAuth2协议,现在做一下梳理. CORS即Cross Origin Resouce Share,跨域资源共享:是W3C为防止脚本攻击,而制定的安全标准之一,它云溪浏览器向跨 ...
- kafka在windows下的安装和配置
博主最近在学习有关kafka的配置安装以及在spring的集成使用.但网上关于kafka的配置参考资料基本都是于linux下的配置,于是博主在整理了相关windows下kafka的配置记录在博客里.由 ...
- Java 加载、链接、初始化
JVM 动态地加载.连接.初始化类或接口(在本文之后的篇幅中,我将使用"类"来表示"类和接口").这里我先贴上 Java 虚拟机规范的原文: Loading i ...
- python===基础,修改idle的输入风格
http://blog.csdn.net/aq_cainiao_aq/article/details/51701861
- Mybatis(二)
1 Mybatis映射文件--增删改查 POJO类 package cn.demo1; import org.apache.ibatis.type.Alias; /** * 描述:POJO */ @A ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...