String常用方法
案例:使用String类常用方法完成字符串处理
要求:
- 定义一个字符串"abcdefg"
- 取出子串cde并转换为大写
- 将DE替换为MM
- 最后得到结果CMM
StringDemo.java
package com.demo.day7.wrap;
public class StringDemo {
/*
* 案例:使用String类常用方法完成字符串处理
* 要求:
* 定义一个字符串"abcdefg"
* 取出子串cde并转换为大写
* 将DE替换为MM
* 最后得到结果CMM
*/
public static void main(String[] args) {
// 1定义一个字符串
String str="abcdefg";
//2取出子串cde substring(字符串开始位置,结束位置);
String str1=str.substring(2, 5);
//将cde转换成大写的 oUpperCase();
String str2=str1.toUpperCase();
//将DE替换成MM
String str3=str2.substring(0, 1)+"MM";
System.out.println("得到结果为"+str3);
}
}
输出结果:
得到结果为CMM
字符串和byte数组之间相互转换
网络上都是以二进制进行传输的,所以要将String类型转换成byte数组。
package com.demo.day7.wrap;
public class Byte {
public static void main(String[] args) {
//字符串和数组之间的相互转换
//1.定义一个字符串
String str=new String("JAVA 编程 基础");
//2.将字符串转换成byte数组,并打印输出
byte[] arr=str.getBytes();
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println();//换行
//将byte数组转换成字符串
String str1=new String(arr);
System.out.println(str1);
}
}
输出结果:
74 65 86 65 32 -25 -68 -106 -25 -88 -117 32 -27 -97 -70 -25 -95 -128
JAVA 编程 基础
String 类的equals和 == 的区别
equals:判断内容是否相同
等于运算符 ==:判断地址是否相同
代码示例:
package com.demo.day7.wrap;
public class EqualsDemo {
public static void main(String[] args) {
// String类里equals和==的区别
//1创建3个字符串
String str1="hello";
String str2="hello";
String str3=new String("hello");
String str4=new String("hello");
char[] str5= {'h','e','l','l','o'};
System.out.println("str1和str2的内容相同"+(str1.equals(str2)));
System.out.println("str1和str3的内容相同"+(str1.equals(str3)));
System.out.println("====================");
System.out.println("str1和str2的地址相同"+(str1==(str2)));
System.out.println("str1和str3的地址相同"+(str1==(str3)));
System.out.println("====================");
System.out.println("str3和str4的内容相同"+(str3.equals(str4)));
System.out.println("str3和str5的内容相同"+(str3.equals(str5)));
System.out.println("str1和str5的内容相同"+(str1.equals(str5)));
}
}
输出结果:
str1和str2的内容相同true
str1和str3的内容相同true
====================
str1和str2的地址相同true
str1和str3的地址相同false
====================
str3和str4的内容相同true
str3和str5的内容相同false
str1和str5的内容相同false
分析:
字符串的不可变性
- String对象一旦创建,则不可能修改,是不可变的
- 所谓的修改其实是创建新的对象,所指的内存 空间不变
StringBuilder的概述
String 与StringBuilder的区别
String:具有不可变性,会产生很多中间变量,在常量池中产生很多废弃的数据
StringBuilder:不具备,可以避免String的情况
频繁操作字符串的时候:建议使用StringBuilder
StringBuiilder 和StringBuffer区别
二者基本相似,建议用StringBuilder
StringBuffer是线程安全的,线程安全相对没有的速度慢一些
单线程:使用StringBuilder
StringBuilder例子
package com.demo.day7.wrap;
public class StringDemo2 {
/*
* 定义一个字符串,利用StringBuilder完成如下效果
* 效果图:
* 欢迎来到java世界
* 删除插入后:你好,java世界
* 替换后:欢迎来到java世界
*/
public static void main(String[] args) {
// 定义一个字符串
StringBuilder str=new StringBuilder("欢迎来到java世界");
//删除插入后:你好,java世界
str.delete(0, 4);//删除0-3的内容
str.insert(0, "你好,");
//等价 str.delete(0, 4).insert(0, "你好,");
System.out.println(str);
//替换后:欢迎来到java世界
str.replace(0, 3, "欢迎来到");
System.out.println(str);
}
}
输出:
你好,java世界
欢迎来到java世界
Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
- 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
另外,有时候我们会这样对字符串进行赋值
String str="abc"+"de";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
String str="abcde";
是完全一样的,所以会很快,而如果写成下面这种形式
String str1="abc";
String str2="de";
String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。
2. 再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
3. 总结一下
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况