1、在Java中,String是个引用类型,它本身也是一个class 类。
2、Java编译器对String 有特殊处理,允许可以直接用"...”来表示一个字符串。
3、实际上字符串在string内部是通过一个char[]数组表示的,因为String太常用
? ? ?了,所以Java提供了...这种字符串字面量表示方式。4、Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private
final char[]設,以及没有任何修改char[]的方法实现的。
eg1
package com.xn.Mon;
//遍历
public class Mon02test {
public static void main(String[] args) {
String s = "床前明月光";
for(int i = 0; i < s.length(); i++) {
char c=s.charAt(i);
System.out.println(c);
}
char[] array = s.toCharArray();
for (int i = 0; i < array.length; i++) {
char c = array[i];
System.out.println(c);
}
}
}
? ? ? ?当我们想要比较两个字符串是否相同时,要特别注意,我们实际上是想比较字符串的内容
是否相同。必须使用equals()方法而不能用=关系运算符。????????从面上看,两个字符串用==和equals()比较都为true,实际上那只是Java编译器在编译期,会自动把所有相同的字符串当作一个对象放入常 量池,s1和s2的引|用地址就是相同的,结果为true 。所以,这种==比较返回true纯属巧合。换-种写法,==比较就会失败,
结论:两个字符串比较,必须总是使用equals()方法。要忽略大小写比较,使用equalsIgnoreCase()方法。
?
eg2
package com.xn.Mon;
//字符串的比较
//实现方式:String类implement实现类Comparable接口,compareTo()方法
public class Mon03 {
public static void main(String[] args) {
String s1="bcd";
String s2="bcf";
System.out.println(s1.compareTo(s2));
}
}
要在字符串中替换子串,有两种方法。
????????第一种:根据字符或字符串替换。
????????第二种:是通过正则表达式替换。
eg3
package com.xn.Mon;
public class Mon07 {
public static void main(String[] args) {
String ip="12.243.54";
//字符替换字符
String ret=ip.replace('.','*');
//字符串替换字符串
String net=ip.replace(".", "[.]");
System.out.println("原字符串:"+ip);
System.out.println("字符替换后的字符串:"+ret);
System.out.println("字符串替换后的字符串:"+net);
}
}
使用substring() 方法可以从当前字符串中,截取指定下标区间的子字符串。
?
eg4
package com.xn.Mon;
public class Mon05 {
public static void main(String[] args) {
String email="354345@qq.com";
//截取用户名
int endIndex=email.indexOf("@");
String userName=email.substring(0,endIndex);
//截取邮箱服务器
int beginIndex=endIndex+1;
endIndex=email.indexOf(".");
String host=email.substring(beginIndex,endIndex);
System.out.println("用户名:"+userName);
System.out.println("邮箱服务器:"+host);
}
}
使用trim() 方法可以移除字符串首尾空白字符。空空字符包括空格,\t? \r? n 。
注意:trim() 并没有改变字符串的内容,而是返回了一个新字符串。
????????String还提供了isEmpty() 判断字符串是否为空字符串:
eg5
package com.xn.Mon;
public class Mon06 {
public static void main(String[] args) {
//空白字符:空格 \t \n \r
String s = " \tB\tIS\t\n\r";
//去除*首位*“空白字符”
s=s.trim();
System.out.println(s);
System.out.println(s.length());
}
}
????????index0f() 方法可以从字符串的首部进行搜索,当前字符串中指定子字符串的下标
位置,返回值为int类型。如果存在,则返回该子字符串的下标位置。如果不存在,则返
回-1 ;
????????lastIndex0f()方法是从字符串的尾部进行搜索,返迥值与index0f() 方法一致;
????????startsWith()和endsWith()方法是用于判断字符串是否以指定字符串开头或结尾,
返回值为boolean类型;
????????contains()方法用于查找当前字符串中是否存在指定子字符串,返回值为boolean 类
型。
eg6
package com.xn.Mon;
//字符串的查找搜索
//index0f()方法: 从原字符串中查找目标字符串,返回第一次出现的位置
//lastIndex0f()方法: 从原字符串中查找目标字符串,返回最后一次出现的位置
//contains()方法: 判断原字符串中是否存在目标字符串
//startswith()方法: 判断原字符串是否以目标字符串开头
//endsWith()方法: 判断原字符串是否以目标字符串结尾
public class Mon04 {
public static void main(String[] args) {
// String s1="举杯邀明月";
// String target ="月";
// int index=s1.indexOf(target);
// System.out.println(index);
String s2="唧唧复唧唧木兰当户织";
String target="唧唧";
String tar="木兰";
System.out.println(s2.startsWith(target));
System.out.println(s2.endsWith(target));
System.out.println(s2.contains(tar));
String url="http://www.165.com";
if((url.startsWith("http")||(url.startsWith("https"))&&(url.endsWith(".com")||(url.endsWith(".cn"))))) {
System.out.println("合法网址");
}else {
System.out.println("");
}
}
}
要分割字符串,使用split()方法,并且传入的也是正则表达式:
?
eg7
package com.xn.Mon;
import java.util.Arrays;
public class Mon09 {
public static void main(String[] args) {
String s1= "北京#上海#南京#深圳#北京#昆明#毕节#成都";
String[] ret1=s1.split("#");
System.out.println(s1);
System.out.println(Arrays.toString(ret1));
//按照正则表达式进行分割
String s2= "北京A上海B南京C深圳DS北京E昆明F毕节G成都";
String[] ret2=s2.split("[A-Z]");
System.out.println(s2);
System.out.println(Arrays.toString(ret2));
String s3= "北京0上海66南京8深圳4北京9昆明1毕节6成都";
String[] ret3=s3.split("[0-9]");
System.out.println(s3);
System.out.println(Arrays.toString(ret3));
String s4= "北京A上海B南京C深圳D北京E昆明F毕节G成都";
String[] ret4=s4.split("[A-Z]");
System.out.println(s4);
System.out.println(Arrays.toString(ret4));
//按照正则表达式的特殊字符进行分割
String s5= "北京+上海+南京+深圳+北京+昆明+毕节+成都";
String[] ret5=s5.split("\\+");
System.out.println(s5);
System.out.println(Arrays.toString(ret5));
}
}
?8、拼接字符串
eg8
拼按字符串使用静态方法jin),它用指定的字符串连接字符事数组:
?
package com.xn.Mon;
//拼接字符串
//String.join()方法:将多个字符串元素使用指定字符串,拼接成完整的字符串
//String.format()方法:将多个数据元素按照指定格式拼接
public class Mon10 {
public static void main(String[] args) {
//传入数组
String[] arr= {"宝鸡","榆林","咸阳","杨林","铜川","汉中"};
String ret1=String.join("*", arr);
System.out.println(ret1);
//传入动态参数
String ret2=String.join("$","宝鸡","榆林","咸阳","杨林","铜川","汉中" );
System.out.println(ret2);
//String.format()
String a="小红";
int n=14;
String ret3=String.format("%s的年龄是%d岁", a,n);
System.out.println(ret3);
}
}
?????????字符串提供了format() 静态方法,可以传入其他参数,替换占位符,然后生成新的字符串。
有几个占位符,后面就传入几个参数。参数类型要和占位符一致。 我们经常用这个方法来
格式化信息。常用的占位符有:%s:表示字符串,%d表示整数,%f :浮点数,占位符还可以带格式,例如%. 2f示示两位小数。如果你不确定用啥占位符,那就始终用%s,因为%s可以显示任何数据类型。
?
eg9
//String.format()
String a="小红";
int n=14;
String ret3=String.format("%s的年龄是%d岁", a,n);
System.out.println(ret3);
要把任意基本类型或引用类型转换为字符串,可以使用静态方法value0f() 。这是一个(
重载方法,编译器会根据参数自动选择合适的方法:
?
?String和char[]类型可以互相转换。如果修改了char[] 数组,[ String 钚会改变,这因为通过new String( char[])创建新的String 实例时,它并不会直接引|用传入的char[] 数组,而是会复制一份,所以,修改外部的char[] 数组不会影响String 实例内部的char[] 数组,因为这是两个
不同的数组。
?
eg10
package com.xn.Mon;
import java.util.UUID;
public class Mon12 {
public static void main(String[] args) {
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
// 替换字符串中所有的数字,在原有数字基础上+1
StringBuilder sb = new StringBuilder(uuid);
// 遍历字符串
for (int i = 0; i < sb.length(); i++) {
// 获取每个字符
char c = sb.charAt(i);
// 判断该字符是否是数字
if (c >= '0' && c <= '9') {
// 转换成数字后,+1
int n = Integer.parseInt(String.valueOf(c));
// 0-9
n = n + 1 > 9 ? 0 : n + 1;
// 直接在当前字符串对象的内存中,完成替换
sb.replace(i, i + 1, String.valueOf(n));
}
}
System.out.println(sb);
}
}
?12、字符编码
字符编码
ASCII码:包含A-Za-z、符号,占1个字节
Unicode码:包含主流编码集,占2个字节
UTF-8码:占3个字节
eg11
eg11
package com.xn.Mon;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
//字符编码
//ASCII码:包含A-Za-z、符号,占1个字节
//Unicode码:包含主流编码集,占2个字节
//UTF-8码:占3个字节
public class Mon11 {
public static void main(String[] args) throws UnsupportedEncodingException {
// char c1 = 'A'; //占2个字节(消耗1个字节,闲置1个字节)
//charc2='中’;//占2个字节
String s1 = "A";
String s2 = "中";
String s3 = "中";
// 获取字符串 的字节数组
byte[] b1 = s1. getBytes(); //按照默认Unicode码获取字节值
byte[] b2 = s2. getBytes(); //按照默认Unicode码获取字节值
byte[] b3 = s3. getBytes("UTF-8"); //按照UTF-8码获取字节值
System.out.println("A=" + Arrays.toString(b1));
System.out.println("中=" + Arrays.toString(b2));
System.out.println("中="+ Arrays.toString(b3));
String S = " ABCD";
byte[] s = S. getBytes("UTF-8");
System.out.println("中="+ Arrays.toString(s));
}
}
小结
Java字符串String 不可变对象
字符串操作不改变原字符串内容,而是返回新字符串
常用的字符串操作:提取子串、查找、替换、大写转换等
Java使用Unicode编码表示String和char
转换编码就是将String 和byte[] 转换,要指定编码
转换为byte[] 时,始终优先考虑UTF-8编码
?