一、常见的构造 String 的方式
//方式一
String str = "Hello Bit";
//方式二
String str2 = new String("Hello Bit");
//方式三
char[] array = {'a', 'b', 'c'}; String str3 = new String(array)
二、字符串比较
① 比较地址
例1:
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
//执行结果 true
例2:
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果 false
② 比较字符串内容
必须采用String类提供的equals方法
String str1 = new String("Hello");
String str2 = new String("Hello"); System.out.println(str1.equals(str2)); //System.out.println(str2.equals(str1));
// 或者这样写也行
// 执行结果 true
③比较大小
String str1 = "Hello";
String str2 = "joosd";
System.out.println(str1.compareTo(str2));
注意
常量在编译时就已经编译好了
-
String str4=“abc”+“def”+360;
编译时一个对象:编译时就已经是abcdef360
“abc”+“def”:字符常量
360:常量 -
int a =360;
String str4=“abc”+“def”+a;
编译时2个对象:”abcdef”拼接好产生一个对象;此时a是一个变量,拼接时需要在产生一个对象;
面试题:请解释String类中两种对象实例化的区别
1.直接赋值:只会开辟一 块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2.构造方法:会开辟两块堆内存空间,其中-块成为垃圾空间,不会自动保存在对象池中,可以使用intern0方法手工入池。
String str="abcdef";//放在常量池
String str2=new String("abcdef").intern();
(1)常量池当中存在 返回常量池当中字符串对象的地址;
char[] array = {'a','b','c','d','e','f'};
String str3=new String(array).intern();
(2) 如果常量池中不存在,那么在常量池中生成该对象的引用
String str="abcdef";
System.out.println(str==str3);//true
字符串是一种不可变对象. 它的内容不可改变
需要修改字符串:
方法1:
【str.substring(1):提取一个子串:从1号下标开始 ello】
方法2:反射
指的是程序运行过程中, 获取/修改某个对象的详细信息(类型信息, 属性信息等), 相当于让一个对象更好的 “认清自己” .
三、字符, 字节与字符串
1、字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换.
(1) 获取指定位置的字符
String str = "hello" ; System.out.println(str.charAt(0));
// 下标从 0 开始
// 执行结果 h
(2)字符串与字符数组的转换
a.数组转化为字符串
b.字符串转化为数组
方法一:
方法二:
2、字节与字符串
例:实现字符串与字节数组的转换处理
String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) { System.out.print(data[i]+" "); }
// byte[] 转 String
System.out.println(new String(data));
【注意】
1.byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合 针对二进制数据来操作.
2.char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
四、字符串常见操作
1.字符串比较
代码示例: 不区分大小写比较
String str1 = "hello" ; String str2 = "Hello" ; System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
在String类中compareTo()方法是一个非常重要的方法,一个可以区分大小关系的方法,该方法返回一个整型,该数据会根据大小关系返回三类内 容:
2 .字符串查找
例1:contains()
String str = "helloworld" ;
System.out.println(str.contains("world")); // true
例2:使用indexOf()方法进行位置查找
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到 if
(str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}
①.indexOf效率略高于contains(contains底层调用indexOf)
②.使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置
例: 使用indexOf()的注意点
String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2
System.out.println(str.indexOf("l",5)); // 8
System.out.println(str.lastIndexOf("l")); // 8 从后往前找(默认从最后一个元素开始
在进行查找的时候往往会判断开头或结尾:
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true 判断是否从指定字符串开头
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true
3.字符串替换
例:字符串的替换
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));
注意: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.
4.字符串拆分
例:实现字符串的拆分
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) { //输出数组
System.out.println(s);
}
String str = "ab-cd-ef";//数组接收
String[] strings = str.split("-");//用-分组
System.out.println(Arrays.toString(strings));//输出数组
例:部分拆分
String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}
String str = "ab-cd-ef";
String[] strings=str.split("-",2);
//最多分成两组 优先分组ab 后面为一组
例:拆分IP地址
字符" | " , " * " , “+” 都得加上转义字符,前面加上"" , 而如果是"",那么就得写成"\ \"
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
//第一个\表示将后面的一个\转化为真正的\ 而\.才能变为.
for(String s: result) {
System.out.println(s);
}
例:多次拆分
String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++)
{
String[] temp = result[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}
5.字符串截取
例:
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
注意:
- 索引从0开始
- 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
6.其他操作方法
String str = " abc def ";
str = str.trim();
System.out.println(str);//删除空格
String str1 = " abc def ";
str1 = str1.toLowerCase();
System.out.println(str1);//变成大写
String str2 = " abc def ";
str2 = str2.concat("hello");
System.out.println(str2);//拼接
}
public static void main(String[] args) {
String str="";//空串
String str1=null;//空指针引用
if(str1.isEmpty()){
System.out.println("abcd");
}
if(str.isEmpty()) {
System.out.println("abcd");//空指针异常
}
}
7. StringBuffer 和 StringBuilder
String和StringBuffer大的区别在于:
String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的 情况考虑使用StingBuffer。
注意:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuffer: 利用StringBuffer的构造方法append()方法
StringBuffer a = new StringBuffer("abcdef");
a.append("JAVA");//拼接
System.out.println(a);
在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法
StringBuffer变为String: 调用toString()方法。
StringBuilder b = new StringBuilder();
b.append("abcde");
b.append("gh");
String s=b.toString();
//把StringBuilder类型转化为String
System.out.println(s);
请解释String、StringBuffer、StringBuilder的区别:
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2.StringBuffer与StringBuilder大部分功能是相似的 StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作.