String
* <p>字符串的优化:使用final修饰,不可被继承;字符串底层时字符数组,一旦创建,不可改变,但是字符串的引用可以重新赋值;Unicode字符
不是因为被final修饰导致的不可变,因为常量池的存在导致了不可变,
* <p>字符串常量池:JVM在内存中创建了一块区域,用来保存所有已经通过字面量(直接量)创建字符对象, 一旦再次发现通过字面量创建改字符串对象时则直接引用以前保存的,而不回再次真实创建改对象,从而节省了内存的开销.
* <p>字符串的要求是字符串为不变对象,即一旦创建对象内容不可变,若改变,则重新创建
String s1 = "123abc";
String s2 = "123abc";
System.out.println(s1 == s2);//true
s1 += "!";
System.out.println("s1 = " + s1);
System.out.println(s1 == s2);//false
* <p>创建方式不是使用自变量,用new则强制在堆中创建一个新的对象,==是根据地址值判断,equals()是根据指向的数值判断
String s3 = new String("123abc");
System.out.println(s2 == s3);//false
System.out.println(s2.equals(s3));//true
* <p>编译器有一个优化措施,当编译器发现一个计算表达式中计算符号两边都是字面量(直接量)时,会直接进行计算,并将结果编译到.class文件中.
String s4 = "123" + "abc"; //编译完成以后s4 = "123abc"
System.out.println(s2 == s4);//true
String s = "123";
String s5 = s + "abc";
System.out.println(s2 == s5);//false
----------
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);//true
---------
String s3 = new String("1") + new String("1");
//s3.intern();
String s4 = "11";
System.out.println(s3 == s4);//false
----------
String s3 = new String("1") + new String("1");
String s4 = "11";
s3.intern();
System.out.println(s3 == s4);//false
1:int length()
该方法可以返回字符串的长度(字符个数)unicode
2:int indexOf(String str)
查找给定字符串在当前字符中的位置,若当前字符串不包含给定内容,则返回值为-1;下标从0开始
* <p>int indexOf(String str , int fromIndex):从fromIndex位置开始找
* <p>int lastIndexOf(String str):字符串出现多次,返回最后一次出现的位置
//第一次出现的位置和最后一次出现的位置相等,则说明该字符串只出现一次
if(str.indexOf("in") == str.lastIndexOf("in")){
System.out.println("in只出现一次");
}else{
System.out.println("in出现不止一次");
}
3:String substring(int start ,int end)
截取当前字符串中指定范围内的字符串[start,end);在java中用来表示范围的,都是含头不含尾
//域名截取
public static String getHostName(String line){
int start = line.indexOf(".") + 1;
int end = line.indexOf(".",start);
String newLine = line.substring(start, end);
return newLine;
}
4:char charAt(int index)
返回当前字符串指定位置的字符
//检测回文
public static boolean checkReback(String str) {
for (int i = 0; i < str.length() / 2; i++) {
if (str.charAt(i) != str.charAt(str.length() - i - 1)) {
return false;
}
}
return true;
}
5:String trim()
去除一个字符串两端的空白符
6:boolean startsWith(String prefix) || boolean endsWith(String suffix)
判断当前字符是否以给定字符串开始 || 判断当前字符是否以给定字符串结束
7:String toUpperCase() || String toLowerCase()
将字符串中的英文字符全部转化为大写 ||将字符串中的英文字符全部转化为小写
====>验证码忽略大小写检查
8:valueOf()---字符串提供了一组静态的方法
可以将其他类型转化为字符串,常用的是将**基本类型**转化为字符串(valueOf()与+""相比性能好)
不是字面量就会new.new出来后地址就不同;字符串不适用于频繁修改
StringBuilder
字符串的设计关注于字符串的重用,对于修改字符串而言.效率于资源消耗都比较大,为此字符串不适合频繁修改.
* <p>对此,Java提供了一个用于专门修改字符串内容的类:
* <p>StringBuilder<p>其内部维护一个可变的char数组,所以修改都是建立在一个StringBuilder对象上完成,不会反复创建新对象,并且其还提供了便于修改字符串内容的相关方法:
* <p>增|删|改|查
* <p>toString():获取builder内部修改好的字符串
* <p>**建议**:修改字符串先创建StringBuilder
//默认创建内部表示空字符串
StringBuilder builder = new StringBuilsder();
builder.capacity() ;//16
1:append(...):向当前字符串末尾追加给定的内容
2:replace(int start, int end, String str):将当前字符串中指定范围内的内容替换为给定字符串(修改部分内容)
3:delete(int start, int end) 删除当前字符串中部分内容
4:insert(int offset, ..) 将指定内容插入到指定位置
* **建议**:StringBuilder是可变字符串,字符串的内容计算,建议采用StringBuilder实现,这样性能更好.
Java的字符串的连接过程是利用StringBuilder实现的.
String s = "AB";
String s1 = s + "DE" + 1 ;
==>String s1 = new StringBuilder(s).append("DE").append(1).toString();
String,StringBuilder,StringBuffer的异同
StringBuffer和String同时出现,老版本;StringBuilder是线程不安全的,StringBuffer是线程安全的,多线程操作同一个字符串时需要考虑使用线程安全的,线程不安全执行速度更快
正则表达式
* Java中默认全匹配,不存在部分匹配,只关心格式,不关心有效性
1:字符串支持正则表达式方法一:boolean matches(String regex):
* 使用给定的正则表达式判断验证当前字符串是否满足格式要求,
* 需要注意的是,这里的正则表啊是无论是否加了边界匹配符号(^.......$)
* 都做的是全匹配验证
* 在Java中,正则表达式中的'\'必须补上一个'\'
//邮箱匹配验证
String regex = "\\w+@\\w+(\\.[a-zA-Z]+)+";
System.out.println("79453829@qq.com".matches(regex));//true
2: 字符串支持正则表达式方法二:String[] split(String regex)
* <p>将当前字符串按照满足正则表达式的部分进行拆分,并返回拆分后的内容
末尾连续匹配拆出来的空串都不要,但是在中间就要
String line = "avx123sdfe458gaeg689gfr45qeqf32qe";
String[] arr = line.split("\\d+");
System.out.println(arr.length);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
3:字符串支持正则表达式方法三:String replaceAll(String regex,String str)
* 将当前字符串中满足正则表达式的部分替换为给定的字符串****
* replaceFirst(String regex, String replacement) 将当前字符串中第一处满足正则表达式的部分替换为给定字符串
String line = "avx123sdfe458g";
String regex = "\\d+";
String string = line.replaceAll(regex, "#NUMBLE#");
System.out.println(string);//avx#NUMBLE#sdfe#NUMBLE#g