60.字符串
(1)概述 String str = “abc”;字符串是类,是引用的数据类型
(2)字符串的常量
String str = “abc”;
这是定义了一个字符串的常量。常量是不可改变的量,字符串是不能改变的。
public class StringTest { public static void main(String[] args) { String str="moni"; //这里不是做加等,在字符串上做拼接实际是新产生字符串 str+="ca"; System.out.println(str); }}
特点:
字符串常量是共享的(在数据共享区中有一个字符串常量池)
字符串不能变化,如果我们在字符串上做拼接,其实是新产生一个字符串。
(3)字符串的构造器
字符串常量是一种定义的方式
字符串需要有其他形式的构造器,比如可以通过字符的数组,字节数组,io流中的数据等等 。
public class StringTest1 { public static void main(String[] args) {// 第一种方式 String s=new String(); System.out.println(s); String s1="";//第二种方式通过字节数组来创建字符串 byte[] b=new byte[]{88,89,90,100,98,99}; String bs=new String(b); System.out.println(bs);//第三种方式通过字符节数组来创建字符串,offset是索引的位置,length表示引用的长度 String bs2=new String(b,1,4); System.out.println(bs2);//第四种通过字节数组来创建字符串 char[] c={'m','o','n','i','c','a'}; String cs=new String(c); System.out.println(cs);//第五种通过字节数组来创建字符串offset是索引的位置,count表示引用的长度 String cs2=new String(c,2,4); System.out.println(cs2);//第六种通过字符串常量创建字符串 String ss=new String("original"); System.out.println(ss); }}
(4)面试题
String s1 = new String (“abc”);
String s2 = “abc”;
有什么区别?
new String (“abc”);如果没有在字符串的常量池中没有abc就会在堆中创建一个对象,同时又在字符串常量池中也创建一个对象,然后用堆中的对象来引用字符串常量池中对象。实则创建了2个对象。
new String (“abc”); 如果在字符串的常量池中有abc,那么就会在堆中创建一个对象,直接引用已经存在的字符串常量池中的那个对象。
String s2 = “abc”;是直接在字符串的常量池种创建一个abc
(5)空字符串和null的区别
空字符串是有效的引用,有地址的,只不过是内容的长度是0
null这个引用是空引用,不能使用。使用一定会报空指针的错误。引用数据类型的默认值是null。
(6)字符串的判断方法
public static void main(String[] args) { String s="i love you!";// boolean endsWith(String suffix)判断一个字符串是否以某一个字符串为后缀 boolean b1=s.endsWith("!"); System.out.println(b1); String s1="I Love You!";// boolean equals(Object anObject) 判断两个字符串的值是否相等 boolean b2=s.equals(s1); System.out.println(b2);// boolean equalsIgnoreCase(String anotherString) 判断两个字符串忽略大小写后是否相等 boolean b3=s.equalsIgnoreCase(s1); System.out.println(b3);// boolean contains(CharSequence s) 判断一个字符串是否包含一个子字符串 boolean b4=s.contains("love"); System.out.println(b4);// boolean startsWith(String prefix) 判断一个字符串是否以某一个字符串为开头 boolean b5=s.startsWith("i"); System.out.println(b5);// boolean isEmpty() 判断一个字符串是否是空串 boolean b6="".isEmpty(); System.out.println(b6);//判断一个字符串是否是空串, 最好把空串的常量放在前面,防止空指针异常 boolean b7="".equals(s); System.out.println(b7); }
(7)字符串的获取功能
public static void main(String[] args) { String s="i love you!";// int length() 获得字符串的长度,区别于数组的长度是属性 int length=s.length(); System.out.println(length);// char charAt(int index) 根据索引号获得字符 char ca=s.charAt(5); System.out.println(ca);// int indexOf(int ch) 根据指定字符(ascii码对应字符)获得该字符在字符串中首次出现的位置 int idi=s.indexOf(101); System.out.println(idi);// int indexOf(String str) 根据指定字符串获得在母字符串中第一次出现的索引 int ids=s.indexOf("ve"); System.out.println(ids); }
/*练习:计算一个字符串中大写字母和小写字母还有数字的数量23aosdf23aosdfSDFGsfdgloasasdfasfgsrgqADF2453sadfgag*/public class StringTest4 { public static void main(String[] args) { int num=0; int upper=0; int downer=0; String s="23aosdf23aosdfSDFGsfdgloasasdfasfgsrgqADF2453sadfgag"; for (int i = 0; i < s.length(); i++) { int asc=s.charAt(i); if(asc>47&&asc<58){ num++; } if(asc>64&&asc<91){ upper++; } if(asc>96&&asc<123){ downer++; } } System.out.println("字符串中大写字母数量是:"+upper); System.out.println("字符串中小写字母数量是:"+downer); System.out.println("字符串中数字数量是:"+num); }}