详解Java中String,StringBuffer和StringBuilder的使用

目录
  • 1.String类
  • 2.String对象创建的两种方式
  • 3.String常用方法
  • 4.StringBuffer
    • String和StringBuffer的转换
    • StringBuffer的常用方法
  • 5.StringBuilder

1.String类

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

String对象实现了Serializable接口,说明String对象可以串行化(在网络中进行传输),同时实现了Comparable接口,说明String对象可以进行比较

String是个final类,这代表它是不可被继承的

String的本质依然是char数组(或者byte数组,要看JDK的版本),通过源码我们可以轻松的得知:

// JDK1.9及之后的版本,String的字符串内容保存在一个叫做value的byte数组中
@Stable
private final byte[] value;
// 注意这里的value数组是一个final类型,这代表它是不可以被修改的,这里指的是value的地址不能发生修改,而并非value数组里的值

jdk1.8及以前String使用的是char数组,jdk1.9及以后使用的是byte数组。

因为开发人员发现人们使用的字符串值是拉丁字符居多而之前使用的char数组每一个char占用两个字节而拉丁字符只需要一个字节就可以存储,剩下的一个字节就浪费了,造成内存的浪费,gc的更加频繁。因此在jdk9中将String底层的实现改为了byte数组。

2.String对象创建的两种方式

// 直接赋值
String name = "dahe";
System.out.println(name);
// 调用构造器赋值
String wodeshijie = new String("wodeshijie");
System.out.println(wodeshijie);

两种对象创建方式的区别:

直接赋值:现在常量池中看是否存在该字符串,存在则直接指向,不存在则创建后指向

new的方式:先在堆中新建一个对象空间,通过value数组在常量池中寻找该字符串,有的话就将地址返回给value,没有的话就先创建再将地址返回给value

经典面试题A:

会创建一个对象,编译器会对该代码进行优化,a存储的字符串等价于helloabc

经典面试题B:(该代码块创建几个对象)

// 面试题
String a = "hello";
String b = "world";
String c = a + b;

会创建三个对象,a对象和b对象,c对象的创建其实是在堆中,堆中的地址指向字符串常量池的一个helloworld对象常量相加看的是池,变量相加是在堆中!

3.String常用方法

直接上代码演示:

/**
 * String练习
 */
public class StringTest {
    public static void main(String[] args) {
        // 直接赋值
        String name = "dahe";
        System.out.println(name);
        // 调用构造器赋值
        String wodeshijie = new String("wodeshijie");
        System.out.println(wodeshijie);

        // String类的常用方法
        String a = "imustctf";
        String b = "Imustctf";
        // 判断两字符串的值是否相等(区分大小写)
        System.out.println(a.equals(b));
        // 判断两字符串的值是否相等不区分大小写)
        System.out.println(a.equalsIgnoreCase(b));
        // 获取字符个数
        System.out.println(a.length());
        // 获取子字符串在字符串对象中第一次出现的索引位置,找不到返回-1
        int index = a.indexOf('m');
        System.out.println(index);
        // 获取子字符串在字符串对象中最后一次出现的索引位置,找不到返回-1
        int lastIndex = a.lastIndexOf('t');
        System.out.println(lastIndex);
        // 字符串截取
        System.out.println(a.substring(2)); // 截取2后面的所有字符
        System.out.println(a.substring(2, 5)); // 截取0 - 4的所有字符
        // 字符串转大写
        System.out.println(a.toUpperCase());
        // 字符串转小写
        System.out.println(b.toLowerCase());
        // 字符串拼接
        String c = "begin";
        c = c.concat(a).concat(b);
        System.out.println(c);
        // 替换
        c = c.replace("begin", "end");
        System.out.println(c);
        // 分割字符串
        String 春日山中对雪 = "竹树无声或有声,霏霏漠漠散还凝," +
                "岭梅谢后重妆蕊,岩水铺来却结冰," +
                "牢系鹿儿防猎客,满添茶鼎候吟僧," +
                "好将膏雨同功力,松径莓苔又一层";
        String[] splitRes = 春日山中对雪.split(",");
        for (String splitRe : splitRes) {
            System.out.println(splitRe);
        }
        // 字符串转化为字符数组
        char[] chs = a.toCharArray();
        for (char ch : chs) {
            System.out.println(ch);
        }
        // 字符串比较,前者大返回正数,后者大返回负数,相等返回0
        System.out.println("abcd".compareTo("abcz"));
        // 字符串格式化
        String info = String.format("网站名字%s,首字母大写后%s", a, b);
        System.out.println(info);
    }
}

输出:

false
true
8
1
6
ustctf
ust
IMUSTCTF
imustctf
beginimustctfImustctf
endimustctfImustctf
竹树无声或有声
霏霏漠漠散还凝
岭梅谢后重妆蕊
岩水铺来却结冰
牢系鹿儿防猎客
满添茶鼎候吟僧
好将膏雨同功力
松径莓苔又一层
i
m
u
s
t
c
t
f
-22
网站名字imustctf,首字母大写后Imustctf

4.StringBuffer

概述

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。

StringBuffer的本质依然是char数组(或者byte数组,要看JDK的版本)但是和String不同的是,该数组不是final类型的和String类一样,StringBuffer类也是final类型,代表它不能被继承!

String VS StringBuffer:

StringBuffer三种构造器初始化

// 创建一个大小为16的char[] 数组,用于存放字符内容
StringBuffer stringBuffer = new StringBuffer();
// 指定char[]容量大小
StringBuffer stringBuffer1 = new StringBuffer(100);
// 通过给一个string创建stringbuffer,初始容量为字符串长度 + 16
StringBuffer dahezhiquan = new StringBuffer("dahezhiquan");

String和StringBuffer的转换

String --> StringBuffer

// String --> StringBuffer
String str = "hello";
// 方法一:通过构造器
StringBuffer stringBuffer2 = new StringBuffer(str);
// 方法二:通过append
StringBuffer stringBuffer3 = new StringBuffer();
stringBuffer3.append(str);

StringBuffer --> String

// StringBuffer --> String
StringBuffer stringBuffer4 = new StringBuffer("lsp");
// 方法一:通过toString方法
String s = stringBuffer4.toString();
// 方法二:使用构造器
String s1 = new String(stringBuffer4);

StringBuffer的常用方法

代码示例:

// StringBuffer的常用方法
StringBuffer imustctf = new StringBuffer("imustctf");
// 追加操作
imustctf.append(" nice");
imustctf.append(" yes").append(true).append(5.21).append(1314);
System.out.println(imustctf);
// 删除操作
// 删除索引为5到6的字符
imustctf.delete(5,7);
System.out.println(imustctf);
// 修改操作,替换9到10的字符为方文杰
imustctf.replace(9,11,"方文杰");
System.out.println(imustctf);
// 查找操作
int index = imustctf.indexOf("方文杰");
System.out.println(index);
// 插入操作,在索引为9的后面插入张三
imustctf.insert(9,"张三");
System.out.println(imustctf);
// 长度
System.out.println(imustctf.length());

输出:

imustctf nice yestrue5.211314
imustf nice yestrue5.211314
imustf ni方文杰 yestrue5.211314
9
imustf ni张三方文杰 yestrue5.211314
30

5.StringBuilder

概述

一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步(不是线程安全的),用在字符串缓冲区被单个线程使用的时候,如果可能建议优先使用该类,因为在大多数的时候,它比StringBuffer要快

StringBuilder类是final类型,不能被继承!StringBuilder的本质依然是char数组(或者byte数组,要看JDK的版本),该数组不是final类型

StringBuilder和StringBuffer同属一个父类,故他们的方法一致

现在我们来看一下String,StringBuffer,StringBuilder的区别:

到此这篇关于详解Java中String,StringBuffer和StringBuilder的使用的文章就介绍到这了,更多相关Java String内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 中String StringBuilder 与 StringBuffer详解及用法实例

    在Android/Java开发中,用来处理字符串常用的类有3种: String.StringBuilder.StringBuffer. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String VS StringBuffer String 类型和StringBuffer的主要性

  • java中String、StringBuffer与StringBuilder的区别

    String String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁. 这个是String类的解释,之前小咸儿看到这个情况,不能理解上述的解释,如下 String a = "123"; a = "456"; // 打印出来的a为456 System.out.println(a) 看到这里,小咸儿不明白了,这不是明明已经对他进行修改了吗?为什么还说他是一个不可变类呢? 经过小咸儿和小伙伴们的学习,明白

  • java中String StringBuffer和StringBuilder的区别详解

    目录 从声明定义上来谈 从结构上来谈 从线程安全来谈 总结 从声明定义上来谈 只有String 可以 直接声明创建 而 StringBuffer 与 StringBuilder 必须去new对象 这是因为只有String会在这种声明方式下去字符串常量池创建,其他则没有 StringBuffer stf = new StringBuffer("abc"); StringBuilder stb = new StringBuilder("abc"); StringBuff

  • java 中String和StringBuffer与StringBuilder的区别及使用方法

    java 中String和StringBuffer与StringBuilder的区别及使用方法 1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a"; //假设a指向地址0x0001 a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向

  • Java 中 String,StringBuffer 和 StringBuilder 的区别及用法

    1 简介 在 Java 语言中,共有 8 个基本的数据类型,分别为:byte.short.int.long.float.double.boolean 和 char,其中 char 类型用于表示单个字符,例如 a.b.c .A.B.C.& 这些大小写字母或者特殊字符等等.在实际的编程中,单个的字符并没有我们想象中用的那么频繁,反而是多个字符组成的"字符串"更为常见,但是在基本的数据类型中,并没有字符串这种数据类型.为了解决这个问题,Java 语言为我们提供了一个被 final 关

  • java String、StringBuilder和StringBuffer的区别详解

    1.共同点: 三者都是字符串类.StringBuilder和StringBuffer都是继承AbstractStringBuilder类,存储字符串都是使用数组进行存储的. 2.区别: a. String 类存储字符串使用的数组被final进行修饰了,当对String对象进行增加修改字符时,都需要重新new一个字符数组,将原来的值拷贝到新的字符数组中,所以当字符串的值需要经常修改的时候就需要考虑用StringBuilder或StringBuffer来进行处理了. public final cla

  • Java源码深度分析String与StringBuffer及StringBuilder详解

    目录 StringBuffer和StringBuild的区别 创建StringBuffer() 添加功能 删除功能 替换功能 反转功能 最后总结一下 String的字符串是不可变的,StringBuffer和StringBuilder是可变的 String:是字符常量,适用于少量的字符串操作的情况. StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况 . StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况. StringBuffer和StringBuild

  • 详解Java中String,StringBuffer和StringBuilder的使用

    目录 1.String类 2.String对象创建的两种方式 3.String常用方法 4.StringBuffer String和StringBuffer的转换 StringBuffer的常用方法 5.StringBuilder 1.String类 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. String对象实现了Serializable接口,说明String对象可以串行化(在网络中进行传输),同时实现了Comp

  • 详解Java中String类的各种用法

    目录 一.创建字符串 二.字符.字节与字符串的转换 1.字符与字符串的转换 2.字节与字符串的转换 三.字符串的比较 1.字符串常量池 2.字符串内容比较 四.字符串查找 五.字符串替换 六.字符串拆分 七.字符串截取 八.String类中其它的常用方法 九.StringBuffer 和 StringBuilder 1.StringBuilder与StringBuffer的区别 2.StringBuilder与StringBuffer常用的方法 十.对字符串引用的理解 一.创建字符串 创建字符串

  • 详解Java中String JSONObject JSONArray List<实体类>转换

    JSON使用阿里的fastJson为依赖包 gradle依赖管理如下: compile group: 'com.alibaba', name: 'fastjson', version:'1.2.41' 1.String转JSONObject 前言:String 是JSONObject格式的字符串 eg: JSONObject jSONObject = JSONObject.parseObject(String); 2.String转JSONArray 前言:String 是JSONArray格式

  • 详解java中String值为空字符串与null的判断方法

    Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个字符串.例如声明一个对象的引用,String a=null. ""表示的是一个空字符串,也就是说它的长度为0.例如声明一个字符串String s="". 2.内存分配 String a=null:表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间. String s="":表示声明一个字符串类型的引用,其值为""空

  • 详解java中String、StringBuilder、StringBuffer的区别

    你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我们一般这样声明: String s = "abc"; String类使用被final修饰的char数组来存储字符串的内容,它的一大特性就是不可变,怎么理解这个不可变呢? 我们知道,一个类被final修饰,那么这个类无法被继承,方法也不能被重写,属性也不能改变. 看看这段代码: String

  • 详解Java中String类型与默认字符编码

    为什么写这个 至于为什么要写这个,主要是一句mmp一定要讲,绕了一上午,晕死 Java程序中的中文乱码问题一直是一个困扰程序员的难题,自己也不例外,早在做项目时就遇到过很多编码方式的坑,当时想填来着,但是嫌麻烦.这次终于忍不住了,一定要弄个明白 String类型的编码方式 从网上查的资料都说,Java默认的字符编码是Unicode,而String类型的编码方式是与JVM编码方式和本机操作系统默认字符集有关的.于是我做出了测试 在Java中可以这样显示查看本地编码方式(JVM还是OS呢?) //

  • 两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    目录 前言 1. 定义字符串 2.字符串比较相等 equals 使用注意事项 3. 字符串常量池( 多图解析 ) 第一个列子解析: 第二个列子解析: 第三个列子解析: 第四个列子解析: 第五个列子解析: 第六个列子解析: 第七个列子解析: 第八个列子解析: 面试题:请解释String类中两种对象实例化的区别 4. 理解字符串不可变 5.字符, 字节与字符串 字节与字符串 小结 6. 字符串常见操作 6.1 字符串比较 6.2 字符串查找 6.3 字符串替换 6.4 字符串拆分 6.5 字符串截取

  • 浅谈java中String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用时,如果经常需要对一个字符串进行修改,例如插入.删除等 * 但StringBuffer和StringBuilder有什么区别呢? StringBuffer是线程安全的,在多线程程序中是很方便使用的,但是程序的效率就会慢一点. StringBuilder不是线程安全的,在单线程中,比StringBuf

  • 详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 1.写一个javabean文件,描述ftp上传或下载的信息 实例代码: public class FtpUseBean { private String host; private Integer port; private String us

随机推荐