Java之字符串String,StringBuffer,StringBuilder String类:
String类即字符串类型,并不是Java的基本数据类型,但可以像基本数据类型⼀样使⽤,⽤双引号括起来进⾏声明。在Java中⽤String类的构造⽅法来创建字符串变量。
声明字符串:声明⼀个字符串就是创建⼀个字符串对象。
//可以声明单个也可以同时声明多个字符串对象,声明不赋值,这个对象就是空,也就是 String a= null;
String a;
String b,c;
创建字符串:给字符串赋值就是创建字符串的过程。
1.给字符串赋值的四种⽅法:
(1).引⽤字符串常量
String a="hi";
String b="hello",c="world";
String d;
d="hello world";
(2).利⽤构造⽅法直接实例化
// 1.
String a=new String("hello ");
// 2.
String b=new String(a);
(3).利⽤字符数组实例化
char[] charArr={'t','i','m','e'};
indexof空格算不算String a=new String(charArr);
String b=new String(charArr,0,2);//从数组第0个索引开始,取2个数
(4).利⽤字节数组实例化
2.把任何类型转换为字符串:
valueOf() ⽅法
System.out.println(String.valueOf(6)); //将6转换为字符串
3.连接字符串
+
//使⽤ + 号拼接
String a="123"+456;
String b=a+"hello";
//使⽤ += 拼接
b+="您好";
System.out.println(b);
4.获取字符串的长度:
length() ⽅法
String a="123 456 789";
//获取a的长度(包括空格)赋值给s
int s=a.length();
System.out.println(s);
5.获取指定索引位置的字符:
char() ⽅法
String str = " a new world a new start ";
System.out.println(str.charAt(3));// 取出字符串中制定索引位置的字符
6.判断⼀个字符串是否包含另⼀个字符:
contains() ⽅法
String str = " a new world a new start ";
System.out.ains("abc"));// 判断⼀个字符串是否包含另⼀个字符串
7.获取指定位置的字符返回索引:
indexOf() 获取指定位置的字符四种⽅法:
String str="we are the world";
System.out.println(str.indexOf("e"));
System.out.println(str.indexOf("e",2));//索引2之后e出现的索引
System.out.println(str.lastIndexOf("e"));
System.out.println(str.lastIndexOf("e",8));//索引8之前出现的e
8.截取字符串:
String id="123456************";
//获取第⼗五位索引到最后的数字
String e4=id.substring(15);
//获取第六位到⼗四位索引,即⽣⽇
String bir=id.substring(6,14);
System.out.println("您的⽣⽇是:"+bir);
9.判断字符串是否相等:
需要特别注意的是,如果定义两个字符串再⽤ == 去判断它们是否相等,那么他们的结果⼀定是false。
这是因为这两个字符串的值都会保存在内存的堆栈中,⾸先我们创建 name 和 dbValue 两个引⽤,然后⽤ new ⽅法在堆中创建了 String 的对象实体,并让两个引⽤指向各⾃的对象实体,然后两个对象实体⼜会分别在栈中创建字⾯值内容。name 和 dbValue 始终指向的是两个独⽴的内存区域,⽽ == 判断的是内存地址,所以⽤ == 判断字符串结果⼀定false,这和他们保存的什么样的字⾯值没有任何关系。
判断字符串相等要使⽤ equales⽅法:
equales⽅法⽐较的是两个字符串的内容
equalsIgnoreCase ⽅法:忽略⼤⼩写的⽐较⽅法
特殊情况:
如果创建的字符串不是⽤ new ⽅法创建的,⽽是直接⽤引⽤字符串常量。结果会有不同。
我们让 name 创建引⽤字符串常量 tom 的时候,Java虚拟机⾸先会在栈中创建 tom 然后会⾃动创建⼀个匿名的字符串对象指向 tom ,最后将匿名字符串对象的地址交给 name 引⽤。然后再当我们让 dbValue也引⽤常量 tom 的时候, Java虚拟机会先到栈的常量区中寻是否有相同的常量,发现有相同的常量,就直接将这个常量的匿名对象交给了dbValue引⽤。这时 name 和 dbValue 指向的就是同⼀个匿名对象,这样他们 == 返回的结果就是 true。
常量池:String 直接引⽤创建字符串的时候,Java会从常量池中这个“tom”,如果到了,他会将到的这个直接给他,如果不到则新建
如下:
10. 判断字符串的开始和结尾:
endsWith ⽅法和 startsWith⽅法
11.字符串替换
12.去除⾸尾空格和去除所有空⽩:
trim()⽅法
replaceAll("\\s","") ⽅法
13.⼤⼩写转换
toUpperCase() ⽅法
toLowerCase() ⽅法
14.字符串分割
.split()
需要注意的是不能⽤ “.” 进⾏分割,因为⽀持正则表达式,所以要⽤时应使⽤转义字符,如 “.” 应使⽤ “\\.”
15.查字符串
indexOf() ⽅法
16.格式化字符串
format⽅法
Date tim=new Date();
String str=String.format("%tF", tim);
System.out.println(tim);
System.out.println(str);
//格式化为年
System.out.println(str.format("%tY",tim));
//格式化为⽉
System.out.println(str.format("%tB",tim));
//格式化为⽇
System.out.println(str.format("%td",tim));
System.out.println(String.format("字母a: %c",'a'));
System.out.println(String.format("123+456= %d",123+456));
System.out.println(String.format("保留三位⼩数 %.3f",3.141592652545));
System.out.println(String.format("判断2<3 %b",2<3));
System.out.println(String.format("科学计数法 %e",12000000.1));
System.out.println(String.format("天才是%d%%的汗⽔和%d%%的灵感",1,99));//要注意在这种⽅法中要输出%号需要写两个%%
StringBuffer类
是线程安全的可变字符序列。⼀个类似于String的字符串缓冲区。String创建的字符串对象是不可修改的,StringBuff类创建的是可修改的字符串序列,且实体容量会随着存放的字符串增加⽽⾃动增加。
StringBuilder类
即字符串⽣成器,新创建的StringBuilder对象初始容量是16个字符,可以⾃⾏指定初始长度,也可以动态地执⾏添加、删除和插⼊等字符串的编辑操作,⼤⼤提⾼了频繁增加字符串的效率。如果附加的字符超过可容纳的长度,则StringBuilder对象将⾃动增加长度以容纳被附加的字符。
三者的关系:
在执⾏速度⽅⾯的⽐较:StringBuilder > StringBuffer > String
三者之间相互转换:
三者之间的不同之处:
String只能赋值1次,每⼀次改变内容都⽣成了⼀个新的对象,然后原有的对象引⽤了新的对象,所以说String本⾝是不可改变,每⼀次改变String的内容,都会在内存创建新的对象,⽽每⼀次⽣成新对象都会对系统性能产⽣影响,这会降低Java虚拟机的⼯作效率。如下图所⽰:
⽽StringBuilder和StringBuffer不同,每次操作都是对⾃⾝对象的操作,⽽不是⽣成新的对象,其所占空
间会随着字幅内容增加⽽增加,做⼤量修改操作时,不会因⽣成⼤量匿名对象⽽影响系统性能。如下图所⽰:
StringBuffer类:
作⽤:String虽然提供了很多API⽅法,但是始终是对字符串常量进⾏操作,不仅⽆法改变常量的值,还会占⽤⼤量内存空间。StringBuffer 类则是⼀个⾮常灵活的⼯具,节约内存空间的同时还保障了线程安全。
创建:
//创建⼀个StringBuilder类对象必须⽤new⽅法,不能像String对象那样直接引⽤字符串常量
StringBuffer sbf1=new StringBuffer(); //创建⼀个对象⽆初始值
StringBuffer sbf2=new StringBuffer("abc"); //创建⼀个对象,初始值 “abc”
StringBuffer sbf3=new StringBuffer(32); //创建⼀个对象,初始容量为32个字符
常⽤操作:
追加字符串:
append() ⽅法
StringBuffer sbf =new StringBuffer("谁将");
sbf.append("新樽"); //追加字符串
StringBuffer s1=new StringBuffer("辞旧⽉");
sbf.append(s1); //追加新的字符串中的内容
int a=2333;
sbf.append(a); //追加int型变量a
System.out.println(sbf);
修改指定索引处的字符:
setChar() ⽅法
StringBuffer sbf=new StringBuffer("谁将新樽辞旧⽉");
sbf.setCharAt(6,'⽇'); //替换索引6的字符
System.out.println(sbf);
插⼊字符串:
insert() ⽅法
StringBuffer sbf=new StringBuffer("谁将新樽辞旧⽉");
sbf.insert(2,"我的"); //在索引2插⼊
System.out.println(sbf);
字符串的反序:
reverse() ⽅法
StringBuffer sbf=new StringBuffer("谁将新樽辞旧⽉");
System.out.println(sbf);
删除⼦字符串:
delete() ⽅法
StringBuffer sbf=new StringBuffer("谁将新樽辞旧⽉");
sbf.delete(4,6);
System.out.println(sbf);
其他常⽤⽅法:
StringBuffer sbf=new StringBuffer("谁将新樽辞旧⽉");
System.out.println(sbf.length()); //获取字符串序列长度
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论