
我们先对String来简单介绍一下:
1.字符串,使用“”引起来表示
2.声明为final,不可被继承
3.实现了Serializable接口,字符串可以被序列化
4.实现了Comparanle接口,可以用来比较字符串的大小
5.一种不可变的字符序列-->不可变性
6.String是引用类型 不是基本数据类型
7.可通过字面量的方式或者String构造器的方式给字符串进行赋值
一、String两种实例化
@Test
public void test2(){
//通过字面量定义的方式,此时的S1和s2的数据java在方法区的字符串常量池中
String s1="java";
String s2="java";
//通过new+构造器的方式:此时s3和s4保存的地址值是对空间中开辟空间
String s3=new String("java");
String s4=new String("java");
System.out.println(s1==s2);//true 字符串常量池中不能同时存在内容相同的字符串
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
System.out.println(s3==s4);//false 堆空间中不同的对象地址值不同
}
二、String的拼接
* 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量 * 只要其中有一个是变量,结果就是在堆中 * 如果拼接的结果调用intern() 方法,返回值就存在常量池中
@Test
public void test3(){
String s1="jvm";
String s2="mysql";
String s3="jvmmysql";//属于字面量的定义方式 是在常量池中进行的
String s4="jvm"+"mysql";//由两个字面量来拼接的 这也是在常量池中进行的
String s5=s1+"mysql";//由一个字面量和一个变量拼接成的 当涉及到变量时都是在堆空间上面进行的所以地址值部同
String s6="jvm"+s2;
String s7=s1+s2;
System.out.println(s3==s4);//true
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
System.out.println(s6==s7);//false
String s8=s5.intern();//返回值得到的s8使用的常量池中已经存在的“jvmmysql”
System.out.println(s3==s8);//true
}
三、String不可变性
public static void main(String[] args){
String s1="abc";//字面量的定义方式
String s2="abc";//此时s1和s2是两个对象 他们的地址值是一样的
s1="hello";//因为s1和s2都等于abc 此时将会在方法区常量池中新建一个地址赋值为hello然后把地址给s1
System.out.println(s1==s2);//s1 s2是对象 所以比较的是地址 这边两个地址相等
System.out.println(s1);
System.out.println(s2);
System.out.println("****************************");
String s4="abc";
String s5=s4.replace('a','b');
System.out.println(s4);
System.out.println(s5);
}
四、String与char[]之间的转换
* String -->char[]:调用String的tocharArray() * char[]-->String:调用String的构造器
@Test
public void test1(){
String str1="abc123";//
char[] chars=str1.toCharArray();
for(int i=0;i
五、String与byte[]之间的转换
* 编码:String-->byte[]:调用string的getBytes()
* 解码:byte[]-->String:调用String的构造器
*
* 编码:字符串-->字节(看的懂转化成看不懂的)
* 解码:编码的逆过程,字节--》字符串(看不懂的二进制数据-->看得懂)
@Test
public void test3() throws UnsupportedEncodingException {
String str1="abc123中国";
//编码
byte[] bytes=str1.getBytes();//默认是utf-8 进行转化 中文占三个
System.out.println(Arrays.toString(bytes));
byte[] bytes2=str1.getBytes("gbk");
System.out.println(Arrays.toString(bytes2));//使用gbk 进行编码 中文占两个
//解码
String str2=new String(bytes);
System.out.println(str2);
String str3=new String(bytes2);//因为默认是utf-8解码的 而bytes2是用gbk来编码的所以会出现乱码
System.out.println(str3);
String str4=new String(bytes2,"gbk");
System.out.println(str4);
}
六、String的常用方法
*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):与equal方法类相似,忽略大小写
* String concat(String str):将字符串连接到此字符串的结尾。等价于用“+”
* int compareTo(String anotherString):用于比较两个字符串的大小
* String substring(int beginIndex):返回新的字符串,它是此字符串的从beginIndex开始到结束
* String substring(int beginIndex,int endIndex):返回新的字符串,它是从此字符串的从BeginIndex开始到endIndex结束
@Test
public void test1(){
String s1="helloWold";
int l=s1.length();
System.out.println(l);
System.out.println(s1.charAt(5));
System.out.println(s1.isEmpty());
String s2=s1.toLowerCase();
System.out.println(s2);
String s3=s1.toUpperCase();
System.out.println(s3);
String s4=" hell o Word ";
System.out.println("-----"+s4+"-----");
String s5=s4.trim();
System.out.println("-----"+s5+"-----");
}
@Test
public void test2(){
String s1="HelloWord";
String s2="helloword";
System.out.println(s1.equals(s2));
System.out.println(s1.equalsIgnoreCase(s2));
String s3=s1.concat("NewWord");
System.out.println(s3);
System.out.println(s1.compareTo(s2));//负数比较小正数比较大零相等
String s4=s1.substring(2);
String s5=s1.substring(2,9);
System.out.println(s4);
System.out.println(s5);
}
* 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):返回指定字符串在此字符串中的最后一索引
* 注:如果index和lastIndexOf方法未找到都是返回-1
@Test
public void test3(){
String str1="helloWord";
boolean b1=str1.endsWith("ord");
System.out.println(b1);
boolean b2=str1.startsWith("he");
System.out.println(b2);
boolean b3=str1.startsWith("ll",2);
System.out.println(b3);
boolean b4=str1.contains("Word");
System.out.println(b4);
System.out.println(str1.indexOf("lol"));
System.out.println(str1.indexOf("lo",5));
String str2="helloworld";
System.out.println(str2.lastIndexOf("or"));
System.out.println(str2.lastIndexOf("or",5));
//什么时候indexOf和lastIndexOf返回值一样
//要么只有一个str 要么没有
}
* 替换
* 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):使用给定的replace替换此字符串匹配给定的正则表达式的第一个子字符串
* 匹配:
* boolean matches(String regex):告知此字符串是否匹配给定的正则表达式
* 切片:
* String[] split(String regex):根据给定正则表达式的匹配拆分此字符串
* String[] split(String regex,int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中
@Test
public void test4(){
String str1="隆冬响隆冬";
String str2=str1.replace('冬','春');
System.out.println(str1);
System.out.println(str2);
String str3=str1.replace("隆冬","暖春");
System.out.println(str3);
System.out.println("*********************");
String str="12hello34world56java789mysql123456";
//把字符串中的数字替换成“,”如果开头和结尾有“,”的话去掉
String string=str.replaceAll("\d+",",").replaceAll("^,|,$","");
System.out.println(string);
String str4="12345";
//判断是否全部由数字组成
boolean matches=str4.matches("\d+");
System.out.println(matches);
String tel="0571-4534289";
boolean result=tel.matches("0571-\d{7,8}");
System.out.println(result);
System.out.println("**********************");
String str5="hello|world|java";
String[] str5s=str5.split("\|");
for(int i=0;i
八、String、StringBuffer和StringBuilder
1. String、StringBuffer、StringBuilder三者的异同
* String 不可变的字符序列 底层使用char[]存储 这边底层用了final 所以不可变
* StringBuffer 可变的字符序列 线程安全 效率比较低 底层使用char[]存储
* StringBuilder 可变的字符序列 线程不安全 效率比较高 5.0新增 底层使用char[]存储
*
* 效率从高到低
* StringBuilder->StringBuffer->String
* 源码分析:
* String str=new String();char[] value=new char[0];
* String str1=new String("abc");char[] value=new char[]{'a','b','c'};
* StringBuffer sb1=new StringBuffer();//char[] value=new char[16];底层创建一个长度为16的char型数组
*
* StringBuffer sb2=new StringBuffer("abc")//char[] value=new char["abc".length()+16];
*
* 问题1:System.out.println(sb2.length())//3
* 问题2:扩容问题:如果要添加的数据底层数组装不下了,那就的扩容底层数组
* 默认情况下,扩容为原来的2倍+2,同时将原有的数组复制到新的数组中
*
* 指导意义:开发中建议大家使用:StringBuffer(int capacity) 尽量不要超过底层数组容量 因为扩容会影响效率
*
2.StringBuffer的常用方法
* StringBuffer的常用方法
* StringBuffer append();提供很多的append方法用于字符串的拼接
* StringBuffer delete(int start,int end):删除指定位置的内容 左闭右开
* StringBuffer replace(int start,int end,String str):把start到end的内容替换掉
* StringBuffer insert(int offset,×××);指定位置插入
* StringBuffer reverse();把当前的字符序列逆转
* public int indexOf(String str);
* public String substring(int start,int end);
* public int length();
* public char charAt(int n);
* public void setCharAt(int n,char ch);指定位置内容的替换
*/
@Test
public void test2(){
StringBuffer sb1=new StringBuffer("abc");
sb1.append(1);
sb1.append('1');
System.out.println(sb1);//abc11
sb1.delete(1,4);
System.out.println(sb1);//a1
sb1.insert(1,false);
System.out.println(sb1);//afalse1
sb1.replace(1,6,"true");
System.out.println(sb1);//atrue1;
sb1.reverse();
System.out.println(sb1);//1eurta
sb1.reverse();
System.out.println(sb1);//atrue1;
int index=sb1.indexOf("true");
System.out.println(index);//1
System.out.println(sb1.length());
String sb2=sb1.substring(1,5);
System.out.println(sb2);//true
sb1.setCharAt(5,'2');
System.out.println(sb1);//atrue2
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)