Java学习 ---- String类

Day12.01_____Scanner类

  • 使用Scanner类
  • nextInt()
    • 获取一个整数型的数据
  • nextline()
    • 获取一个字符串型的数据
    • 注意事项: nextline()检测到回车键的时候就会停止
  • next()
    • 获取一个字符串
    • 注意事项: next()检测到空格的时候就会停止
  • next基本数据类型()
    • 返回值基本数据类型,获取对应基本数据类型的数据
  • hasNext基本数据类型()
    • 返回值boolean类型,检测用户输入的数据是否为对应的基本数据类型


Day12.02_____String类

  • String类的构造方法
    • (1) public String(){}
      • 通过该构造方法创建的String对象,默认值为空串""
        • 1、null与""的区别:
          (1) " "是String类的对象,可以调用String类中的任何方法;
          (2) null是空值,不能调用任何方法,因为调用就会报空指针异常
        • 2、注意事项:
          String str = null;
          System.out.print(str);不会报错
          解释:print方法打印对象的引用时,如果值是null,就打印null,否则就 打印该引用调用toString()方法后的值
    • (2) public String(byte[] bytes)
      • 通过该构造方法创建的String对象,需要传入一个byte(字节)类型数组,可以将一个byte字节数组转换成一个字符串。在这个过程中,其实是将计算机看得懂的二进制转换成我们看得懂的字符串,它的转换是根据我们的默认字符集来定的,这个转换的过程我们称作解码
    • (3) public String(byte[] bytes , Charset charset)
      • 该构造方法创建String对象的实质和上面一样,唯一的不同是可以指定默认的字 符集,我们可以通过传入charset这个参数去指定默认字符集
    • (4) public String(byte[] bytes , int offset , int length)
      • 该构造方法创建String对象的实质和(2)一致,唯一的不同是可以指定转换的位置和个数,offset可以指定解码字符集bytes中第一个字符的下标,length可以指定转换的个数
    • (5) public String(char[] value)
      • 通过该构造方法创建String对象,可以将一个char类型的字符数组转换为一个字符串
    • (6) public String(char[] value , int offset , int count)
      • 通过该构造方法创建String对象,可以将一个char类型的字符数组转换为一个字符串,其中offset、count参数的含义与(4)相同
    • (7) public String(String original)
      • 通过该构造方法创建String对象,需要传入一个String类型的字符串
  • String对象一旦本创建,不能被更改。例如:
	String str = "abc";
	str = "bcd";
	System.out.print(str);	//输出的结果是bcd

这里的bcd并不是修改了str,在内存中的实现是:首先看常量池中是否有bcd字符串,如果有bcd字符串就直接将其地址值赋值给str,而此时abc的地址值就没有引用再指向它,它就变成了垃圾;如果常量池中没有bcd字符串,那就现在常量池中创建bcd字符串,再把bcd的地址值给str引用。因此由此可以看出,String对象一旦被创建,就是不可被修改的。


Day12.03_____String类面试题

  • 第一题:
	String s1 = "abc";
	String s2 = "abc";
	System.out.println(s1 == s2);		true
	System.out.println(s1.equals(s2));	true

解释: String s1 = “abc”,会进入方法区中的常量池,这个池子的特点为先看常量池中是否已经有了"abc"对象,如果有就直接记录住"abc" 对象的地址值,如果没有就创建"abc"对象的地址值,所以s1、s2指 向同一地址值

  • 第二题:String str = new String(“abc”);这句话在内存中创建了几个对象? 2
    • 解释:根据内存图解释:
      • (1) 首先String str进入栈内存;
      • (2) String类比较特殊,即使后面是new关键字,也不会先去堆内存,而是先到常量池中看有没有"abc"这个对象,如果有就直接将"abc"对象副本复制 给堆内存中的对象,如果没有就先创建一个"abc"对象,再将其值复制给堆内存中的对象;
      • (3) 创建完对象后,将常量池中的对象值副本给堆内存中的对象;
      • (4) 将堆内存中对象的地址值赋值给str引用;因此这里有两个对象一个常量池中的对象,一个堆内存中的对象
  • 第三题:
	String s1 = new String("abc");
	String s2 = "abc";
	System.out.println(s1 == s2);		false
	System.out.println(s1.equals(s2));	true

解释:综合上面两点知识点解释即可

  • 第四题:
	String s1 = "a" + "b" + "c";
	String s2 = "abc";
	System.out.println(s1 == s2);		true
	System.out.println(s1.euqals(s2));	true

解释:Java中有一个常量优化机制,当"a"+“b”+"c"进入常量池时,常量池已经将其变成了一个"abc"字符串,然后再把地址值给s1,因此s2再指向时,常量池中已经存在"abc"字符串,s2也会指向同一地址值

  • 第五题:
 	String s1 = "ab";
	String s2 = "abc";
	String s3 = s1 + "c";
	System.out.print(s2 == s3);		false
	System.out.print(s2.equals(s3));	true

解释:因为s2+"c"是一个变量+常量,所以不会有常量优化机制。根据内存图来解释:
(1) "ab"进入常量池,并将其地址赋值给s1引用;
(2) “abc"进入常量池,并将其地址赋值给s2引用;
(3) 对于s3的理解,首先在堆内存中创建一个StringBuilder对象(或者StringBuffer对象)调用其中的append()方法将s2与"c"连接形成"abc”,然后创建一个 String对象,把StringBuilder对象调用toString()方法的结果赋值给创建的String对象;
(4) 将创建的String对象的地址值赋值给引用s3


Day12.04_____String类的判断功能

  • equals(Object obj)
    • 返回值类型boolean,比较两个字符串值是否相同,区分大小写
  • equalsIgnoreCase(String str)
    • 返回值类型boolean,比较两个字符串值是否相同,不区分大小写
  • contains(String str)
    • 返回值类型boolean,判断某字符串中是否包含字符串str
  • startWith(String str)
    • 返回值类型boolean,判断某字符串是否以字符串str开头
  • endWith(String str)
    • 返回值类型boolean,判断某字符串是否以字符串str结尾
  • isEmpty()
    • 返回值类型boolean,判断字符串是否为空
    • 注意:为空和null不一样,空指的是" ",而为null的字符串不能调用方法,否则会报空指针异常


Day12.05_____String类的获取功能

  • length()
    • 返回值类型int,获取字符串的长度
  • charAt(int index)
    • 返回值类型char,获取指定索引位置的字符
  • indexOf(int ch)
    • 返回值类型int,返回指定字符在此字符串中第一次出现的索引
  • indexOf(String str)
    • 返回值类型int,返回指定字符串在此字符串中第一次出现的索引,需注意的是该返回的索引是字符串第一个字符的索引
  • indexOf(int ch, int fromIndex)
    • 返回值类型int,返回指定字符在此字符串中从指定位置出发后第一次出现的索引
  • indexOf(String str, int fromIndex)
    • 返回值类型int,返回指定字符串在此字符串中从指定位置出发后第一次出现的索引,其索引值同样也为字符串中第一个字符的位置
  • lastIndexOf()
    • 返回值类型int,方法的重载方法与indexOf()方法的重载方式一样,不同之处在于该方法是从后往前看,但索引值不变,也就是说比如在字符串"abcdabcd"中查找’c’,查找的时候是从最后面的d开始寻找,但最后一个d的索引值还是7,所以根据这个方法找’c’,返回的值为6
  • substring(int start)
    • 返回值类型String,返回从指定位置一直到末尾的字符串
  • substring(int start, int end)
    • 返回值类型String,返回从指定开始位置到指定结束位置的字符串,需要注意的是指定位置的时候,start的值能取,end的值不取,也就是数学中的左闭右开


Day12.06_____String类的转换功能

  • getBytes()
    • 返回值类型byte[],把字符串转换成一个byte( 字节 )数组
  • toCharArray()
    • 返回值类型char[],把字符串转换成一个char( 字符 )数组
  • valueOf(char[] chs)
    • 返回值类型String,静态方法,把字符数组转换成字符串
  • valueOf(int i)
    • 返回值类型String,静态方法,把int类型数据转换成字符串
    • 注意:String类的任意valueOf()方法可以把任意的数据类型转换成字符串
  • toLowerCase()
    • 返回值类型String,把字符串中所有大写字母转换成小写字母
  • toUpperCase()
    • 返回值类型String,把字符串中所有小写字母转换成大写字母
  • concat(String str)
    • 返回值类型String,把字符串拼接


Day12.07_____String类的替换功能

  • replace(char old, char new)
    • 返回值类型String,在字符串中用新的字符替换旧的字符
  • replace(String old, new String)
    • 返回值类型String,在字符串中用新的字符串替换旧的字符串
    • 注意:在替换时如果字符串中old字符(字符串)存在,就用new字符(字符串)去替换,如果不存在就返回原本的字符(字符串)


Day12.08_____String类的去除空格功能

  • trim()
    • 返回值类型String,去除字符串中前后的空格


Day12.09_____String类的根据字典顺序(ASCA码表)比较两个字符串

  • compareTo(String str)
    • 返回值类型int,区分大小写
  • compareToIgnoreCase(String str)
    • 返回值类型int,不区分大小写
    • 注意:
      • (1) 为什么返回的是int类型的数,而不是boolean类型的?
        • 因为int类型可以表示三种情况,大、小或相等而boolean类型只能表示两种情况,相等或不相等
      • (2) 比较是如何比较的?
        • 从两个字符串的第一个字符开始比较,根据ASCA码表开始进行比较,如果两个字符串的内容相同,长度不同,那么比较的就是两个字符串的长度
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值