Java基础系列--07_String、StringBuffer和StringBuilder
String类
(1)字符串:字符串是常量;它们的值在创建之后不能更改,存储在堆中。
如果字符串多次赋值,其实是每次重新赋值的时候程序都先在内存中寻找已开辟的空间是否存在该值;如果找不到,再开辟新的空间存储该对象
(2)构造方法:
A:String s = new String(); //空字符序列
B:String s = new String(char[] chs); //分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
C:String s = new String(char[] chs,int index,int length); //从index到length部分生成字符串
D:String s = new String(String str);
E:String s = "hello";
String strA = "abc";
//等效于:
//char data[] = {'a', 'b', 'c'};
//String strA = new String(data);
String strB = "hello";
System.out.println(strA==strB); //false
strA = "hello";
System.out.println(strA==strB); //true
//说明strA和StrB指向的是同一个空间
(3)字符串的注意事项
A:字符串一旦被赋值,就不能改变。
注意:字符串的值不能改变,但是引用变量可以改变。
B:字符串在作为实参传递给形参时,其实是把地址的值赋给了形参,在形参修改了字符串的内容后,原字符串的内容其实是不变的。
public static void main(String[] args) {
String s = "hello"; //将"hello"的地址赋值给了s
change(s);
System.out.println(s); //hello
}
//注意这里是无返回值,因为这里的测试是不能修改s的地址值
public static void change(String s) {
s += "java";
}
C:字符串的==和equals
//String s = new String("hello")和String s = "hello"的区别。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2); //false 每一个变量new出来的地址都不相同
System.out.println(s1.equals(s2));//true String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //true String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6); //true
System.out.println(s5.equals(s6)); //true
/*
* String的equals的实现原理:
* 第一步:先判断这两个字符串的地址值是否相同(==实现)
* 相同:返回true
* 不同:
* 第二步:判断这两个字符串的长度是否相同
* 不同:返回false
* 相同:第三步:将字符串变为数组逐个进行比较
* 找到不同:立刻返回false
* 找到最后:返回true
*/
(4)成员方法
A:判断功能
boolean equals(Object obj) //判断字符串是否相同,考虑大小写
boolean equalsIgnoreCase(String str)//判断字符串是否相同,不考虑大小写
boolean contains(String str) //判断字符串是否包含str
boolean startsWith(String str) //判断字符串是否以str开头
boolean endsWith(String str) //判断字符串是否以str结尾
boolean isEmpty() //判断字符串是否为空
B:获取功能
int length() //获取字符串的长度
char charAt(int index) //获取第index位置的字符
int indexOf(int ch) //获取字符串中第一次出现ch字符的索引
int indexOf(String str) //获取字符串中第一次出现str字符串的索引位置
int indexOf(int ch,int fromIndex) //从某个位置开始获取ch字符第一次出现的索引
int indexOf(String str,int fromIndex)//从某个位置开始获取str字符串第一次出现的索引
String substring(int start) //从某个位置开始截取字符串
String substring(int start,int end) //从某个位置开始到某个位置结束截取字符串
C:转换功能
byte[] getBytes() //将字符串转换为byte数组
char[] toCharArray() //将字符串转换为char数组
static String copyValueOf(char[] chs)//将字符数组转换成字符串
static String valueOf(char[] chs) //将字符数组转换成字符串
static String valueOf(int i) //将一个int数转换成字符串
String toLowerCase() //转小写
String toUpperCase() //转大写
String concat(String str) //拼接字符串
D:其他功能
a:替换功能
String replace(char oldChar,char newChar) //将newChar全部替换OldChar,如果OldChar不存在,原字符串直接赋值给替换后字符串
String replace(String oldString,String newString)
b:切割功能
String[] split(String regex) //通过regex切割字符串,切割后会产生一个字符串数组
c:去除两端空格功能
String trim()
d:字典顺序比较功能
int compareTo(String str) //如果str比str1大的话,返回的正数
字符串的比较原理:
第一步:将两个字符串转变为char数组
第二步:逐个比较char数组中的相同元素的大小
相同:继续比较其他元素
不同:返回 第一个数组比较元素的字符减去第二个数组中的同位置元素
注意:若较短的数组长度的最后一位已经比较完了,则返回第一个数组长度减去第二个数组的长度
int compareToIgnoreCase(String str) //忽略大小写比较
因为String变量的值是不可改变的,所以在频繁操作字符串的时候,就会产生极大的垃圾空间,影响程序的运行。而Java提供了可变的字符串缓冲区StringBuffer和StringBulid解决String带来的问题。
StringBuffer
(1)线程安全的可变字符序列,字符串可以发生改变的字符串类。字符串缓冲区类。
(2)构造方法:
A:StringBuffer() //构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
B:StringBuffer(int capacity)//构造一个不带字符,但具有指定初始容量的字符串缓冲区。
C:StringBuffer(String str) //构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
(3)成员方法:
A:添加功能
public StringBuffer append(anyType varName); //在缓冲区的末尾追加
StringBuffer insert(int index,String str); //在指定索引位置添加
B:删除功能
public StringBuffer delete(int start,int end); //从start开始删除到end结束,不包括end位置的字符
StringBuffer delete(0,sb.length); //清空缓冲区
public StringBuffer deleteCharAt(int index); //删除第index位置的字符
C:替换功能
public StringBuffer replace(int start,int end, String str);//替换字符串
void setCharAt(int index ,char); //修改,把指定索引位置的值改成传入的char值
D:截取功能
public String substring(int start); //从start位置开始截取字符串
E:反转功能
public StringBuffer reverse(); //反转字符串的所有字符
F:其他常用的功能
void setLength(int len); //根据传入的len值截取缓冲区的长度
toString() //转换成String
int indexOf(str); //查找str在缓冲区第一次出现的位置
int lastIndexOf(str); //从后向前查找查找str在缓冲区第一次出现的位置
StringBulider
StringBuilder与StringBuffer其实就像是孪生兄弟,使用的方式没有什么太大的区别。但是StringBuild实例不能安全使用多线程。 如果需要同步,那么就使用StringBuffer 。
StringBuilder和StringBuffer
StringBuilder和StringBuffer都是可变的字符序列,适用于需要经常对字符串修改的操作。两者的方法的使用是一样的,区别在于多线程的安全问题。
StringBuilder和StringBuffer与String的区别
StringBuilder和StringBuffeer是可变字符序列;String是不变得,一但被初始化,就不能改变
StringBuilder和StringBuffer的区别
StringBuilder是线程不安全的,所以效率比较高;StringBuffer是线程安全的,效率相对较低(可以解决多线程同步问题)
Java基础系列--07_String、StringBuffer和StringBuilder的更多相关文章
- Java基础-String、StringBuffer、StringBuilder
看下面这段代码: public class Main { public static void main(String[] args) { String string = ""; ...
- 十四、Java基础---------String、StringBuffer、StringBuilder基本应用
在前面的博客中曾提及Java的数据类型分为基本数据类型,和引用数据类型,而String便是最常见的应用数据类型,本文将着重介绍这一引用数据类型的用法. String 字符串 String类是对 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- Java基础——java中String、StringBuffer、StringBuilder的区别
(转自:http://www.cnblogs.com/xudong-bupt/p/3961159.html) java中String.StringBuffer.StringBuilder是编程中经常使 ...
- 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!
目录 目录 string基础 Java String 类 创建字符串 StringDemo.java 文件代码: String基本用法 创建String对象的常用方法 String中常用的方法,用法如 ...
- Java基础系列2:深入理解String类
Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...
- java中String、StringBuffer、StringBuilder的区别
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
随机推荐
- 关于微信JS-SDK 分享接口的两个报错记录
一.前提: 微信测试号,用微信开发者工具测试 二.简单复述文档: 1.引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/j ...
- 聊聊Unity2018的LWRP和混合光照
0x00 前言 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了** Scripting.Assetsbundle ...
- 后端MVC和前端MVVC关系详解
MVC 是后端的分层开发概念: MVVM是前端视图层的概念,主要关注于 视图层分离,也就是说:MVVM把前端的视图层,分为了 三部分 Model, View , VM ViewModel
- javascript权威指南笔记[1-5]
1.javaScript的数据类型分为两类:原始类型和对象类型: 2.javaScript中除了数字,字符串,布尔值,null,undefined之外就是对象了: 3.对象(object)是属性(pr ...
- mysql的学习笔记(二)
1.数据类型,存储的类型. 整型 TINYINT 有符号-128到127 无符号值:0到255 1字节 SMALLINT 有符号 -32768到32767 0到65535 2字节 MEDIUMINT ...
- 个人完善的springboot拦截器
import lombok.extern.slf4j.Slf4j; import org.manage.management.permission.interceptor.LoginIntercept ...
- centos7下搜狗输入法的安装教程
相信用过centos自带的输入法的朋友都会感叹这也实在是太难用了吧,使用拼音打出来的词总是不能在前几个匹配到,即使是一些常用词也是如此,简直无法忍受跟个zz似的.吐槽完了,这里给出centos7下搜狗 ...
- 一套代码小程序&Web&Native运行的探索01
前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 并且用小程序翻写了之前一个demo:[组件化开发]前端进阶篇之如何编写可维护可升级的代码 之前一直在跟业务方打交道 ...
- java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...
- 【带着canvas去流浪】(2)绘制折线图
目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...