- String
package com.itheima.CommonAPI;
/*
*字符串的特点
* 1.字符串的内容用不可变
* 2.正因为字符串不可改变所以字符串是可以共享使用的
* 3.字符串效果上相当于char[]字符型数组,底层实际上是byte[]字节数组
*
* 创建字符串的常见的3+1中方式
* 三种构造方法
* public String():创建一个空白字符串,不含有任何内容
* public String(char[] array) 根据字符数组的内容,来创建相应的字符串
* public String(byte[] array) 根据字节数组的内容,来创建相应的字符串
* 一种直接创建
* String str2 = "Hello world"
* 注意:直接写上双引号,就是字符串对象
* */
/*
* 字符串常量池的注意事项
* 双引号直接写的字符串在常量池中,常量池是在堆中的,新new的不再池中
* ==对于引用类型来说比较的是地址值,对于基本类型来说比较的是数值大小
* */
/*
* ==是进行地址值的比较,如果确实需要字符串的内容比较,可以使用两个方法
* public boolean equals(Object obj),参数可以是任何对象,只有参数是一个字符串并且内容相同的时候才会给一个true
* public boolean equalsIgnoreCase(Object obj),忽略大小写进行比较
* */
public class StringTest {
public static void main(String[] args) {
//使用空参构造
String str1 = new String();
System.out.println(str1);
//使用字符数组
char[] charArray = {'A','B','C'};
String str2 = new String(charArray);
System.out.println(str2);
//使用字节数组
byte[] charArray1 = {97,98,99};
String str3 = new String(charArray1);
System.out.println(str3);
//进行equals的使用判断
String str4 = "Hello";
String str5 = "Hello";
char[] charArray2 = {'H','e','l','l','o'};
String str6 = new String(charArray2);
System.out.println(str4.equals(str5)); //true
System.out.println(str4.equals(str6));//true
System.out.println(str5.equals(str6));//true
//进行==的判断
System.out.println(str4==str5);//true
System.out.println(str4==str6);//false 下边附上内存分布图
System.out.println(str6==str5);//false
//注意equals()具有对称性,也就是说a.equals(b)和b.equals(a)是一样的
//但是遇到一个常量一个变量的时候我们推荐使用常量.equals(变量),常量在前面
String str7 = "hello";
//这是为什么呢,如果说str7是一个null值,那么我们推荐的写法中出现的是false
//但是我们不推荐的写法中会出现空指针异常
System.out.println("hello".equals(str7));//推荐使用这种
System.out.println(str7.equals("hello"));//不推荐
String str9 = "Java";
String str10 = "java";
System.out.println(str9.equals(str10));//严格区分大小写
System.out.println(str9.equalsIgnoreCase(str10));//不区分大小写
/*
* String中常用的方法
* 1.public int length() 获得当前字符串的字符个数,即字符串的长度
* 2.public String concat(String str) 将当前字符串和参数字符串拼接成为返回值新的字符串
* 3.public char charAt(int index) 获取指定索引位置的单个字符
* 4.public int indexOf(String str) 查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值
*
* */
//连接字符串
String str11 = "Hello";
String str12 = "World";//字符串是常量,每String一个都是一个新的常量比如说str13
String str13 = str11.concat(str12);
System.out.println(str13);
//获取参数位置所在的字符
char c = str11.charAt(2);
System.out.println(c);
//查找参数字符串
int or = str12.indexOf("or");
System.out.println(or);
/*
* 截取字符串
* public String substring(int index),截取从参数到末尾,返回新的字符串
* public String substring(int begin,int end) 返回从begin到end之间的字符串,左闭右开
* */
String str14 = "Hello";
String substring = str14.substring(2);
System.out.println(substring);
String substring1 = str14.substring(1, 3);
System.out.println(substring1);
//字符串的内容变了吗,没有变呀,str8保存的实际上是地址值,改变的是地址值,但是字符串的内容没有变化
//右边是两个字符串,内容并没有改变的
String str8 = "asd";
System.out.println(str8); //asd
str8 = "fgh";
System.out.println(str8);//fgh
/*
* 字符串转换相关的方法
* 1.public char[] toCharArray() 将当前字符串转换成字符数组作为返回值
* 2.public byte[] getBytes() 获得当前字符串底层的字节数组
* 3.public String replace(CharSequence oldString,CharSequence newString);
* 将所有出现的老字符串替换成新的字符串,返回替换之后的新字符串
* */
String str15 = "Hello";
char[] chars = str15.toCharArray();
System.out.println(chars[0]);
byte[] bytes = str15.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
}
String str16 = "how do you do";
String o = str16.replace("o", "*");
System.out.println(str16);
System.out.println(o);
/*分割字符串的方法
* public String[] split(String regex) 按照参数的规则,将字符串切分成若干个字符串
*注意!!!!如果是按照英文句号来切分的话".",必须要写成"\\."才可以
*
* */
String str17 = "aaa,bbb,ccc";
String[] split = str17.split(",");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
}
}