String类构造器
String s=“www”;
www是一个String匿名对象
任何字符串常量其实是String匿名对象
equals:把常量写在前面,因为变量如果是空时,会出错,
如果是常量的话,就是匿名对象,他会在堆中开辟一个内存空间,所以不会有空指向。
构造器 | 说明 |
---|---|
String() | 初始化一个新创建的 String 对象,使其表示一个空字符序列。 |
String(String original) | 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。 |
String(byte[] bytes) | 通过使用平台的默认字符(UTF-8)集解码指定的 byte 数组,构造一个新的 String。 |
String(byte[] bytes, Charset charset) | 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的String。 |
String(byte[] bytes, int offset,int length, Charset charset) | 通过使用指定的 charset 解码指定的 byte子数组,构造一个新的 String。(offset起始,length:子数组总长) |
String(char[] value) | 分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。 |
String(StringBuffer buffer) | 分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。 |
String(StringBuilder builder) | 分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。 |
//String(byte[] bytes)平台默认的字符集解码指定的byte数组
//GBK编码生成“你好啊”
String st2="你好啊";
byte[] bytes=st2.getBytes(Charset.forName("GBK"));
//乱码
String s2 = new String(bytes);
System.out.println(new String(bytes,Charset.forName("GBK")));
try{
System.out.println(new String(bytes,"GBK"));
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
//乱码
System.out.println(new String(bytes,Charset.forName("UTF-8")));
你好啊
你好啊
????
GBK:汉字2占个字节,中文符号2个字节,英语符号、字母、数字1个字节
UTF-8:汉字3占个字节,中文符号3个字节,英语符号、字母、数字1个字节
//String(byte[] bytes)平台默认的字符集解码指定的byte数组
//GBK编码生成“你好啊”
String st2="你好,啊,郭7g洋洋";
byte[] bytes=st2.getBytes(Charset.forName("GBK"));
//乱码
System.out.println("---平台默认解码----");
String s2 = new String(bytes);//说明我的平台默认是GBK
System.out.println(s2);
System.out.println("---正确----");
System.out.println(new String(bytes,Charset.forName("GBK")));
try{
System.out.println(new String(bytes,"GBK"));
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
System.out.println("---乱码----");
//乱码
System.out.println(new String(bytes,Charset.forName("UTF-8")));
for(int i=0;i<bytes.length;i++){
System.out.print(bytes[i]);
System.out.print(" ");
}
System.out.println();
//对部分字符串解码,2指从第2开始,4指总长,offset、length不对会乱码
System.out.println(new String(bytes,11,1,Charset.forName("GBK")));
String st3="你好,啊,郭7g洋洋";
byte[] bytes1=st3.getBytes(Charset.forName("UTF-8"));
//乱码
System.out.println("---平台默认解码----");
String stt3 = new String(bytes1);
System.out.println(stt3);
//正确
System.out.println("---正确----");
System.out.println(new String(bytes1,Charset.forName("UTF-8")));
System.out.println("---乱码----");//说明我的平台默认是GBK
System.out.println(new String(bytes1,Charset.forName("GBK")));
for(int i=0;i<bytes1.length;i++){
System.out.print(bytes1[i]);
System.out.print(" ");
}
System.out.println();
System.out.println(new String(bytes1,10,3,Charset.forName("UTF-8")));
,(英文)
,(中文)
---平台默认解码----
你好,啊,郭7g洋洋
---正确----
你好,啊,郭7g洋洋
你好,啊,郭7g洋洋
---乱码----
???,??????7g????
-60 -29 -70 -61 44 -80 -95 -93 -84 -71 -7 55 103 -47 -13 -47 -13
7
---平台默认解码----
浣犲ソ,鍟婏紝閮?7g娲嬫磱
---正确----
你好,啊,郭7g洋洋
---乱码----
浣犲ソ,鍟婏紝閮?7g娲嬫磱
-28 -67 -96 -27 -91 -67 44 -27 -107 -118 -17 -68 -116 -23 -125 -83 55 103 -26 -76 -117 -26 -76 -117
,
转换方法
public class StringTest2{
public static void main(String[] args){
String s1=new String("gyy");
String s2="gyy";
String s3="gyy";
String s4="gYy";
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s2.equals(s4));
System.out.println(s2.equalsIgnoreCase(s4));
String ss=new String("huugyyjyy");
//-1没有找到
//,因为反向
System.out.println(ss.lastIndexOf('g',2));
//右数遇到的第一个,正向数第3
System.out.println(ss.lastIndexOf('g',4));
char[] c= new char[ss.length()];
//小写
System.out.println(ss.toLowerCase());
//大写
System.out.println(ss.toUpperCase());
//拼接
System.out.println(ss.concat("jjj"));
c=ss.toCharArray();
for(int i=0;i<c.length;i++){
System.out.println(c[i]);
}
}
}
false
true
false
true
-1
3
huugyyjyy
HUUGYYJYY
huugyyjyyjjj
h
u
u
g
y
y
j
y
y
其他方法
//替换
System.out.println(ss.replace('j','l'));
System.out.println(ss);
String ss2= " "+ss.concat(" ");
System.out.println(ss2);
System.out.println(ss2.trim());
String ss3="huugyyjyy";
System.out.println(ss.compareTo(ss3.toUpperCase()));
System.out.println(ss.compareToIgnoreCase(ss3.toUpperCase()));
String ss4="http//:www.th/fg/hu78i.com/";
String[] ss5=ss4.split("/");
for(String sp:ss5){
System.out.println(sp);
}
String[] ss6=ss4.split("/",3);
for(String sp:ss6){
System.out.println(sp);
}
huugyylyy
huugyyjyy
huugyyjyy
huugyyjyy
32
0
http
:www.th
fg
hu78i.com
http
:www.th/fg/hu78i.com/
StringBuffer(安全)、StringBuilder(非安全)
- StringBuffer:线程安全的; StringBuilder:线程非安全的,
- 字符串连接 String 的 + 比 StringBuffer(StringBuilder) 的 Append() 性能差了很多
- 三者在执行速度方面的比较:StringBuilder(建议使用) > StringBuffer (线程要求同步时使用)> String