目录
4.通过String类的静态方法valueOf(任意数据类型)->转为字符串
2.使用StringBuilder类或者StringBuffer类
String类算是比较特殊的类型了,作为初学者我们甚至把这个引用类型时不时当成基本类型来用,而且发现,竟然差不多。然而实际呢?我们太年轻,差的真的很多,今天就来详细讲一讲到底差在哪。
一、创建字符串的四种方式
1.直接赋值
直接赋值,在堆中的常量池中创建该字符串对象
String str1 = "HelloWorld";
2.通过构造方法创建对象
在堆中创建对象,并把该对象的拷贝放到常量池中
String str2 = new String("HelloWorld");
3.通过字符数组创建对象
首先创建字符数组,并且通过构造方法传入此数组来创建对象,此对象不入常量池
char[]data=new char[]{'a','b','c'};
String str3 = new String(data);
4.通过String类的静态方法valueOf(任意数据类型)->转为字符串
String str4 = String.valueOf(15);
二、字符串比较相等
字符串比较相等采用String内置的.equals方法
若非要是用等于号(==)则遵循此规律:若引用指向常量池中的对象,则相等;否则因为指向地址不同,均不相等。
.equals方法
正常比较两个字符串的方法
String str1 = new String("Hello");
String str2 = new String("hello");
// System.out.println(str1==str2);
引用类型比较,用.equals方法
System.out.println(str1.equals(str2));
.equalsIgnoreCase方法
此方法可以忽略字符串的大小写
System.out.println(str1.equalsIgnoreCase(str2));
判空处理
当我们实际应用此方法时,要站在用户的角度考虑,用户什么牛鬼蛇神都会给你输进去,啥都不输也有可能,所以当我们涉及用户输入时,应该把准备好的字符串作为方法的调用者,避免空指针异常
// //这个变量由用户从浏览器输入
// String userName = null;
// System.out.println(userName.equals("小王"));
// //把给定的字符串放在前面,方便处理userName为空的问题
// System.out.println("小王".equals(userName));
三、常量池问题
什么是常量池
眼尖的童鞋已经发现了,上面一直在提常量池,啥是个常量池,请看图。
当我们创建一个字符串对象时,它可能会出现在常量池中或者堆中的空间。
常量池中的对象从何而来?
1.直接赋值产生
若此字面量为第一次产生,比如我想引入一个“name”字符串,那么我就直接 String name = “name”;name这个词在之前从未出现过,我就会把此字符串创建并且安放到常量池当中,但若是常量池已经存在过该字符串,那么就不会再创建新的字符串对象,而是直接引用常量池中旧的字符串对象。
2.构造方法产生
当我第一次通过构造方法产生字符串时,会在堆中和常量池中同时产生对象,也就是会产生两个对象,若不是第一次的话照旧在堆中产生新的对象。
手工入池:intern方法
调用intern方法可以将未入常量池的对象入池,并直接引用常量池中的对象。
若调用该方法发现此字符串已经存在于池中了,则返回常量池中的引用。
例子:
1.
该打印结果为true,因为全部为常量池中的同一地址引用
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1==str2);
2.
该打印结果为false,因为str1.intern() 虽然返回了常量池中的地址,但是没有接收
String str1 = new String("Hello");
str1.intern();
str1 = str1.intern();
String str2 = "Hello";
System.out.println(str1==str2);
3.
该结果为ture 因为此场景下的intern方法,由于因字符数组产生的字符串是不会入池的,所以会直接将str1的引用入池,并且str1的地址就是常量池的地址。
char[] data = new char[]{'a','b','c'};
String str1 = new String(data);
str1.intern();
String str2 = "abc";
System.out.println(str1==str2);
四、字符串的不可变性
我们通过查找String类型的源代码可以得知,String类型本身是由一个叫做value[ ]的字符数组,存在String类中,而且由final修饰并且封装,不可变,而且也没有相关的getter和setter方法。
五、修改字符串的内容
1.通过反射破坏value数组的封装
这种方法不推荐,目前来说了解即可。
2.使用StringBuilder类或者StringBuffer类
这两种类已经不是String类了
二者的区别
两种类型所包含的方法并无区别,StringBuilder的性能好,适合单线程,而StringBuffer更为安全,适合多线程。
创建方法:
有两种将String转换为StringBuilder类的方式
1.通过构造方法传入字符串
2.通过.append方法传入字符串
StringBuilder sb = new StringBuilder("hello");
sb.append("123");
若想转变回String类,则采用toString方法
String str1 = sb.toString();
System.out.println(str1);
方法使用:
1.拼接方法
sb.append("123");
2.反转方法
sb.reverse();
3.插入方法
指在索引index的位置,插入的元素
sb.insert(0,10);
4.删除方法
区域为[start,end)
sb.insert(0,10);
六、字符串的其他常见操作
1.字符串比较
比较是否相同采用.equals方法
.equalsIgnoreCase不区分字符串大小写
String类也实现了comparable接口,可以使用compareTo方法,比较两个字符串的ASCII码值
2.字符与字符串的相互转换
char->String
1.通过构造方法转换
2. 也可以转换部分字符数组内容
String->char
1.charAT方法可取出对应位置的字符
2.toCharArray可将字符串转换为字符数组
如何判断一个字符串是由纯数字组成的
直接上图 ,不多解释
3. 字符串和字节的相互转换
String->byte[]
byte会将String当前的字符编码转换为字节,且可以设定转码格式
可以设定gbk编码格式
byte[] ->String
将字节数组转换为字符串,按照byte中存储的ASCII码值转换为字符串中的字符
4.字符串的查找操作
5.字符串的替换操作
6.字符串的拆分操作
以括号中的内容进行拆分,可指定拆分最大个数
当用到特殊字符时,我们可以用\\进行转义处理
7.字符串的截取操作
如果不规定截取范围,会从指定位置截取到结尾。
或者指定截取范围,左闭右开
8.字符串的其他常用方法
写一个方法将字符串的首字母大写
利用截取方法和转换大写方法相加即可
今天的文章string类的常用方法_java基础知识分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/78462.html