第一章.String
1.String介绍
1.1Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现
凡是带双引号的,都是String 的 对象
1.2字符串是常量;它们的值在创建之后不能更改
String s = "hello"
s+="world"
1.3因为 String 对象是不可变的,所以可以共享
String s1 = "abc"
String s2 = "abc"
2.String的实现原理
2.1.String的底层其实是一个被final修饰的数组,这个数组保存了字符串内容中的每一个字符
2.2.注意:
jdk8:底层是一个被final修饰的char数组
private final char[] values;
jdk9:底层是一个被final修饰的byte数组
private final byte[] value
2.3.为啥由char数组改成了byte数组:节省内存资源
char类型数据占内存2个字节
byte类型数据占内存1个字节
3.String的创建
3.1.String()-> 根据无参构造创建String对象
3.2.String(String s)->根据字符串创建String对象
3.3.String(char[] chars) -> 根据char数组创建String对象
1.String s = new String("abc")共有几个对象? 2个
第一个:abc
第二个:new String
2.String s = new String("abc")共创建了几个对象? 1个或2个
a.如果在new String之前abc已经创建出来了,那么针对这句话就创建了一个,就是new String
b.如果在new String之前 abc 没有创建出来,那么针对这句话就创建了两个,一个是先创建abc,第二个是new
4.字符串常见问题
public class Demo{
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello"+"world";
String s5 = s1+"world";
String s6 = s1+s2;
System.out.println(s3==s4);//true
System.out.println(s3==s5);//false
System.out.println(s5==s6);//false
}
}
1.拼接字符串的时候,如果之前有这个字符串,并且拼接的时候等号右边都是字符串字面值,不会产生新对象
2.拼接字符串的时候等号右边一旦有变量参数,就会产生新的字符串对象
第二章.String的方法
1.判断方法
boolean equals(String s) -> 比较字符串内容
boolean equalsIgnoreCase(String s) -> 比较字符串内容,忽略大小写
public static void main(String[] args) {
String s1 = "abcdefg";
String s2 = new String("abcdefg");
String s3 = "ABCDEFG";
//boolean equals(String s) -> 比较字符串内容
System.out.println(s1.equals(s2));
//boolean equalsIgnoreCase(String s) -> 比较字符串内容,忽略大小写
System.out.println(s1.equalsIgnoreCase(s3));
}
2.获取方法
int length() -> 获取字符串长度
String concat(String s)-> 字符串拼接,返回新串儿
char charAt(int index) -> 根据索引获取对应的字符
int indexOf(String s) -> 获取指定字符串在大字符串中第一次出现的索引位置
String subString(int beginIndex) -> 截取字符串,从指定索引开始截取到最后,返回新串儿
String subString(int beginIndex,int endIndex) -> 截取字符串,从beginIndex开始到endIndex结束
含头不含尾,返回新串儿
public static void main(String[] args) {
String s = "abcdefg";
//int length() -> 获取字符串长度
int len = s.length();
System.out.println("len = " + len);
//String concat(String s)-> 字符串拼接,返回新串儿
String newStr = s.concat("hahaha");
System.out.println("newStr = " + newStr);
//char charAt(int index) -> 根据索引获取对应的字符
char data1 = s.charAt(0);
System.out.println("data1 = " + data1);
//int indexOf(String s) -> 获取指定字符串在大字符串中第一次出现的索引位置
int index = s.indexOf("c");
System.out.println("index = " + index);
//String subString(int beginIndex) -> 截取字符串,从指定索引开始截取到最后,返回新串儿
String newStr2 = s.substring(2);
System.out.println("newStr2 = " + newStr2);
//String subString(int beginIndex,int endIndex) -> 截取字符串,从beginIndex开始到endIndex结束 含头不含尾,返回新串儿
String newStr3 = s.substring(0, 3);
System.out.println("newStr3 = " + newStr3);
}
3.转换方法
1.char[] toCharArray() -> 将字符串转成char数组
2.byte[] getBytes() -> 将字符串转成byte数组
3.String replace(CharSequence c1,CharSequence c2)-> 替换字符
CharSequence->String的接口
4.byte[] getBytes(String charsetName) -> 按照指定的编码将字符串转成byte数组
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "abcdefg";
//1.char[] toCharArray() -> 将字符串转成char数组
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
System.out.println("========================");
//2.byte[] getBytes() -> 将字符串转成byte数组
byte[] bytes = s.getBytes();
System.out.println(Arrays.toString(bytes));
//3.String replace(CharSequence c1,CharSequence c2)-> 替换字符 CharSequence->String的接口
String newStr = s.replace("a", "z");
System.out.println("newStr = " + newStr);
System.out.println("========================");
//4.byte[] getBytes(String charsetName) -> 按照指定的编码将字符串转成byte数组->编码不区分大小写
byte[] bytes1 = "你".getBytes();
System.out.println(Arrays.toString(bytes1));
}
4.分割方法
String[] split(String regex)->按照指定的规则分割字符串
下面案例中的用"."去分割需要借助转义字符"\",括号中的内容是正则表达式,而"."在正则表达式中代表通配符
public static void main(String[] args) {
String s = "abc,java,haha";
String[] arr = s.split(",");
System.out.println(Arrays.toString(arr));
System.out.println("====================");
String s1 = "haha.java";
String[] arr2 = s1.split("\\.");
System.out.println(Arrays.toString(arr2));
}
5.其他方法
boolean contains(CharSequence s) -> 判断字符串中是否包含指定的串儿
boolean endsWith(String suffix) -> 判断字符串是否以指定的串儿结尾
boolean startsWith(String s) -> 判断字符串是否以指定的串儿开头
String toLowerCase() 将字符串转成小写
String toUpperCase()将字符串转成大写
String trim()去掉字符串两端空格,中间空格不能去
public static void main(String[] args) {
//boolean contains(CharSequence s) -> 判断字符串中是否包含指定的串儿
boolean result01 = "abcdefg".contains("g");
System.out.println("result01 = " + result01);
//boolean endsWith(String suffix) -> 判断字符串是否以指定的串儿结尾
boolean result02 = "abcdefg".endsWith("g");
System.out.println("result02 = " + result02);
//boolean startsWith(String s) -> 判断字符串是否以指定的串儿开头
boolean result03 = "abcdefg".startsWith("a");
System.out.println("result03 = " + result03);
//String toLowerCase() 将字符串转成小写
String s = "avsdfaEWRWEREW".toLowerCase();
System.out.println("s = " + s);
//String toUpperCase()将字符串转成大写
String s1 = "fadsfad".toUpperCase();
System.out.println("s1 = " + s1);
//String trim()去掉字符串两端空格,中间空格不能去
String s3 = " a b c d ";
System.out.println(s3);
String trim = s3.trim();
System.out.println(trim);
String newStr = s3.replace(" ", "");
System.out.println("newStr = " + newStr);
}
第三章.String新特性_文本块
在Java中,通常需要使用String类型表达HTML,XML,SQL或JSON等格式的字符串,在进行字符串赋值时需要进行转义和连接操作,然后才能编译该代码,这种表达方式难以阅读并且难以维护。
文本块就是指多行字符串,例如一段格式化后的XML、JSON等。而有了文本块以后,用户不需要转义,Java能自动搞定。因此,文本块将提高Java程序的可读性和可写性。
"""
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
使用“”“作为文本块的开始符和结束符,在其中就可以放置多行的字符串,不需要进行任何转义。
第四章.StringBuilder类
1.StringBuilder的介绍
String拼接字符串每拼接一次都会产生一个新的字符串对象,如果拼接次数多了,太占用内存了,而且效率比较低,所以我们要学StringBuilder来拼接字符串
StringBuilder的特点:
a.StringBuilder底层是一个没有被final修饰的byte数组,数组的地址值可以改变的
b.StringBuilder底层默认自带长度为16的缓冲区(数组),字符串拼接之后会自动放到这个缓冲区中,不会随意产生新对象
c.如果拼接的字符串超过了16,会自动扩容(创建新数组,指定新容量,将老数组中的元素复制到新数组中,然后将新数组的地址值给老数组)
d.默认扩容:2倍+2
扩容机制详解:
a.如果一次性拼接的字符个数,没有超过默认的2倍+2,那么扩容的时候就遵循默认扩容容量->2倍+2
b.如果一次性拼接的字符个数,超出了默认的2倍+2,那么扩容的时候就按照实际的存储字符个数来扩容
2.StringBuilder的使用
1.StringBuilder append(任意类型数据)-> 字符串拼接,返回的是StringBuilder自己
2.StringBuilder reverse() -> 字符串翻转,返回是StringBuilder自己
3.String toString() -> 将StringBuilder对象转成String对象------我们用StringBuilder主要是为了拼接字符串,拼完之后,我们需要调用String中的方法处理拼接好的字符串,所以我们需要将StringBuiler对象转成String对象,调用String中的方法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String data = sc.next();//翻转之前的字符串
StringBuilder sb = new StringBuilder(data);
sb.reverse();
String s = sb.toString();//翻转之后的字符串
if (data.equals(s)){
System.out.println("是回文内容");
}else{
System.out.println("不是回文内容");
}
}