往期:
JAVA 修炼秘籍第一章:《痛苦的折磨》
JAVA 修炼秘籍第二章:《逐渐魔化》
JAVA 修炼秘籍第三章:《绝地反击》
JAVA 修炼秘籍第四章:《闭关修炼》
JAVA 修炼秘籍第五章:《卧薪尝胆》
JAVA 修炼秘籍第六章:《鏖战》
JAVA 修炼秘籍第七章:《面向对象编程》
JAVA修炼秘籍(番外篇)第一章:《这四道代码题,你真的会吗?》
JAVA修炼秘籍(番外篇)第二章:《图书馆管理系统》
前言:字符串广泛应用于JAVA编程中,而JAVA中的字符串属于对象,JAVA中创建了String类来操作和创建字符串。
String类有11种构造方法,创建字符串最简单的方式。
String str="Hello";
遇到"Hello"这个字符串常量时,编译器会使用该值创建一个String对象,和其他对象一样,也可以使用关键字和构造方法来进行创建。如下。
String str=new String("Hello");
char[] str1={
'H','e','l','l','o'};
String str2=new String(str1);
String创建的字符串存储在字符串常量池中,而new创建的字符串对象存储在堆上。
- 字符串常量池 ——> 常量池 ——> 公共池。
- 字符串常量池是通过一个StringTable类实现的,它是一个Hash表默认值大小长度是1009。
- 常量池中不存在重复的两个相同的对象。
String str1="Hello";
String str2="Hello";
String str3=new String("Hello");
System.out.println(str1==str2);
System.out.println(str1==str3);
- str1查看常量池中是否存在"Hello",结果为不存在,则"Hello"会在常量池中存储,str1也就指向常量池中的"Hello";
- str2查看常量池中是否存在"Hello",结果为存在,指向常量池中的"Hello";
- str3首先会在堆上new一个String类的对象,所以str3的这行代码,产生了两个对象,保存在栈中的str3与在堆上String的对象,String的对象保存的是在常量池中已经存在的"Hello"。
- 输出结果为:str1==str2输出true,str1与str2同时指向常量区的"Hello"。
- 输出结果为:str1==str3输出false,str3指向的是堆上的对象。
- 在JAVA中,字符串对象可以使用‘+’号来与其他对象进行连接。
- ‘+’号的连接过程是通过StringBuilder或StringBuffer中的append()方法进行实现的。
- 其他对象转换为字符串是通过toString()方法实现的。
String str1="Hello";
int sum=10;
String str2=str1+sum;
而实际‘+’连接符背后的方法调用是这样的。
String str1="Hello";
int sum=10;
String str2=((new StringBuffer()).append(str1).append(sum).toString());
- 每次进行连接都会隐性new一个StirngBuffer对象,然后调用append,最后再toString返回。
- 一般情况下使用不会造成代码效率的降低。
- 当循环多次进行‘+’号连接则会造成代码效率的损失。
错误示范
String str="";
for (int i = 0; i < 100; i++) {
str=str+i;
}
System.out.println(str);
字符串每进行一次连接都会隐式创建一个StringBuffer对象。
- 上面说到,当直接进行双引号声明出来的String对象会直接存储在常量池中。
- 而通过new一个String对象,来进行声明的String对象则会存储在堆中。
- 不是用双引号声明的String对象,可以使用intern方法。
- intern作用是将当前字符串与常量池中已经存在的对象进行比较,如果存在返回当前字符串,如果不存在,将当前字符串存储到常量池中。
String str2=new String("He")+new String("llo");
str2.intern();
String str1="Hello";
System.out.println(str1==str2);
此时输出结果为true。
String str="abcde";
int len=str.length();
String str="abcde";
char ch=str.charAt(3);
System.out.println(ch);
String str1="abcdef";
String str2=str1.substring(2);
System.out.println(str2);
String str1="abcdef";
String str2=str1.substring(2,4);
System.out.println(str2);
String str1="abcdef";
String str2="ABCDEF";
System.out.println(str1.compareTo(str2));
String str1="abcdef";
String str2="ABCDEF";
System.out.println(str1.compareToIgnoreCase(str2));
String str1="abcdef";
String str2="ABCDEF";
System.out.println(str1.equals(str2));
String str1="abcdef";
String str2="ABCDEF";
System.out.println(str1.equalsIgnoreCase(str2));
String str1="abcdef";
String str2="ABCDEF";
System.out.println(str1.concat(str2));
String str1="abcdef";
System.out.println(str1.indexOf(99));
System.out.println(str1.indexOf("cde"));
String str1="abcdbc";
System.out.println(str1.indexOf("bc",3));
String str1="abcdefa";
System.out.println(str1.lastIndexOf('a'));
String str1="abcdefa";
System.out.println(str1.lastIndexOf('a',4));
String str1="ABCDEFG";
System.out.println(str1.toLowerCase());
String str1="abcdefg";
System.out.println(str1.toUpperCase());
String str1="abadafa";
System.out.println(str1.replace('a','c'));
String str1="abadafa";
System.out.println(str1.replaceFirst("ada","cdc"));
String str1="abadafada";
System.out.println(str1.replaceAll("ada","cdc"));
String str1=" aa aa ";
System.out.println(str1.trim());
String str1="XXOO";
String str2="XX";
System.out.println(str1.contains(str2));
String str1="aXaXaOaOa";
String[] str3=new String[10];
str3=str1.split("X");
for (String s: str3) {
System.out.println(s);
}
parse… 需要转什么类型就在…填写什么类型的包装类。
String类中提供了String valueOf()方法,用于将基本类型转换为字符串类型。