网站首页 > java教程 正文
字符串处理类:java.lang.String、java.lang.StringBuffer和java.lang.StrungBuilder
共同点
都是final修饰符修饰的类,都不允许被继承。
不同点
1、StringBuffer是线程安全,用于多线程不需要额外的同步;
2、StringBuilder是线程不安全,效率高于StringBuffer;
使用场景:
java.lang.String,适用于少量的字符串操作的情况;
java.lang.StringBuilder,适用于单线程下在字符缓冲区进行大量操作的情况;
java.lang.StringBuffer,适用多线程下在字符缓冲区进行大量操作的情况;
java.lang.String类
字符串常量池
在JVM中存在存在一个字符串常量池,用于存放特定的字符串对象,可以被共享使用。
String str1 = "abc";
String str2 = "abc";
str1和str2引用的是同一个字符串常量池里的对象,当创建一个字符串常量时,首先会在常量池中查找是否已经存在相同的字符串(通过string.equals()方法判断,如果返回true,则认为是相同的字符串);
如果存在,则直接获取其引用,不需要重新创建对象;
若不存在,则会首先创建这个对象,然后把它加入到字符串常量池中,再将它的引用返回。
由于String类是不可变类,一旦创建好后就不能修改,因此String对象可以被共享而且不会导致程序混乱。
String str3 = new String("abc");
String str4 = new String("abc");
1、str3和str4是通过new关键字创建的两个不同的对象,在内存中的地址是不同的。
2、String str3 = new String("abc")这条语句可以分解为两个过程:
1)创建对象
即new String("abc"),调用String类的构造方法,传入一个字符串常量,等价于两个操作:"abc"和new String()。
如果字符串常量池中不存在"abc",则会创建常量"abc",并添加到常量池中;
若存在则不创建,new String()会在堆中创建一个新的对象,因此str3和str4分贝指向堆中不同的对象。
2)赋值
即String str3 = ,将一个String类型的引用赋值给str3变量,这个过程不会创建新的对象。
代码
public class StringDemo {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
// true
System.out.println(str1.equals(str2));
// true
System.out.println(str1==str2);
String str3 = new String("abc");
String str4 = new String("abc");
// true
System.out.println(str1.equals(str3));
// false
System.out.println(str1==str3);
}
}
public class StringDemo2 {
public static void main(String[] args) {
// 直接引用字符串常量
String a = "直接引用字符串常量";
System.out.println("a = " + a);
// 利用构造方法实例化
String b = new String("利用构造方法实例化");
// 使用已有字符串变量实例化
String c = new String(b);
System.out.println("b = " + b);
System.out.println("c = " + c);
// 利用字符数组实例化
char[] charArray = {'t', 'i', 'm', 'e'};
String d = new String(charArray);
System.out.println("d = " + d);
char[] charArray2 = {'利', '用', '字', '符', '数', '组', '实', '例', '化'};
// 提取字符数组部分内容,从下标为4的元素开始,截取2个字符
String e = new String(charArray2, 4, 2);
System.out.println("e = " + e);
// 连接字符串
String plus = a + b + c + d + e + "!@#";
System.out.println("连接字符串 = " + plus);
// 索引字符串
char chr = plus.charAt(4);
System.out.println("字符串中索引位置为4的字符是:" + chr);
//
int charIndex = plus.indexOf("利用");
// 判断:index的值不等于-1
if (charIndex != -1) {
// 如果index不等于-1,则执行此行代码,存在
System.out.println("利用");
} else {
// 如果index等于-1,则执行此行代码,说明没有
System.out.println("利用");
}
int firstIndex = plus.indexOf("直接");
// 获取字符串中"r"第二次出现的索引位置,从第一次出现的索引位置之后开始查找
int secondIndex = plus.indexOf("直接", firstIndex + 1);
// 获取字符串中"r"第三次出现的索引位置,从第二次出现的索引位置之后开始查找
int thirdIndex = plus.indexOf("直接", secondIndex + 1);
// 输出三次获取的索引位置
System.out.println("第一次出現的索引位置是:" + firstIndex);
System.out.println("第二次出現的索引位置是:" + secondIndex);
System.out.println("第三次出現的索引位置是:" + thirdIndex);
int gIndex = plus.lastIndexOf("字符");
System.out.println("最后一次出现的位置是:" + gIndex);
// 满足0<=BeforeIndex<=13条件,在满足条件的结果集中,返回最大的数字
int BeforeIndex = plus.lastIndexOf("符", 13);
System.out.println("从索引位置13开始往回搜索,'符' 最后一次出现的位置:" + BeforeIndex);
}
}
猜你喜欢
- 2024-10-06 java基础教程之字符串的介绍,比较重要的一个知识点。
- 2024-10-06 10分钟入门Shell脚本编程(shell脚本编程工具)
- 2024-10-06 Java学习:字符串概述与特点(java中的字符串的实例方式有几种)
- 2024-10-06 使用JavaCV实现读取视频信息及自动截取封面图
- 2024-10-06 如何优雅地进行Java字符串转义?面试官:format都玩不溜,再说吧
- 2024-10-06 java string 深入解析(java string方法详解)
- 2024-10-06 Java截取新闻标题(java如何截取一段字符串)
- 2024-10-06 多学习才能多赚钱之:java取字符串前几位字符
- 2024-10-06 Java String操作工具类:StrUtil(java string.isempty)
- 2024-10-06 Java入门教程-字符串(java字符串操作常用方法有哪些)
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)