(不可变字符)

常量池:

java对字符串有一个优化措施:字符串常量池(堆中)

java推荐我们使用字面量/直接量的方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象到常量池中,当使用相同字面量再创建对象时将复用常量池中的对象以减少内存开销,从而避免内存中堆积大量内容相同的字符串对象

串的字符集是什么_字符串常量_字符串子串数量

常量池内存图

串的字符集是什么_字符串常量_字符串子串数量

new ()其实是产生了2个对象在堆中,如上图

常用方法:

String str = "我爱java!";
int len = str.length();//求字符串长度方法 .length()
System.out.println(len);

String str = "    hello world   ";
str = str.trim();  //剔除字符串两边空格 .trim()
System.out.println(str);

String str = "我爱Java!";
//将字符串中英文部分全变大写 .toUpperCase()
String upper = str.toUpperCase();
System.out.println(upper);
//将字符串中英文部分全变大写 .toLowerCase()
String lower = str.toLowerCase();
System.out.println(lower);

String str = "thinking in java";
//判断以什么开头
boolean starts = str.startsWith("thi");
System.out.println(starts);
//判断以什么结尾
boolean ends = str.endsWith("a");
System.out.println(ends);

String str = "hello world";
char c = str.charAt(1);//1代表下标为1的字符
System.out.println(c);//输出e

String str = "thinking in java";
//检索in在字符串str中 开始的位置
int index = str.indexOf("in");
System.out.println(index);//2
//从下标为4的位置开始找
index = str.indexOf("in",4);
System.out.println(index);//5
//当前字符串不包含的 返回-1
index = str.indexOf("IN");
System.out.println(index);//-1
//在当前字符串中 最后一次出现的位置
int lasts = str.lastIndexOf("in");
System.out.println(lasts);//9

String str = "www.celinf.cn";
//截取下标4到10范围内的字符串
String name = str.substring(4,10);
System.out.println(name);//celinf
//一个参数 表示从该下标开始到最后
name = str.substring(4);
System.out.println(name);//celinf.cn

 int a =123;
//将int类型a 变成String类型并赋值给s1
String s1 = String.valueOf(a);//---------------静态方法 类.方法名
System.out.println(s1);
//将double类型转换成String 类型并赋值给s2
double d = 12.45;
String s2 = String.valueOf(d);
System.out.println(s2);
//任何类型和字符串连接,都会变成字符串类型(效率低下)
String s3 = a+"";
System.out.println(s3);//不建议这样转

(可变字符,效率高,线程不安全,并发处理)jdk1.5之后有

由于是不变对象,每次修改内容都要创建新的对象,因此不适合做频繁修改操作,为了解决这个问题,java提供了类。

是专门修改的一个api,内部维护了一个可变的char数组。修改都是在这个数组中进行的,内部会自动的扩容,修改速度和性能开销优秀,并且提供了修改字符串的常见的方法

注意:增删改插 使用。读 ,查看 使用 。常量池只存在字面量对象中

/*
由于String是不变对象,每次修改内容都要创建新的对象
 因此String不适合做频繁的修改操作
 */
String s = "a";
for (int i = 0; i < 1000000; i++) {
  s = s+i;//----------每次都创建新的对象放到堆中,所以很慢
}
System.out.println("执行完了"); //要等很久很久
//基于上面的原因,所以诞生了StringBuilder  提高修改字符串性能----快 
StringBuilder ss = new StringBuilder("a");
for (int i = 0; i < 100000000; i++) {
  ss.append(i);  //StringBuilder不需要创建对象,所以很快  1亿次大概5秒
}
System.out.println("执行完毕");//瞬间直接完成

常用方法

String str = "好好学习,天天上线";
//StringBuilder 需要new
StringBuilder builder = new StringBuilder(str);
//追加方法
builder.append(",学习强国天天涨!");
System.out.println(builder);
// 好好学习,天天上线,学习强国天天涨!
//替换部分内容  下标 开头包含,尾不包含
builder.replace(10,17,"丰富自己的知识储备");
System.out.println(builder);
// 好好学习,天天上线,丰富自己的知识储备!
//删除部分内容 .delet()
builder.delete(0,8);//删除下标0-7的部分
System.out.println(builder);
// ,丰富自己的知识储备!
//insert() 插入操作
builder.insert(0,"学习");//从0下标开始插入
System.out.println(builder); //最前面加入 学习 两字
// 学习,丰富自己的知识储备!
//翻转 .reverse()
builder.reverse();
System.out.println(builder); //输出内容全倒过来显示
// !备储识知的己自富丰,习学

(可变字符,效率低,线程安全,同步处理) jdk1.0就有 使用:同

三者使用场景:

如果要操作少量的数据用 ;多线程操作字符串,缓冲区下操作大量数据 ;单线程操作字符串,缓冲区下操作大量数据 。

学习记录,参考/

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!