Java学习的第十七天(JavaSE特别篇_String类的剖析)

一、定义字符串的两种方式

package com.bianyiit.cast;

public class Demo_String01 {
    public static void main(String[] args) {
        //字符串归根到底还是一个类,只不过我们将它默认写成了 String s="张三";
        //字符串的长度是不可以更改的
        //定义一个字符串的两种方式
            String s1="张三";   //通过字符串常量定义一个字符串
            String s2 = new String("张三");   //通过构造方法定义一个字符串
        //字符串常量在内存中到底是如何存储的呢??

二、字符串常量在内存中到底是如何存储的??

只有一个对象引用一个常量的时候 String s1="张三"

两个对象同时引用同一个常量的时候 String s1="张三" String s2="张三" String s3="李四";

三、实例分析

        //实例分析
        String a="hello";
        String b="hellow";
        String c="hello";
        System.out.println(a==b);   //false
        //为什么a==b时为false  因为String归根结底还是一个类(引用数据类型),所以==号比较的是a和b的地址值 常量池一个是hello,另一个是hellow
        System.out.println(a==c);   //true
        //为什么a==b时为true  因为String归根结底还是一个类(引用数据类型),所以==号比较的是a和b的地址值 而a和b的值存在方法区里面都是hello
        System.out.println(a.equals(c));  //true
        //为什么a==b时为true  因为String归根结底还是一个类(引用数据类型),但是.equals()重写了object里面的.equals(),所以比较的是具体的值
    }
}

四、面试题

1.Object中的equals方法和String中的equals方法有什么区别
     Object的equals方法比较的是两个对象的地址值
	 String的equals方法已经重写了 Object的equals方法,比较的是两个对象的内容。
2.判断两个字符串是否相等
	String   str1   =  “abc”;
	String   str2   =  “abc”
==号比较的是地址值,相同的常量存储的位置一致,地址值也相同,所以str1==str2  //true
.equals()已经重写了 Object的equals方法,比较的是两个对象的内容。所以str1.equals(str2)  //true

五、String创建的第二种方式

String s=new String("张三");
System.out.println(s)   //输出的不是地址值,是内容
String b="张三";
System.out.println(a.equals(b));  //true  比较的是内容而不是地址值
System.out.println(a==b);  // true 比较的是地址值而不是内容,但是根据字符串常量在内存中到底是如何存储的??可知

六、new出来的字符串在内存中到底是如何存储的??

七、面试题

3.下面语句会在内存中创建几个对象
	String  str = new String(“bianyiit”);
	两个对象。 1个在堆里面(是new出来的对象)
			  1个在常量池里面(常量对象)

八、判断如下两个字符串是否相等

String  str1 = “a”+ “b” + “c”;
String  str2 = “abc”;
System.out.println(str1.equals(str2));  //true
System.out.println(str1==str2); //true
//方法区中有一个常量的优化机制,能够让内容拼接起来之后再存储到常量池里面
//"a"+"b"+"c"-->"abc"

原理图如下:

String str = “ab”;
String str1 = “abc”;
String str2 = str + “c”;
System.out.println(str1.equals(str2));  //true
System.out.println(str1==str2); //true

原理图如下:

九、构造方法

String(String original):把字符串数据封装成字符串对象
	String  str = new String(“hello”);
	System.out.println(str);   //hello
	
String(char[] value):把字符数组的数据封装成字符串对象
	char[] arr={'h','e','l','l','o'};
	String s=new String(arr)
	System.out.println(s);     //hello
	
String(char[] value, int index, int count):把字符数组中的一部分数据封装
	char[] arr={'h','e','l','l','o'};
	String s=new String(arr,0,3);   //0代表起始索引,3代表长度
	System.out.println(s);     //hel
 通过构造方法创建的字符串对象和直接赋值方式创建的字符串对象有什么区别呢?
 * 		通过构造方法创建字符串对象是在堆内存。
 * 		直接赋值方式创建对象是在方法区的常量池。
 * ==:
 * 		基本数据类型:比较的是基本数据类型的值是否相同
 * 		引用数据类型:比较的是引用数据类型的地址值是否相同

十、判断方法

boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str):判断字符串对象是否以指定的str开头
boolean endsWith(String str):判断字符串对象是否以指定的str结尾

public class StringDemo {
	public static void main(String[] args) {
		//创建字符串对象
		String s1 = "hello";
		String s2 = "hello";
		String s3 = "HELLO";
		
		//boolean equals(Object obj):比较字符串的内容是否相同
		System.out.println(s1.equals(s2));
		System.out.println(s1.equals(s3));
		System.out.println("-----------");
		
		//boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
		System.out.println(s1.equalsIgnoreCase(s2));
		System.out.println(s1.equalsIgnoreCase(s3));
		System.out.println("-----------");
		
		//boolean startsWith(String str):判断字符串对象是否以指定的str开头
		System.out.println(s1.startsWith("he"));
		System.out.println(s1.startsWith("ll"));
		System.out.println("-----------");
		
		//boolean endsWith(String str):判断字符串对象是否以指定的str结尾
		System.out.println(s1.startsWith("o"));
		System.out.println(s1.startsWith("lo"));
	}
}

十一、判断功能案例(模拟登陆)

package com.bianyiit.cast;

import java.util.Scanner;

public class Demo_Login {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String username="admin";
        String password="1234";
        for (int i = 0; i <3 ; i++) {
            System.out.print("请输入用户名:");
            String user = sc.next();
            System.out.print("请输入密码:");
            String pw = sc.next();
            if(user.equals(username)&&pw.equals(password)){  //因为user/username/pw/password都是String类型,而String类已经重写了object的equals(),所以比较的是具体值
                System.out.print("登陆成功");
                break;
            }else{
                if((2-i)==0){  //如果次数已用完,给出最后的提示
                    System.out.println("很遗憾,你今天输入密码的次数已经用完,请明天再来");
                }else{
                    System.out.println("输入有误,请重新输入");
                    System.out.println("您还需剩"+(2-i)+"次机会!!,请谨慎输入");
                    System.out.println();
                }
            }
        }
    }
}
//输出结果:
	请输入用户名:admin
	请输入密码:7894
	输入有误,请重新输入
	您还需剩2次机会!!,请谨慎输入
	
	请输入用户名:admin
	请输入密码:1234
	登陆成功

十二、获取方法

int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexOf(String str):获取str在字符串对象中第一次出现的索引
int lastIndexOf(String str):获取str在字符串对象中最后一次出现的索
String substring(int start):从start开始截取字符串
String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end

String a=new String("helloworld");
System.out.println(a.length());
System.out.println(a.charAt(0));
System.out.println(a.indexOf("o"));
System.out.println(a.lastIndexOf("o"));
System.out.println(a.substring(5));
System.out.println(a.substring(3,6));
//输出结果
	10
	h
	4
	6
	world
	low

十三、转换方法

char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串

String str = "HeLLoWorLD";
char[] arr=str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
System.out.println();
System.out.println("原始字符串"+str);
String lowerCase = str.toLowerCase();
System.out.println("小写字符串"+lowerCase);
String upperCase = str.toUpperCase();
System.out.println("小大写字符串"+upperCase);
//输出结果:
	H	e	L	L	o	W	o	r	L	D	
	原始字符串HeLLoWorLD
	小写字符串helloworld
	小大写字符串HELLOWORLD

十四、其他方法

去除字符串两端空格	  String trim()
按照指定符号分割字符串  String[] split(String str)

package com.bianyiit.cast;

public class Demo_String04 {
    public static void main(String[] args) {
        /*去除字符串两端空格	  String trim()
          按照指定符号分割字符串  String[] split(String str)*/
        String s="  =hello  world=  ";
        System.out.println(s);
        System.out.println(s.trim());
        System.out.println(s.replace("  ",""));  //去掉中间的空格
        String s1="2019,11,14";
        String[] s2=s1.split(",");
        for (int i = 0; i < s2.length; i++) {
            System.out.println(s2[i]);
        }
    }
}
//输出结果:
  =hello  world=  //前后空了一格
=hello  world=    //去掉了两端的空格
=helloworld=	  //去掉了中间的空格,按照指定符号分割字符串
2019
11
14				  //按照指定符号“,”分割字符串

十五、遍历字符串的两种方式

//字符串也可以看成是字符数组
//第一种方式
	String s="helloworld";
	for(int i=0;i<10;i++){
		System.out.println(s.charAt(i));   //获取指定索引处的字符
	}
	//优化
	String s="helloworld";
	for(int i=0;i

十六、案例(字符串拼接)

package com.bianyiit.cast;

public class Demo_String05 {
    public static void main(String[] args) {
        /*
         * 把数组中的数据按照指定个格式拼接成一个字符串
         * 举例:int[] arr = {1,2,3};
         * 输出结果:[1, 2, 3]
         *
         * 分析:
         * 		A:定义一个int类型的数组
         * 		B:写方法实现把数组中的元素按照指定的格式拼接成一个字符串
         * 		C:调用方法
         * 		D:输出结果
         */
        int[] arr={1,2,3};
        String s="[";
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                s=s+arr[i]+"]";
            }else{
                s=s+arr[i]+",";
            }
        }
        System.out.println(s);
    }
}
//输出结果:
	[1,2,3]

你可能感兴趣的:(Java修仙之路)