String类
String类概念:
String是引用数据类型,表示字符串(其实是由多个字符组成的)
String类特点:
String是final修饰的,所以是最终类,最终类是不能被继承的,既然不能被继承也就意味着里面的方法不能被重写
String中常见的方法:
public static void method() {
//replace()替换
String url="http://www.news.baidu.com";
String newUrl=url.replace("baidu ", "jd");
System.out.println(newUrl); // 输出:http://www.jd.com
//substring()截取 如果只有一个参数,代表开始,直到末尾结束,String类按照数组的下标来排序
System.out.println(url.substring(7));//输出:www.news.baidu.com
System.out.println(url.length()); // 输出:25
//substring()截取,如果有两个参数,参数一代表开始,参数二代表结束位置(不包含)
System.out.println(url.substring(7, url.length()-1)); //输出:www.news.baidu.co
//split 分割 参数代表要拆分的依据 \\.
String []urlArr=url.split("\\.");
System.out.println(urlArr[urlArr.length-2]);//输出:baidu
System.out.println("转换为纯大写:"+url.toUpperCase());//输出:转换为纯大写:HTTP://WWW.NEWS.BAIDU.COM
}
String中不常见的方法:
public static void method2() {
String str="hihi2";
System.out.println("指定索引出的char值:"+str.charAt(1)); // 下标从0开始,charAt(1)对应的是i
System.out.println("指定char值对应的索引:"+str.indexOf('i'));// 指定char值对应的索引:1
System.out.println("指定char值对应的索引:"+str.lastIndexOf('i'));// 指定char值对应的索引:3
String compare1="adc";
String compare2="aac";
System.out.println(compare2.compareTo(compare1));// -3
System.out.println(compare2.concat(compare1)); // aacadc
System.out.println("是否包含指定的字符串:"+str.contains("hello"));// 是否包含指定的字符串:false
String url="https://www.baidu.com";
System.out.println(url.endsWith("cn"));//输出:false
System.out.println(url.startsWith("http"));//true
//将字符穿转换为字节数组
byte[] bts=str.getBytes();
//print(bts);
System.out.println("判断字符串是否为空字符:"+"".isEmpty());//true
地址判断:
1.将传递过来的字符串转换为字符数组。判断长度是否相同
2.根据下标位置,逐个比较字符是否相同
面试题:
==和equals的区别
==用于基本数据类型时 比较的是值 , 用于引用数据类型时 比较的是地址
equals 在字符串中是先比较地址后比较内容
public static void method3() {
//equals() 重写了Object中的equals方法,先比较地址,地址不同,再比较内容,地址相同就止直接返回true
String str=new String("hello");
String str2=new String("hello");
System.out.println(str==str2);//false 地址不同
System.out.println(str.equals(str2));//true 虽然地址不同,但是内容相同
}
字符串对象的创建:
1.字符串本身是引用数据类型,可以通过new关键字进行对象创建
2.字符串有比较特殊,它也可以直接赋值的形式进行字符串对象的创建
问: 上述的区别在哪里?
答:API中说明:字符串都是常量,字符串常量都在常量池(方法区)中存储,是有自己的地址的,通过new关键字创建出来的对象在堆内存中。 常量池:如果要指定某一个常量进行使用,首先会先去常量池中查看该常量是否已存在,如果存在就直接拿来用,如果不存在就创建一个放进常量池
public static void method4() {
String str=new String("haha");
String str2=new String("haha");
System.out.println(str==str2);//false 地址不同
String str3="hehe";
String str4="hehe";
System.out.println(str3==str4);//true 使用的都是常量池中的同一个
System.out.println("------");
String str6="hello";
String str7="world";
String str8="helloworld";
String str9=str6+str7; //对象已创建好了 再进行拼接
System.out.println(str8==str9);//false
System.out.println(str8.equals(str9));// true 虽然地址不同,但是内容相同
System.out.println("------");
String str0="a"+"b"+"c"; //先拼接再创建的对象
String str01="abc";
System.out.println(str0==str01);//ture
System.out.println(str0.equals(str01));//ture
}
面试题:数组当中使用的是length属性还是length方法?
答:数组中使用的length属性,String中使用的是length()