使用java.lang.String类
1 .概述
String:字符串由对“”表示。
1 .如果1.String声明为final,则不能继承
2.String实现了序列化接口。 指示字符串支持序列化。
实现了Comparable接口。 指示String可以比较大小
3 .在字符串内部,定义了用于存储字符串数据的final char[] value
4 .字面方法(与new为字符串赋值不同,此时的字符串值在字符串常量池中声明)。
5 .字符串常量池不存储相同内容的字符串(与字符串类的equals )进行比较并返回true )。
2 .字符串的偏差
2.1说明
1 .重新赋值字符串时,必须改写指定的内存区域,不能使用原value赋值。
2 .对现有字符串执行合并操作时,也必须重新指定内存空间分配,不能使用原始值分配值。
String的replace ) )方法来修改指定的字符或字符串时,也必须重新指定内存空间并赋值,不能在原始value中赋值。
2.2代码示例
String s1=“abc”; //字面量的定义方法
String s2=“abc”;
S1=“hello”
system.out.println(S1==S2; 比较//s1和s2的地址值
system.out.println(S1; //hello
system.out.println(S2; //abc
system.out.println (' * * * * * * * * * * * * * * * * * * * ' );
String s3=“abc”;
s3 =“def”
system.out.println(S3; //abcdef
system.out.println(S2;
system.out.println (' * * * * * * * * * * * * * * * * * * * ' );
String s4=“abc”;
string S5=S4.replace (‘a’、‘m’;
system.out.println(S4; //abc
system.out.println(S5; //mbc
2.3图标
3 .字符串实例化的不同方法
3.1方式说明
方式一:用字面量定义的方式
方式2 :通过new构造函数的方式
3.2代码示例
//字面量定义的方式:此时的s1和s2的数据javaEE在方法区域的字符串常量池中声明。
String s1=“javaEE”
String s2=“javaEE”
//new构造函数方式:中,这时的s3和s4保持的地址值是在堆区域中创建数据空闲后的对应地址值。
stringS3=newstring(「javaee " );
stringS4=newstring(「javaee " );
system.out.println(S1==S2;//真
system.out.println(S1==S3 ); //false
system.out.println(S1==S4 ); //false
system.out.println(S3==S4 ); //false
3.3问题
strings=newstring(「ABC”); 方法创建了对象,在内存中创建了多少对象?
两个:是堆区域中的new结构,另一个是与char[]相对应的常量池中的数据。 “abc”
3.4图标
字符串拼接方式分配的比较
4.1说明
1 .常量和常量拼接的结果在常量池中。 常量池中不存在内容相同的常量。
2 .如果其中一个是变量,结果就在山里。
3 .缝合结果为intern (调用方法时,返回值位于常量池中
4.2代码示例
String s1=“javaEE”
string S2=" Hadoop " string S3=" javaee Hadoop "
strings4=" javaee " " Hadoop "
String s5=s1 “hadoop”
strings6=“javaee”S2;
String s7=s1 s2;
system.out.println(S3==S4 );//真
system.out.println(S3==S5 ); //false
system.out.println(S3==S6 ); //false
system.out.println(S3==S7 ); //false
system.out.println(S5==S6 ); //false
system.out.println(S5==S7 ); //false
系统
.out.println(s6 == s7);//falseString s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”
System.out.println(s3 == s8);//true
String s1 = “javaEEhadoop”;
String s2 = “javaEE”;
String s3 = s2 + “hadoop”;
System.out.println(s1 == s3);//false
final String s4 = “javaEE”;//s4:常量
String s5 = s4 + “hadoop”;
System.out.println(s1 == s5);//true
5.常用方法:
int length():返回字符串的长度: return value.length
char charAt(int index): 返回某索引处的字符return value[index]
boolean isEmpty():判断是否是空字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将 String 中的所字符转换为小写
String toUpperCase():使用默认语言环境,将 String 中的所字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
替换:
String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
匹配:
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
切片:
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
String与其它结构的转换
6.1 与基本数据类型、包装类之间的转换
String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
@Test
public void test1(){
String str1 = “123”;
// int num = (int)str1;//错误的
int num = Integer.parseInt(str1);
}
6.2 与字符数组之间的转换
String --> char[]:调用String的toCharArray()
char[] --> String:调用String的构造器
@Test
public void test2(){
String str1 = “abc123”; //题目: a21cb3
}
6.3 与字节数组之间的转换
编码:String --> byte[]:调用String的getBytes()
解码:byte[] --> String:调用String的构造器
编码:字符串 -->字节 (看得懂 —>看不懂的二进制数据)
解码:编码的逆过程,字节 --> 字符串 (看不懂的二进制数据 —> 看得懂
说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。
@Test
public void test3() throws UnsupportedEncodingException {
String str1 = “abc123中国”;
byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码。
System.out.println(Arrays.toString(bytes));
}
6.4 与StringBuffer、StringBuilder之间的转换
String -->StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器
StringBuffer、StringBuilder -->String:①调用String构造器;②StringBuffer、StringBuilder的toString()
7. JVM中字符串常量池存放位置说明:
jdk 1.6 (jdk 6.0 ,java 6.0):字符串常量池存储在方法区(永久区)
jdk 1.7:字符串常量池存储在堆空间
jdk 1.8:字符串常量池存储在方法区(元空间)
1)模拟一个trim方法,去除字符串两端的空格。
2)将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
3)获取一个字符串在另一个字符串中出现的次数。
比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数
4)获取两个字符串中最大相同子串。比如:
str1 = "abcwerthelloyuiodef“;str2 = “cvhellobnm”
提示:将短的那个串进行长度依次递减的子串与较长的串比较。
5)对字符串中字符进行自然顺序排序。
提示:
1字符串变成字符数组。
2对数组排序,择,冒泡,Arrays.sort();
3将排序后的数组变成字符串。