String

2022-07-27

String

1. 概念

String是引用数据类型,表示字符串(其实是由多个字符组成的)

2 .String类特点

String是final修饰的,所以是最终类,最终类是不能被继承的,既然不能被继承也就意味着里面的方法不能被重写

3. 字符串常量池

字符串是常量,所有的字符串常量都是存储在常量池中的,每个常量在常量池中都有地址;在常量池中,如果定义的常量在常量池中已经存在,则不会再进行创建,而是直接拿来用,如果不存在就创建一个常量扔进常量池中
/

4.String对象的创建形式

public static void main(String[] args){
    String str = new String("haha");
    String str2 = new String("haha");
    System.out.println(str == str2);

    String str3 = "hello";
    String str4 = "hello";
    System.out.println(str3 == str4);

    //面试题:下面的代码创建了几个对象
    String str5 = "how"+"are"+"you";//1
    String str6 = "howareyou";
    System.out.println(str5 == str6);

    String str7 = new String("happy");//2

    String str8 = "so";
    String str9 = "handsome";
    String str10 = "sohandsome";
    String str11 = str8 + str9;
    System.out.println(str10 == str11);
}

5.常见方法的使用

String str = "hello";
//charAt() 获取指定索引对应的char值
System.out.println(str.charAt(0));
//indexOf() 返回指定字符对应的下标
System.out.println(str.indexOf("ll"));
//lastIndexOf() 返回指定字符对应的下标(反向查找)
System.out.println(str.lastIndexOf('l'));
//compareTo() 比较两个字符串的先后顺序(自然排序)
//ASCII码表 a对应数字97 b 98 A65 B66
System.out.println("abc".compareTo("aba"));
//contains() 是否包含指定的字符串
System.out.println("hello world".contains(str));
//endsWith() 以指定字符结尾
System.out.println("www.baidu.com".endsWith(".cn"));
//isEmpty() 判断指定字符串是否为空(是否是空字符串 null代表空对象)
System.out.println(" ".isEmpty());
//split() 根据指定的字符对字符串进行分割
String imgs = "1.jpg,2.jpg,3.jpg";
String[] imgsArr = imgs.split(",");
for(int i=0;i<imgsArr.length;i++) {
    System.out.println(imgsArr[i]);
}
System.out.println("------------");
//获取指定图片的后缀 找到最后一个.,一直到字符的结尾
String picPath = "f1ew5f1ew56f1ew5.aa.jpg";
int startIndex = picPath.lastIndexOf(".");
int endIndex = picPath.length();
//获取到的后缀 subString(int startIndex ,int endIndex) 包含开始,不包含结束
//String suffix = picPath.substring(startIndex, endIndex);
//指定开始的位置,默认结束的位置是直到字符串的末尾
String suffix = picPath.substring(startIndex);
System.out.println(suffix);
//trim() 去掉字符串前后的空白
String trim = " a a ";
System.out.println(trim.trim());

**注意:**基本数据类型和引用数据类型之间不能进行强制类型转换

6.数字转字符串的方式

int num = 5;
String numStr = num + "";
//valueOf() 将指定的类型转换为String类型
String str = String.valueOf(num);
System.out.println(str);
String str = new String("haha");
String str2 = new String("haha");
System.out.println(str == str2);
//字符串中的equals方法是先比较地址,如果地址不同再比较值是否相同
System.out.println(str.equals(str2));

//源码分析
if (anObject instanceof String) {//判断传递过来的对象是否是字符串类型
    String anotherString = (String)anObject;//将对象强制类型转换为String
    int n = value.length;//获取当前字符串的长度
    if (n == anotherString.value.length) {//比较两个字符串的长度是否相等
        //字符串是由字符数组组成的,比较字符串是否相等,就是将单个的字符分别进行比较
        char v1[] = value;
        char v2[] = anotherString.value;
        /*int i = 0;
        while (n-- != 0) {
            if (v1[i] != v2[i])
                return false;
            i++;
        }*/
        for(int i=0;i<v1.length;i++){
            if(v1[i] != v2[i]){
                return false;
            }
        }
        return true;
    }
}

7.

面试题:数组当中使用的是length属性还是length方法?

数组中使用的length属性,String中使用的是length()

面试题(重点):java中==和equals的区别

==号如果比较的是基本数据类型,那比较的值是否相等,如果比较的是引用数据类型,那比较的是地址是否相同;在String类中equals先比较地址,地址不相同再比较值是否相同。

8.总结

package cn.yunhe.str;

public class StringDemo {

	public static void main(String[] args) {
		method4();
	}
	
	/**
	 * 字符串对象的创建
	 * 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);
		System.out.println(str0.equals(str01));
	}
	
	/**
	 * 1、地址判断
	 * 2、将传递过来的字符串转换为字符数组,判断长度是否相同
	 * 3、根据下标的位置,逐个比较字符是否相同
	 * 
	 * 面试题:==和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
	}
	
	/**
	 * String中有用的且常用的方法
	 */
	public static void method2() {
		//replace() 替换
		String url = "http://www.news.baidu.com";
		String newUrl = url.replace("baidu", "jd");
		System.out.println(newUrl);
		//substring() 截取 如果只有一个参数,代表开始,直到末尾结束
		System.out.println(url.substring(7));
		//substring() 截取 如果有两个参数,参数一代表开始,参数二代表结束位置(不包含)
		System.out.println(url.substring(7, url.length()));
		//split() 分割 参数代表要拆分的依据 \\.
		String[] urlArr = url.split("\\.");
		System.out.println(urlArr[urlArr.length-2]);
		System.out.println("转换为纯大写:"+url.toUpperCase());
	}
	
	/**
	 * String中的有用的不是很常用的方法
	 */
	public static void method() {
		String str = "hi juni";
		System.out.println("指定索引出的char值:"+str.charAt(1));
		System.out.println("指定char值对应的索引:"+str.indexOf('i'));
		System.out.println("指定char值对应的索引:"+str.lastIndexOf('i'));
		String compare1 = "adc";
		String compare2 = "aac";
		System.out.println(compare2.compareTo(compare1));
		System.out.println(compare2.concat(compare1));
		System.out.println("是否包含指定的字符串:"+str.contains("hello"));
		String url = "https://www.baidu.com";
		System.out.println(url.endsWith("cn"));
		System.out.println(url.startsWith("http"));
		//将字符串转换为字节数组
		byte[] bts = str.getBytes();
		//print(bts);
		System.out.println("判断字符串是否为空字符:"+"".isEmpty());
	}
	
	
	/**
	 * String中的构造方法
	 */
	public static void constructorMethod() {
		String str = new String();
		System.out.println(str+"--"+null);
		
		String str2 = new String("haha");
		System.out.println(str2);
		String str3 = "heihei";
		System.out.println(str3);
		
		byte[] byteArr = {97,99,98,100};
		String str4 = new String(byteArr);
		System.out.println(str4);
		
		char[] charArr = {'a','b','c'};
		String str5 = new String(charArr);
		System.out.println(str5);
		//源码的写法
		String result = "";
		for(int i=0;i<charArr.length;i++) {
			result = result + charArr[i];
		}
		System.out.println(result);
	}
	
	/**
	 * 遍历数组
	 * @param arr
	 */
	public static void print(byte[] arr) {
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}
}

本文地址:https://blog.csdn.net/qq_52232797/article/details/109648525

《String.doc》

下载本文的Word格式文档,以方便收藏与打印。