专栏首页理想二旬不止第三阶段-Java常见对象:【第三章 String类】

第三阶段-Java常见对象:【第三章 String类】

(一)

String类的概述及其构造方法

(1) 概述

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

而通过 API我们又可以知道

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

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

(2) 构造方法

  //空构造
  public String()
  
  //把字节数组转换成字符串
  public String(byte[] bytes)
  
  //把字节数组的一部分转换成字符串
  public String(byte[] bytes,int offset,int length)
  
  //把字符数组转换成字符串
  public String(char[] value)
  
  //把字符数组的一部分转换成字符串
  public String(char[] value,int offset,int count)
  
  //把字符串常量值转换成字符串    
  public String(String original)
  
  //下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
  String s = "hello";

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

(3) 字符串方法

  //返回此字符串的长度
  public int length ();

(4)构造方法和lenght方法的小案例

  //以前三个为例
  public class StringDemo {
      public static void main(String[] args) {
  //public String():空构造
          String s1 = new String();
          System.out.println("s1:" + s1);
          System.out.println("s1.length:" + s1.length());
          System.out.println("-------------------------");
  
  //把字节数组转换成字符串:public String(byte[] bytes)
          byte[] bys = {97,98,99,100,101}; //abcde
          String s2 = new String(bys);
          System.out.println("s2:" + s2);
          System.out.println("s2.length:" + s2.length());
          System.out.println("-------------------------");
  
  //把字节数组的一部分转换成字符串:
  //public String(byte[] bytes,int offset,int length)
          String s3 = new String(bys,1,3);
          System.out.println("s3:" + s3);
          System.out.println("s3.length:" + s3.length());
      }
  }
  //运行结果:
  s1:
  s1.length:0
  -------------------------
  s2:abcde
  s2.length:5
  -------------------------
  s3:bcd
  s3.length:3

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

(5) 经典例题(必看)

例题一:

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

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

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

例题二:

  //两者的区别
  String s = new String("hello");
  String s = "hello";

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

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

解释:

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

  1. 在堆中创建一个对象 “hello” (new出来的),让 s 引用这个对象
  2. 在字符串常量池中查找是否存在内容为 “hello”的字符串对象 A:若存在,将new出的对象与字符串常量池中已存在的相联系 B:若不存在,则在字符串常量池中创建一个内容为 "abc" 的字符串对象,并与堆中 的对相联系

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

  1. 在字符串常量中查找是否存在内容为"hello"的字符串对象 A:若存在,让s直接引用该对象 B:若不存在,则直接让s引用该对象

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

例题三:

  public class StringDemo {
      public static void main(String[] args) {
          String s1 = new String("hello");
          String s2 = new String("hello");
          System.out.println(s1 == s2);//false
          System.out.println(s1.equals(s2));//true
  
          String s3 = new String("hello");
          String s4 = "hello";
          System.out.println(s3 == s4);//false
          System.out.println(s3.equals(s4));//true
  
          String s5 = "hello";
          String s6 = "hello";
          System.out.println(s5 == s6);//true
          System.out.println(s5.equals(s6));//true
      }
  }
  //运行结果
  false
  true
  false
  true
  true
  true

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

例题四:

  public class StringDemo2 {
      public static void main(String[] args) {
          String s1 = "Hello";
          String s2 = "World";
          String s3 = "HelloWorld";
  
          System.out.println(s3 == s1 + s2);
          System.out.println(s3.equals(s1 + s2));
          System.out.println(s3 == "Hello" + "World"); //重点
          System.out.println(s3.equals("Hello" + "World"));
      }
  }
  //运行结果
  false
  true
  true
  true

总结:

  1. 字符串中如果是变量相加,先开空间,再拼接
  2. 字符串中如果是字符串相加,是先加,然后在常量池中找,如果有就直接返回否则就创建

(二)

String类的功能

(1) 判断功能

  //比较字符串的内容是否相同,区分大小写
  boolean equals(Object obj)
  
  //比较字符串的内容是否相同,不区分大小写
  boolean equalsIgnoreCase(String str)
  
  //判断大字符串中是否包含小字符串
  boolean contains(String str)
  
  //判断某个字符串是否以某个指定的字符串开头
  boolean startsWith(String str)
  
  //判断某个字符串是否以某个指定的字符串结尾
  boolean endsWith(String str)
  
  //判断字符串是否为空
  boolean isEmpty()
  
  注意:
  String s = “ ”;   // 字符串内容为空
  String s = null;  // 字符串对象为空

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

  import java.util.Scanner;
  
  /*
  *  模拟登陆案例,给三次机会,并且提示剩余次数
  *      A:定义用户名和密码(已经存在的)
  *      B:键盘录入用户名和密码
  *      C:比较用户名和密码
  *      D:给三次机会,用循环改进
  */
  
  public class StringDemo {
      public static void main(String[] args) {
          for (int x = 0; x < 3; x++) {
              String username = "admin";
              String password = "admin888";
  
              Scanner sc = new Scanner(System.in);
              System.out.println("请输入用户名");
              String name = sc.nextLine();
              System.out.println("请输入密码");
              String psw = sc.nextLine();
              if (name.equals(username) && psw.equals(password)) {
                  System.out.println("登录成功");
              } else {
                  if ((2 - x) == 0) {
                      System.out.println("你的账号已经被锁定,请与管理员联系");
                  } else {
                      System.out.println("登录失败,你还有" + (2 - x) + "次机会");
                  }
              }
          }
      }
  }

(2) 获取功能

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

字符串中数据统计案例

  import java.util.Scanner;
  
  /*
  *  案例:统计一个字符串中大写字母字符,小写字母字符,数字字符出现 * 的次数
  */
   
  public class StringDemo {
      public static void main(String[] args) {
          Scanner sc = new Scanner(System.in);
          System.out.println("请输入需要统计的数据");
          String s = sc.nextLine();
  
          int numberCount = 0;
          int smallCout = 0;
          int bigCout = 0;
  
          for (int x = 0; x < s.length(); x++) {
              char ch = s.charAt(x);
              if (ch >= 'a' && ch <= 'z') {
                  smallCout++;
              } else if (ch >= 'A' && ch <= 'a') {
                  bigCout++;
              } else if (ch >= '0' && ch <= '9') {
                  numberCount++;
              }
          }
          
          System.out.println("大写字母:" + bigCout + "个");
          System.out.println("小写字母:" + smallCout + "个");
          System.out.println("数字:" + numberCount + "个");
      }
  }
  //运行结果
  请输入需要统计的数据
  HelloWorld520
  大写字母:2个
  小写字母:8个
  数字:3个

(3) 转换功能

  //把字符串转换为字节数组
  byte[] getBytes()
  
  //把字符串转换成字符数组
  char[] toCharArray()
  
  //把字符数组转换成字符串
  static String valueOf(char[] chs)
  
  //把int类型的数据转换成字符串
  static String valueOf(int i)
  //注意:String类的valueOf方法可以把任何类型的数据转换成字符串!
    
  //把字符串转换成小写    
  String toLowerCase()
  
  //把字符串转换成大写
  String toUpperCase()
  
  //把字符串拼接
  String concat(String str)

(4) 其他功能

  //替换功能 
  String replace(char old,char new)
  String replace(String old,String new)
  
  //去除字符串两端空格
  String trim()
  
  //按字典比较功能
  int compareTo(String str)
  int compareToIgnoreCase(String str) 

逆序输出字符串案例

  /*
  *  键盘输入 "abc"
  *  输出结果 "cba"
  */
  
  import java.util.Scanner;
  
  public class StringDemo2 {
      public static void main(String[] args) {
          Scanner sc = new Scanner(System.in);
          System.out.println("请输入:");
          String line = sc.nextLine();
  
          char[] chs = line.toCharArray();
  
          String result = "";
  
          for (int x = chs.length - 1; x >= 0; x--) {
              result += chs[x];
          }      
          System.out.println("reusult:" + result);
      }
  }
  //运行结果
  请输入:
  abc
  reusult:cba

大串中查询小串案例

  import java.util.Scanner;
  
  public class StringDemo {
  
      public static void main(String[] args) {
          Scanner sc = new Scanner(System.in);
          System.out.println("请输入被统计的数据");
          String maxString = sc.nextLine();
          System.out.println("请输入统计关键词");
          String minString = sc.nextLine();
          int count = getCount(maxString, minString);
          System.out.println("count:" + count);
      }
  
      public static int getCount(String maxString, String minString) {
  //定义一个统计变量,初始化为0
          int count = 0;
  
  //先在大串中查找小串第一次出现的位置
          int index = maxString.indexOf(minString);
  
  //索引不是-1,说明存在,统计变量++
          while (index != -1) {
              count++;
  //把刚才的索引 + 小串的长度作为开始位置截取上一次的大串
  //返回一个新的字符串,并把该字符串的值重新赋给大串
              int startIndex = index + minString.length();
              maxString = maxString.substring(startIndex);
              index = maxString.indexOf(minString);
          }
          return count;
      }
  }
  
  //运行结果
  请输入被统计的数据
  Hello520World520
  请输入统计关键词
  520
  count:2

本文分享自微信公众号 - 理想二旬不止(ideal-20),作者:BWH_Steven

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第三阶段-Java常见对象:【第七章 正则表达式】

    BWH_Steven
  • 第五阶段-IO基础:【第四章 IO流补充】

    看API,如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的

    BWH_Steven
  • 【万字长文】Spring MVC 层层递进轻松入门 !

    Html是“名词”,CSS是“形容词”,JavaScript是“动词”,这三个兄弟凑在一起,就构成了 “静态” 页面,那么如何让他 “动态” 起来呢?这就需要后...

    BWH_Steven
  • 【趣学程序】java常用类(一)

    String表示字符串,所谓字符串,就是一连串的字符,是java中最常用的类之一。 String是不可变类,一旦String对象被创建,包含在对象中的字符序列(...

    趣学程序-shaofeer
  • JavaApi-String

    char[ ] toCharArray() ---- 把字符串转换为字符数组 String toLlowerCase() ---- 把字符串转换为小写字符...

    DataScience
  • JDK15正式发布,划时代的ZGC同时宣布转正

    2020年9月15日,JDK15正式发布,可谓如约而至。按照Java SE的发展路线图,JDK14自此停止更新。值得注意的是JDK15并非LTS版本,Oracl...

    YourBatman
  • JDK15正式发布,划时代的ZGC同时宣布转正

    2020年9月15日,JDK15正式发布,可谓如约而至。按照Java SE的发展路线图,JDK14自此停止更新。值得注意的是JDK15并非LTS版本,Oracl...

    YourBatman
  • 字符串的学习

    1> “==”与“equals”的区别 “==”判断的是两个字符串对象在内存中的首地址,就是判断是否是同一个字符串对象; 而equals()判断的是两个字符串对...

    片刻
  • String、StringBuffer 的使用 ,两个面试问题

    byte[] getBytes():把字符串转换为字节数组 char[] toCharArray():把字符串转换为字符数组 static String va...

    梅花
  • 【重磅】Facebook贾扬清发文,Caffe2go将开源,手机就能训练神经网络

    【新智元导读】Caffe作者,Facebook研究科学家贾扬清11月8日在Facebook官方网站上发文,介绍了他在Facebook 最新的机器学习研究成果——...

    新智元

扫码关注云+社区

领取腾讯云代金券