创建字符串对象的方法
方法一:类似变量定义的方式,创建一个字符串对象“1234”,名为s1(类比“1234”与new Cat(),都是一个对象)
String s="1234";
方法二:创建一个空字符串对象,名为s3
String s3=new String();
方法三:创建一个字符串对象"1234",名为s1
String s1=new String("1234");
字符串方法(+可进行字符串连接)
1、打印输出字符串的长度,空格也是一个字符与数组的长度区分一下,.length;
String str="Java zifu\t\u0056";
System.out.println(str.length());
2、输出字符串中某个位置的字符,charAt(int index)
System.out.println(str.charAt(10));
3、求字符串子串,subString
subString(int beginIndex)获取从beginIndex位置开始到结束的子字符串
subString(int beginIndex,int endIndex)获取从beginIndex到endIndex(最后一个字符的下一个字符的索引)位置的子字符串
System.out.println(str.substring(5,9));
4、indexOf(),求字符或子串在字符串中第一次出现的位置
lastIndexOf(),求字符或子串在字符串中最后一次出现的位置
System.out.println(str.indexOf('a'));
System.out.println("字符子串\"zi\""+str.indexOf("zi"));
System.out.println(str.lastIndexOf('a'));
System.out.println(str.lastIndexOf("ava"));
5、toUpperCase()和toLowerCase()转换字符串的大小写
字符串与二进制字节数据(byte数组)转换(另一种创建String对象的方法)
将字符串转换为byte数组,并打印输出,一个字符对应一个字节,一个汉字对应三个字节,输出ascii码值
String str2=new String("123字");
byte[] arrs=str2.getBytes();
//byte[] arrs=str2.getBytes("GBK");
//增强for循环
for(int i:arrs) {
System.out.println(i);
}
//将byte数组转换成字符串,利用字节数组创建字符对象,当字符串转换成字节数组的编码形式与字节数组转换成字符串的编码形式是一致的时候
//内容输出正确
String str3=new String(arrs);
// String str3=new String(arrs,"GBK");两步都添加相同的编码形式,保持一致
System.out.println(str3);
String的不可变性:String对象一旦创建,则不能修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不变
常量池中创建一个新的字符串对象,通过赋值改变s1的引用,s1指向新的字符串,原来的字符串对象“imooc”不发生改变
String s1="imooc";
//s1不再指向“imooc”所在内存空间,而是指向了“hello imooc”
s1="hello"+s1;
System.out.println(s1);
字符串连接处理并没有改变s1的值
//字符串连接处理并没有改变s1的值
String s2="hello"+s1;
System.out.println(s2);
不管对字符串做什么处理,字符串本身都不发生变化,发生变化的其实都是通过赋值来完成的(改变字符串名的引用)
String s3=new String("hello imooc");
//生成hello存到常量池
System.out.println(s3.substring(0,5));
//s3内容没有发生变化
System.out.println(s3);
//不管对字符串做什么处理,字符串本身都不发生变化,发生变化的都是通过赋值来完成的
//==与equals方法的区别
栈存放类的引用
常量池存放字符串常量
堆中存放new创建的字符串对象*
**//equals内容
//==地址**
String s="1234";//类似变量定义的方式,创建一个字符串对象“1234”,名为s1
String s4="1234";
String s1=new String("1234");//创建一个字符串对象"1234",名为s1
String s3=new String();//创建一个空字符串对象,名为s3
String s2=s;
System.out.println(s==s4);
System.out.println(s.equals(s4));
System.out.println(s==s1);
System.out.println(s.equals(s1));
System.out.println(s==s2);
StringBuilder不具有不可变性,当频繁操作字符串时,使用StringBuilder,用String频繁操作字符串时会产生很多中间变量,而且会产生很多在变量池中被废弃的数据
StringBuilder与StringBuffer:StringBuffer是线程安全的(速度慢一些),StringBuilder则没有,StringBuilder性能略高,大部分字符串处理都是单线程,因此无需担心线程安全,使用StringBuilder
StringBuilder()在初始化空串的同时会初始化一个16个字符长的容量
StringBuilder构造方法
StringBuilder方法
1、append方法,在字符串末尾添加内容,错误写法:str=str+“dff”;“dff“一个字符串对象,而str是一个StringBuilder对象
//定义一个字符串
StringBuilder str=new StringBuilder("你好");
str.append(',');
str.append("imooc");
在内存中没有生成新的对象,也没有新的字符串常量,而是在原来的对象上进行了更改,因此append的调用与其他方法不太一样,返回的还是一个StringBuilder对象
StringBuilder str3=new StringBuilder("你好");
System.out.println(str3.append(',').append("imooc"));
StringBuilder str4=str3.append("l");
System.out.println(str4);
2、将字符串变成"你好,iMOOC"
方法一:使用delete方法删除mooc,然后再插入MOOC
insert(offset," ");对字符的间隔进行编号,第一个字符前面的间隔偏移量为0,第一个字符后面的间隔偏移量为1
方法二:使用replace方法直接替换
delete和replace方法返回的都是StringBuilder对象
方法三:String的toUpperCase
str.delete(4,8).insert(4,"MOOC");
System.out.println(str);
str.replace(4,8,"MOOC");
System.out.println(str);
String str3=str.toString();
String str4=str3.toUpperCase();
System.out.println(str4);
System.out.println(str.toString());
3、取子串,方法与String类似
//在字符串"你好,iMOOC"当中取出“你好”输出
System.out.println(str.substring(0,2));
System.out.println(str);
String和StringBuilder相互转换
StringBuilder s=new StringBuilder("1234");
s.toString();
或String str2=new String(s);
String s="1234";
StringBuilder str=new StringBuilder(s);