String、StringBuilder与StringBuffer的区别
1.String类是public、final修饰的。
在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法。
查看源码得知,String类其实是通过char数组来保存字符串的。
对所有的String对象操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。
也就是说进行这些操作后,最原始的字符串并没有被改变,String类是不可变类。
如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串,因此频繁操作String效率会很低。
对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。
package com.rong.se;
public class UseString {
/**
* String操作
* @author 容杰龙
*/
public static void main(String[] args) {
String string="rong-jie-long";
//String重载很多构造方法,不列举。。。
String str=new String("abc well");
char ch = str.charAt(0);
System.out.println(ch);
int codePointAt = str.codePointAt(1);
System.out.println(codePointAt);
int codePointBefore = str.codePointBefore(1);
System.out.println(codePointBefore);
//相等返回0 比较大小
int compareTo = str.compareTo("abc well");
System.out.println(compareTo);
int compareToIgnoreCase = str.compareToIgnoreCase("ABC WELL");
System.out.println(compareToIgnoreCase);
//类似+
String concat = str.concat(string);
System.out.println(concat);
//以什么开始
boolean endsWith = str.endsWith("ll");
System.out.println(endsWith);
boolean startsWith = str.startsWith("abc");
System.out.println(startsWith);
//包括索引位置为5的字符
String substring = string.substring(5);
System.out.println(substring);
String[] split = string.split("-");
for (String string2 : split) {
System.out.println(string2);
}
//限制最多分成几段
String[] split2 = string.split("-", 3);
for (String string2 : split2) {
System.out.println(string2);
}
//比较是否相等,区分大小写
boolean equals = str.equals(string);
System.out.println(equals);
//比较是否相等,不区分大小写
boolean equalsIgnoreCase = str.equalsIgnoreCase(string);
System.out.println(equalsIgnoreCase);
int length = str.length();
System.out.println(length);
// 。。。。。。。。。。。。。。。。。。
}
}
2.StringBuilder不支持并发操作,线程不安全的,不适合多线程中使用,但其在单线程中的性能比StringBuffer高,是可变类,
任何对它所指代的字符串的改变都不会产生新的对象。
package com.rong.se;
public class TestStringBuilder {
public static void main(String[] args) {
//创建StringBuilder对象
StringBuilder sb=new StringBuilder();
StringBuilder stringBuilder=new StringBuilder("abcdefg");
sb.append(123);
sb.append("hhh");
sb.append(3.14159265354);
System.out.println(sb.toString());
//////////////////////////////
System.out.println(sb.charAt(3));
//可变类, 操作后仍然是同一个对象,只是内容不一样
sb.delete(0, 10);//左闭右开,可返回对象,同一个对象
System.out.println(sb);
//删除索引位置字符,可返回对象,同一个对象
StringBuilder deleteCharAt = sb.deleteCharAt(0);
System.out.println(sb);
//true,同一个对象
boolean b = sb.equals(deleteCharAt);
System.out.println(b);
//获取字符串首次出现的索引位置
int indexOf = sb.indexOf("53");
System.out.println(indexOf);
//从索引位置第几个开始插入字符串,可插入多种类型数据
sb.insert(3, "www");
sb.insert(3, 123.123);
System.out.println(sb.toString());
int lastIndexOf = sb.lastIndexOf("12", 6);
System.out.println(lastIndexOf);
System.out.println(sb.length());
//替换。左闭右开原则。
StringBuilder replace = sb.replace(0, 3, "r");
System.out.println(replace);
//反转
sb.reverse();
System.out.println(sb);
// 从索引位置第n个起(包含n),截取字符串,生成新的字符串!!!
String substring = sb.substring(10);
System.out.println(substring);
//转成String
String string = sb.toString();
System.out.println(string);
}
}
3.StringBuffer则是可变类,是线程安全的,任何对它所指代的字符串的改变都不会产生新的对象。
StringBuffer的操作与StringBuilder操作类似,基本相同。略。。。。。。
总结:
可变与不可变、线程安全与不安全、执行效率
String直接相加字符串,效率很高,因为在编译器便确定了它的值,形如"a"+"b"+"c"; 的字符串相加,在编译期间便被优化;对于间接相加(包含字符串引用),形如s1+s2+s3; 效率要比直接相加低,因为在编译器不会对引用变量进行优化
String、StringBuilder、StringBuffer三者的执行效率:StringBuilder > StringBuffer > String(相对而言)
当字符串相加操作或者改动较少的情况下:String
当字符串相加操作较多的情况下:StringBuilder
当程序采用了多线程:StringBuffer
String、StringBuilder与StringBuffer的区别的更多相关文章
- String, StringBuilder 与StringBuffer的区别与联系
1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...
- String,StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- String、StringBuilder和StringBuffer的区别
1 String.StringBuilder和StringBuffer的区别 String.StringBuilder.StringBuffer都可以用来保存字符串.如果是使用次数比较 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- 面试必知:String、StringBuilder、StringBuffer的区别
你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...
- JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍
一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式 方式一:直接赋值法 String str1 = "hello"; 方式 ...
- StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- StringBuilder和StringBuffer的区别
Java中StringBuilder和StringBuffer的区别分析 StringBUilder是线程不安全的(线程同步访问的时候会出问题),但是效率相对较高. (String类型使用加号进行拼接 ...
- Java基础(32):String与StringBuilder、StringBuffer的区别(String类)
在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...
随机推荐
- 1.Hadoop集群安装部署
Hadoop集群安装部署 1.介绍 (1)架构模型 (2)使用工具 VMWARE cenos7 Xshell Xftp jdk-8u91-linux-x64.rpm hadoop-2.7.3.tar. ...
- 【Mac】解决「无法将 chromedriver 移动到 /usr/bin 目录下」问题
问题描述 在搭建 Selenium 库 + ChromeDriver 爬虫环境时,遇到了无法将 chromedriver 移动到 /usr/bin 目录下的问题,如下图: 一查原来是因为系统有一个 S ...
- Go语言反射之值反射
1 概述 反射不仅可以获取值的类型信息,还可操作变量的值.使用 reflect.Value 类型操作变量的值. 2 值反射对象 reflect.ValueOf() 方法可以获取一个值的反射对象,之后可 ...
- 几个并发的术语解释——QPS,TPS,PV
从英文全称翻译出字面意思就OK啦! PV=page view TPS=transactions per second QPS=queries per second RPS=requests per ...
- 20155317 2016-2017-2 《Java程序设计》第十学习总结
20155317 2016-2017-2 <Java程序设计>第十学习总结 教材学习内容总结 1.网络编程的概念: 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作 ...
- OpenStack入门篇(七)之认证服务Keystone
一.Keystone的概述 Keystone是Openstack的组件之一,用于为Openstack家族中的其它组件成员提供统一的认证服务,包括身份验证,令牌的发放和校验,服务列表,用户权限的定义等. ...
- ubuntu的学习教程(常用操作)
摘要 最近在学习linux,把自己学习过程中遇到的常用操作以及一些有助于理解的内容记录下来.我主要用的是ubuntu系统 命令提示符 '~' 这个是指用户的家目录,用户分为root用户和普通用户,ro ...
- Awesome TensorFlow
Awesome TensorFlow A curated list of awesome TensorFlow experiments, libraries, and projects. Inspi ...
- 使用GitLab创建项目
- Eclipse用java.util.Scanner时出现Resource leak: 'in' is never closed
Resource leak: 'in' is never closed : 直译为资源泄漏,‘in’一直没被关闭. 由于声明了数据输入扫描仪(Scanner in),从而获得了配置内存,但是结束时却没 ...