资讯专栏INFORMATION COLUMN

String类基础的那些事!

30e8336b8229 / 3566人阅读

摘要:第三阶段常见对象的学习第一章常见对象类一类的概述及其构造方法概述多个字符组成的一串数据,例如也可以看成是一个字符数组。

第三阶段 JAVA常见对象的学习 第一章 常见对象——String类 (一) String 类的概述及其构造方法 (1) 概述

多个字符组成的一串数据,例如 “abc” 也可以看成是一个字符数组。

而通过 API我们又可以知道

A:字符串字面值“abc”也可以看成是一个字符串对象

B:字符串是常量,一旦被赋值,就不能改变

(2) 构造方法

</>复制代码

  1. //空构造
  2. public String()
  3. //把字节数组转换成字符串
  4. public String(byte[] bytes)
  5. //把字节数组的一部分转换成字符串
  6. public String(byte[] bytes,int offset,int length)
  7. //把字符数组转换成字符串
  8. public String(char[] value)
  9. //把字符数组的一部分转换成字符串
  10. public String(char[] value,int offset,int count)
  11. //把字符串常量值转换成字符串
  12. public String(String original)
  13. //下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
  14. String s = "hello";

简单总结:String类的构造方法可以将 字节、字符数组、字符串常量(全部或者部分)转换为字符串类型

(3) 字符串方法

</>复制代码

  1. //返回此字符串的长度
  2. public int length ();
(4)构造方法和lenght方法的小案例

</>复制代码

  1. //以前三个为例
  2. public class StringDemo {
  3. public static void main(String[] args) {
  4. //public String():空构造
  5. String s1 = new String();
  6. System.out.println("s1:" + s1);
  7. System.out.println("s1.length:" + s1.length());
  8. System.out.println("-------------------------");
  9. //把字节数组转换成字符串:public String(byte[] bytes)
  10. byte[] bys = {97,98,99,100,101}; //abcde
  11. String s2 = new String(bys);
  12. System.out.println("s2:" + s2);
  13. System.out.println("s2.length:" + s2.length());
  14. System.out.println("-------------------------");
  15. //把字节数组的一部分转换成字符串:
  16. //public String(byte[] bytes,int offset,int length)
  17. String s3 = new String(bys,1,3);
  18. System.out.println("s3:" + s3);
  19. System.out.println("s3.length:" + s3.length());
  20. }
  21. }
  22. //运行结果:
  23. s1:
  24. s1.length:0
  25. -------------------------
  26. s2:abcde
  27. s2.length:5
  28. -------------------------
  29. s3:bcd
  30. s3.length:3

注:97,98,99,100,101 在ASCII码中代表abcde,不熟悉的朋友请自行查阅

(5) 经典例题(必看)

例题一:

</>复制代码

  1. /*
  2. * 字符串特点:一旦被赋值,就不能改变
  3. */
  4. public class StringDemo {
  5. public static void main(String[] args) {
  6. String s = "Hello";
  7. s += "World";
  8. System.out.println("s:" + s);
  9. }
  10. }
  11. //运行结果:
  12. s:HelloWorld

解释:不能改变是指字符串对象本身不能改变,而不是指对象的引用不能改变,上述过程中,字符串本身的内容是没有任何变化的,而是分别创建了三块内存空间,(Hello) (World) (HelloWorld) s → Hello + World → HelloWorld 。String内容的改变实际上是通过字符串之间的拼接、断开进行的,如上例中拼接后s的引用也就指向了 拼接后的HelloWorld

总结:开发中,尽量少使用 + 进行字符串的拼接,尤其是循环内,我们更加推荐使用StringBuild、StringBuffer,此内容下一篇详细讲解。

例题二:

</>复制代码

  1. //两者的区别
  2. String s = new String("hello");
  3. String s = "hello";

前者创建了2个 (1个) 对象,后者创建了1个 (0个) 对象

下面解释中若存在情况满足则,分别为创建1个和0个对象

解释:

String s = new String("hello"); 创建实例过程

</>复制代码

  1. 在堆中创建一个对象 “hello” (new出来的),让 s 引用这个对象

  2. 在字符串常量池中查找是否存在内容为 “hello”的字符串对象

    ​ A:若存在,将new出的对象与字符串常量池中已存在的相联系

  3. ​ B:若不存在,则在字符串常量池中创建一个内容为 "abc" 的字符串对象,并与堆中 的对相联系

String s = "hello"; 创建实例过程

</>复制代码

  1. 在字符串常量中查找是否存在内容为"hello"的字符串对象

    ​ A:若存在,让s直接引用该对象

  2. ​ B:若不存在,则直接让s引用该对象

总结:前者new一个对象,“hello”隐式创建一个对象,后者只有“hello”创建一个对象,在开发中,尽量使用 String s = "hello" 的方式,效率比另一种高。

例题三:

</>复制代码

  1. public class StringDemo {
  2. public static void main(String[] args) {
  3. String s1 = new String("hello");
  4. String s2 = new String("hello");
  5. System.out.println(s1 == s2);//false
  6. System.out.println(s1.equals(s2));//true
  7. String s3 = new String("hello");
  8. String s4 = "hello";
  9. System.out.println(s3 == s4);//false
  10. System.out.println(s3.equals(s4));//true
  11. String s5 = "hello";
  12. String s6 = "hello";
  13. System.out.println(s5 == s6);//true
  14. System.out.println(s5.equals(s6));//true
  15. }
  16. }
  17. //运行结果
  18. false
  19. true
  20. false
  21. true
  22. true
  23. true

解释: == 比较地址值是否相同、String中的equals()比较字符串内容是否一致

例题四:

</>复制代码

  1. public class StringDemo2 {
  2. public static void main(String[] args) {
  3. String s1 = "Hello";
  4. String s2 = "World";
  5. String s3 = "HelloWorld";
  6. System.out.println(s3 == s1 + s2);
  7. System.out.println(s3.equals(s1 + s2));
  8. System.out.println(s3 == "Hello" + "World"); //重点
  9. System.out.println(s3.equals("Hello" + "World"));
  10. }
  11. }
  12. //运行结果
  13. false
  14. true
  15. true
  16. true

总结:

字符串中如果是变量相加,先开空间,再拼接

字符串中如果是字符串相加,是先加,然后在常量池中找,如果有就直接返回否则就创建

(二) String类的功能 (1) 判断功能

</>复制代码

  1. //比较字符串的内容是否相同,区分大小写
  2. boolean equals(Object obj)
  3. //比较字符串的内容是否相同,不区分大小写
  4. boolean equalsIgnoreCase(String str)
  5. //判断大字符串中是否包含小字符串
  6. boolean contains(String str)
  7. //判断某个字符串是否以某个指定的字符串开头
  8. boolean startsWith(String str)
  9. //判断某个字符串是否以某个指定的字符串结尾
  10. boolean endsWith(String str)
  11. //判断字符串是否为空
  12. boolean isEmpty()
  13. 注意:
  14. String s = “ ”; // 字符串内容为空
  15. String s = null; // 字符串对象为空

简单模拟登录案例 (String版)

</>复制代码

  1. import java.util.Scanner;
  2. /*
  3. * 模拟登陆案例,给三次机会,并且提示剩余次数
  4. * A:定义用户名和密码(已经存在的)
  5. * B:键盘录入用户名和密码
  6. * C:比较用户名和密码
  7. * D:给三次机会,用循环改进
  8. */
  9. public class StringDemo {
  10. public static void main(String[] args) {
  11. for (int x = 0; x < 3; x++) {
  12. String username = "admin";
  13. String password = "admin888";
  14. Scanner sc = new Scanner(System.in);
  15. System.out.println("请输入用户名");
  16. String name = sc.nextLine();
  17. System.out.println("请输入密码");
  18. String psw = sc.nextLine();
  19. if (name.equals(username) && psw.equals(password)) {
  20. System.out.println("登录成功");
  21. } else {
  22. if ((2 - x) == 0) {
  23. System.out.println("你的账号已经被锁定,请与管理员联系");
  24. } else {
  25. System.out.println("登录失败,你还有" + (2 - x) + "次机会");
  26. }
  27. }
  28. }
  29. }
  30. }
(2) 获取功能

</>复制代码

  1. //获取字符串的长度
  2. int length()
  3. //获取指定索引的字符
  4. char charAt(int index)
  5. //返回指定字符在此字符串中第一次出现的索引
  6. int indexOf(int ch)
  7. //为什么这里是int而不是char?
  8. //原因是:‘a’和‘97’其实都能代表‘a’ int方便
  9. //返回指定字符串在此字符串中第一次出现的索引
  10. int indexOf(String str)
  11. //返回指定字符在此字符串中从指定位置后第一次出现的索引
  12. int indexOf(int ch,int fromIndex)
  13. //返回指定字符串在此字符串中从指定位置后第一次出现的索引
  14. int indexOf(String str,int fromIndex)
  15. //从指定位置开始截取字符串,默认到末尾
  16. String substring(int start)
  17. //从指定位置开始指定位置结束截取字符串
  18. String substring(int start,int end)

字符串中数据统计案例

</>复制代码

  1. import java.util.Scanner;
  2. /*
  3. * 案例:统计一个字符串中大写字母字符,小写字母字符,数字字符出现 * 的次数
  4. */
  5. public class StringDemo {
  6. public static void main(String[] args) {
  7. Scanner sc = new Scanner(System.in);
  8. System.out.println("请输入需要统计的数据");
  9. String s = sc.nextLine();
  10. int numberCount = 0;
  11. int smallCout = 0;
  12. int bigCout = 0;
  13. for (int x = 0; x < s.length(); x++) {
  14. char ch = s.charAt(x);
  15. if (ch >= "a" && ch <= "z") {
  16. smallCout++;
  17. } else if (ch >= "A" && ch <= "a") {
  18. bigCout++;
  19. } else if (ch >= "0" && ch <= "9") {
  20. numberCount++;
  21. }
  22. }
  23. System.out.println("大写字母:" + bigCout + "个");
  24. System.out.println("小写字母:" + smallCout + "个");
  25. System.out.println("数字:" + numberCount + "个");
  26. }
  27. }
  28. //运行结果
  29. 请输入需要统计的数据
  30. HelloWorld520
  31. 大写字母:2个
  32. 小写字母:8个
  33. 数字:3个
(3) 转换功能

</>复制代码

  1. //把字符串转换为字节数组
  2. byte[] getBytes()
  3. //把字符串转换成字符数组
  4. char[] toCharArray()
  5. //把字符数组转换成字符串
  6. static String valueOf(char[] chs)
  7. //把int类型的数据转换成字符串
  8. static String valueOf(int i)
  9. //注意:String类的valueOf方法可以把任何类型的数据转换成字符串!
  10. //把字符串转换成小写
  11. String toLowerCase()
  12. //把字符串转换成大写
  13. String toUpperCase()
  14. //把字符串拼接
  15. String concat(String str)
(4) 其他功能

</>复制代码

  1. //替换功能
  2. String replace(char old,char new)
  3. String replace(String old,String new)
  4. //去除字符串两端空格
  5. String trim()
  6. //按字典比较功能
  7. int compareTo(String str)
  8. int compareToIgnoreCase(String str)

逆序输出字符串案例

</>复制代码

  1. /*
  2. * 键盘输入 "abc"
  3. * 输出结果 "cba"
  4. */
  5. import java.util.Scanner;
  6. public class StringDemo2 {
  7. public static void main(String[] args) {
  8. Scanner sc = new Scanner(System.in);
  9. System.out.println("请输入:");
  10. String line = sc.nextLine();
  11. char[] chs = line.toCharArray();
  12. String result = "";
  13. for (int x = chs.length - 1; x >= 0; x--) {
  14. result += chs[x];
  15. }
  16. System.out.println("reusult:" + result);
  17. }
  18. }
  19. //运行结果
  20. 请输入:
  21. abc
  22. reusult:cba

大串中查询小串案例

</>复制代码

  1. import java.util.Scanner;
  2. public class StringDemo {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. System.out.println("请输入被统计的数据");
  6. String maxString = sc.nextLine();
  7. System.out.println("请输入统计关键词");
  8. String minString = sc.nextLine();
  9. int count = getCount(maxString, minString);
  10. System.out.println("count:" + count);
  11. }
  12. public static int getCount(String maxString, String minString) {
  13. //定义一个统计变量,初始化为0
  14. int count = 0;
  15. //先在大串中查找小串第一次出现的位置
  16. int index = maxString.indexOf(minString);
  17. //索引不是-1,说明存在,统计变量++
  18. while (index != -1) {
  19. count++;
  20. //把刚才的索引 + 小串的长度作为开始位置截取上一次的大串
  21. //返回一个新的字符串,并把该字符串的值重新赋给大串
  22. int startIndex = index + minString.length();
  23. maxString = maxString.substring(startIndex);
  24. index = maxString.indexOf(minString);
  25. }
  26. return count;
  27. }
  28. }
  29. //运行结果
  30. 请输入被统计的数据
  31. Hello520World520
  32. 请输入统计关键词
  33. 520
  34. count:2
结尾:

如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !^_^

如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)

</>复制代码

  1. 在这里的我们素不相识,却都在为了自己的梦而努力 ❤

    一个坚持推送原创Java技术的公众号:理想二旬不止

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74919.html

相关文章

  • 【面试】Java基础那些-Thr

    摘要:为了提高程序运行的效率,在软件发布后,检查默认是被关闭的。注意不能保证原子性,不能代替,且其会阻止编译器对代码的优化。以下方法用来判断一个字符串中是否包含中文字符。 前言 面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些java面试中的事,不会很详细,但是应该比较全面吧。 主要内容 assert有什么作...

    ShowerSun 评论0 收藏0
  • 【面试】Java基础那些-Two

    摘要:前言面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些面试中的事,不会很详细,但是应该比较全面吧。 前言 面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些java面试中的事,不会很详细,但是应该比较全面吧。 主要内容 pa...

    you_De 评论0 收藏0
  • String那些

    摘要:的不可变性众所周知,是常量,不可变,这一点很重要。那中,包装类的一个特质就是值操作时体现对应的基本类型的特质。同样的,等这些包装类和在这种情况下的表现是相同的。那么无论你对传入参数做了什么操作,都不会影响原来的值。 1. String的不可变性 众所周知,String是常量,不可变,这一点很重要。其底层的实现是char[]: /** The value is used for ...

    gghyoo 评论0 收藏0
  • 【面试】Java基础那些-One

    摘要:前言面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些面试中的事,不会很详细,但是应该比较全面吧。 前言 面试中对于技术职位,一般分笔试与面谈,如果面试官的一些小问题你可以立马找到对应的知识点扩展开来,那么这就是你的优势,本系列将讲述一些java面试中的事,不会很详细,但是应该比较全面吧。 主要内容 说到...

    Stardustsky 评论0 收藏0

发表评论

0条评论

30e8336b8229

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<