理解String、StringBuilder和StringBuffer
1. String、StringBuilder和StringBuffer异同
相同点:底层都是通过char数组实现的
不同点:
- String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;
- StringBuffer是线程安全的,StringBuilder是不安全的。
- 如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。
2. String为什么不可变?
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
}
(1) 保存字符串的数组被 final修饰 且 为私有private修饰,String类没有提供暴露修改这个字符串的方法。
(2) String是被final修饰的,导致其不能被继承,进而避免了子类破坏String不可变.
2.1 深入理解String不可变
String s1="hi";
String s2="hi";
s1="hello";
刚开始字符串s1和s2内容相等,都指向字符串常量池中的同一个地址,当s1值的改变之后,此时s2的值不变还是指向原来的内存地址,但是s1会重新分配内存地址进行赋值。
总结1:String字符串具有不可变性,当字符串重新赋值时,不会在原来的内存地址进行修改,而是重新分配新的内存地址进行赋值。
总结2:当字符串进行拼接时,也不会在原来的内存地址进行修改,而是重新分配新的内存地址进行赋值。
总结3:当调用String的replace方法修改指定的字符或字符串时,也不会在原来的内存地址进行修改,也是重新分配新的内存地址进行赋值。
2.2 String实例化的两种方式
方式一:通过字面量方式实例化
String str = "abc";
方式二:通过new+构造器的方式实例化
String str=new String("abc");
通过字面量方式为字符串赋值时,此时的字符串存储在字符串常量池中;
通过new+构造器方式实例化字符串时,字符串对象存储在堆中,但是字符串的值仍然存储在常量池中。
2.3 String的常用方法
int length():返回字符串的长度
char charAt(int index):返回指定索引处的字符
boolean isEmpty():判断字符串是否为空
String toLowerCase():将字符串中的所有字符转换为小写
String toUpperCase():将字符串中的所有字符转换为大写
String trim():返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):忽略大小写,比较字符串的内容是否相同
String concat(String str):将指定字符串连接到此字符串的结尾,等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回从beginIndex到末尾的子字符串
String substring(int beginIndex, int endIndex):返回从beginIndex到endIndex前一位的子字符串,不包括endIndex
boolean endsWith(String suffix): 判断字符串是否以指定的后缀结束
boolean startsWith(String prefix):判断字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):判断字符串在指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):判断当前字符串中是否包含指定的字符串
int indexOf(String str):返回指定子字符串在当前字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中第一次出现处的索引
int lastIndexOf(String str):返回指定子字符串在当前字符串中最后一次出现处的索引
int lastIndexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中最后一次出现处的索引
注:indexOf和lastIndexOf方法如果未查找到指定子字符串时,返回值都为-1。
String replace(char oldChar, char newChar):替换当前字符串中指定的子字符串
String[] split(String regex):根据指定的符号拆分当前字符串,然后返回一个String数组
理解String、StringBuilder和StringBuffer的更多相关文章
- String StringBuilder以及StringBuffer
例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...
- Java基础学习总结(65)——Java中的String,StringBuilder和StringBuffer比较
字符串,就是一系列字符的集合. Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的.字符 ...
- String, StringBuilder 与StringBuffer的区别与联系
1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...
- Java中String, StringBuilder和StringBuffer
Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder. 区别 三者都继承自CharSequence接口, 首先说明三者间主要区别 String字 ...
- String,StringBuilder和StringBuffer的特点和使用场景
这三个类是平时开发中经常遇到的,主要差别是运行速度和线程安全,使用起来String最方便了,另外两个稍微复杂一些. 从运行速度角度看,StringBuilder>StringBuffer> ...
- java String,StringBuilder和StringBuffer
String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...
- String,StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- String,StringBuilder和StringBuffer
String 字符串常量,由String创建的字符内容,长度是不可改变,存放字符的数组被声明为final. 实际上String类操作字符串是通过建立一个StringBuffer,然后调用append( ...
- java 常用类库:String ; StringBuilder和StringBuffer类
1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...
- String,StringBuilder 和StringBuffer区别
1. String 和字符串缓冲区的区别是: String 是一个不可变的字符序列 , 而字符串缓冲区是可变的 2. StringBuffer 是一个线程安全的可变字符序列 ; 线程安全对应的效率低 ...
随机推荐
- Merge Overlapping Intervals
refer to: https://www.algoexpert.io/questions/Merge%20Overlapping%20Intervals Problem Statement Samp ...
- 软件工程作业:个人项目—wc项目
软件工程作业:个人项目-WC项目 项目相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程 ...
- Python生态工具
Python内置小工具 1秒钟启动一个下载服务器 在实际工作中,时常会有这样的一个需求:将文件传给其他同事.将文件传给同事本身并不是一个很繁琐的工作,现在的聊天工具一般都支持文件传输.但是,如果需要传 ...
- Mysql的驱动表 被驱动表 join buffer
1.为什么小表驱动大表: for(int i=5;.......){ for(int j=1000;......) {}} 1.1如果小的循环在外层,对于数据库连接来说就只连接5次,进 ...
- 对css及css3的大致整理(查漏补缺)
- Python第四章
import datetime # 定义一个列表 mot = ["今天星期一:\n坚持下去不是因为我坚强,而是因为我别无选择.", "今天星期二:\n含泪播 ...
- 2020.6.6OO学期末总结
0.前言 本次博客是对整个java及oo学习情况的一个概略性总结,目的在于反思这半年来的学习情况和实际感受,和具体学习方面的理解和问题. 1.作业过程总结 看着自己一个学期做的所有作业,我想起的是总是 ...
- [小技巧]Win32 - VS中手动编辑RC文件
用win32进行窗口编程时,如果资源文件不妥善集中管理会一不小心会删除一些资源文件,这时再进行项目编译的时候会发现rc文件因为缺失某个资源文件导致无法打开,我们常用的rc图形编辑器等于废了. 这时就需 ...
- 单向链表&有关类和对象
// Test515.cpp: 定义控制台应用程序的入口点.// #include "stdafx.h"#include <iostream>using namespa ...
- 使用python来搭建一个简易的文件下载环境以及用droopy来实现一个文件上传环境
ubuntu在安装的时候一般都是自带python环境的,大家可以查看一下查看demo如下 用于共享的命令很简单python2: python -m SimpleHTTPServer 8888pytho ...