Java String类详解

一、String介绍

1.特点:

  • a. java.lang.String 构建字符串对象 “aa” “12” “中文” 字符串常量

    String str = "java";//常量池中一个对象		
    
  • b. 字符串是常量;它们的值在创建之后不能更改 private final char value[];

    String str = "java";//常量池中一个对象
    str = "C++";//此时并不是将"java"改为了"C++",而是让str1 = new String("C++");
    
  • c. String类提供了很多非常好用的方法 (一会在下面讲解)

  • d. 字符串可以使用+进行连接

    String str1 = "hello";
    String str2 = "world";
    String str3 = str1 + str2;//此时str3的内容为"helloworld"
    
  • e. 字符串String类型本身是final声明的,意味着我们不能继承String

  • f. 字符串的对象也是不可变对象,意味着一旦进行修改,就会产生新对象

    String str1 = "hello";
    String str2 = "world";
    str1 += str2;//此时相当于str1 = new String(str1+str2);
    
  • g. String对象内部是用字符数组进行保存的

    private final char value[];//String的源码中使用一个char类型的value[]数组来储存的
    
  • h. 字符串常量存储在常量池

    • 常量池在内存的那个区域呢?
    • 如果细致的划分:
      • (1)JDK1.6及其之前:方法区
      • (2)JDK1.7:堆
      • (3)JDK1.8:元空间

在这里插入图片描述

2. String类对象的创建方式

  • a. String str=“java”;
  • b. String类的构造器
    • new String();//创建一个空串对象 this.value="".value
    • new String(“html5”);//创建一个指定字符串内容对象 this.value=“html5”.value
    • == 不能判断new的String对象但可以判断使用常量储存的
       String str1 = "java";
       String str2 = "java";
       String str3 = new String("java");
       System.out.println(str1 == str2);//true
       System.out.println(str1 == str3);//false
       /*解释:
       此时str1和str2都是直接指向常量池中(常量池在元空间中)的"java",
       ==符合对于引用类型比较的是地址,此时str1和str2指向同一个地址,所以结果为true
       而str3 new了对象,此时str3指向的是堆中它所对应的字符串数组,字符串数组在指向常量池的"java"
       所以这里用==判断str1和str3是不相等的
       */
    
    • new String(char[] c);//将char数组中全部字符构架字符串对象
    • new String(char[] c,int offset,int count); 将char数组中部分字符构架字符串对象
      • offset 起始索引值位置
      • count 字符个数
    • new String(byte[] b); 将byte数组中的数据构建成字符串对象 (ASCII) 默认采用平台字符集
    • new String(byte[] b,int offset,int length); 将byte数组中部分字符构架字符串对象
      • offset 起始索引值位置
      • length 字节个数
    • new String(byte[] b,Charset charset); 指定字符集进行处理
  • c. 静态方法
    • valueOf(); 将 基本数据类型 变为String
      int i=10;
      String valueOf = String.valueOf(i);
      System.out.println(valueOf);//10
      
  • d. “”+对象|基本数据类型
    	int i=10;
    	String str= new String();
    	str = "java" + 10;
    	System.out.println(str);//java10
    	
    	int[] a = {1,2,3};
    	//此时是默认调用a的toString()方法,然后与""相加
    	str = a + "";
    	System.out.println(str1);//[I@5d6f64b1
    
  • 如果不了解数组的toString()方法,可以点击该链接跳转查看Object常用方法

3. 字符串对象的个数

  • String str1=“java”;//常量池中一个对象
  • String str2=new String(“python”);//堆内存中有一个String类的对象,在常量池中有一个"python"对象

4. 字符串拼接内存存储位置

  • 常量+常量 结果在常量池
  • 变量+变量 结果在堆内存
  • 变量+常量 结果在堆内存
  • 如果调用intern方法,结果就会在常量池中

二、String类的常用方法

1. String字符串的对比

  • a. equals方法 来自于对Object中equals方法的重写
    • 对比字符串的内容是否一致
    • 例子:str1.equals(str2)
    //String.equals()方法源码
    //以str1.equals(str2)为例讲解
    public boolean equals(Object anObject) {
    	//如果str1和str2地址相等,那么内容一定相等
       if (this == anObject) {
           return true;
       }
       //判断str2是否属于String类,这里的equals是有str1调用的,所以str1肯定是String类型,在这里只需判断str2
       if (anObject instanceof String) {
       		//str2属于String,但有可能是String的子类,这里我们对str2进行向上转型
           String anotherString = (String)anObject;
           int n = value.length;
           //判断str1的长度和str2的长度是否相等
           if (n == anotherString.value.length) {
               char v1[] = value;
               char v2[] = anotherString.value;
               int i = 0;
               //判断str1的具体内容是否和str2完全相等
               while (n-- != 0) {
                   if (v1[i] != v2[i])
                       return false;
                   i++;
               }
               return true;
           }
       }
       return false;
    }
    
  • b. equalsIgnoreCase() 忽略大小写对比字符串的内容是否一致
    • 例子:str1.equalsIgnoreCase(str2)
    	String str1 = "java";
    	String str2 = "JAVA";
    	System.out.println(str1.equalsIgnoreCase(str2)); //true
    
  • c. compareTo() String类实现了Comparable接口
    • 比较两个字符串的大小 正数(this大) 0(相等) 负数(参数大)
    	String str1 = "java";
    	String str2 = "Java";
    	System.out.println(str1.compareTo(str2)); //32
    
  • d. compareToIgnoreCase() 忽略大小写比较两个字符串的大小
    		String str1 = "java";
    		String str2 = "Java";
    		System.out.println(str1.compareTo(str2)); //0
    		
       		String str1 = "java";
    		String str2 = "Jbva";
    		System.out.println(str1.compareTo(str2)); //-1
    

2. String方法

系列1

  • (1)boolean isEmpty():字符串是否为空
    • if(str.isEmpty())
      	System.out.println("通过isEmpty判断-str是空串");
      
  • (2)int length():返回字符串的长度
    • String str = "ab";
      System.out.println(str.length());//2
      
  • (3)String concat(xx):拼接,等价于+
    • 结果都在堆内存
    • String str1 = "java";
      String str2 = "bigdata";	
      String str3 = str2.concat(str1);
      System.out.println(str3);//javabigdata
      
  • (4)boolean equals(Object obj):比较字符串是否相等,区分大小写
    • String str1 = "java";
      String str2 = "java";	
      String str3 = "Java";
      System.out.println(str1.equals(str2));//true
      System.out.println(str1.equals(str3));//false
      
  • (5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
    • String str1 = "java";
      String str2 = "java";	
      String str3 = "Java";
      System.out.println(str1.equals(str2));//true
      System.out.println(str1.equals(str3));//true
      
  • (6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
    • String str1 = "java";
      String str2 = "java";	
      String str3 = "Java";
      System.out.println(str1.compareTo(str2));//0
      System.out.println(str1.compareTo(str3));//32
      
  • (7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
    • String str1 = "java";
      String str2 = "java";	
      String str3 = "Java";
      System.out.println(str1.compareTo(str2));//0
      System.out.println(str1.compareTo(str3));//0
      
  • (8)String toLowerCase():将字符串中大写字母转为小写
    • String str1 = "JAva";
      System.out.println(str1.toLowerCase());//java
      
  • (9)String toUpperCase():将字符串中小写字母转为大写
    • String str1 = "JAva";
      System.out.println(str1.toUpperCase());//JAVA
      
  • (10)String trim():去掉字符串前后空白符
    • String str1 = "   java  ";
      System.out.println(str1.trim());//java
      
  • 判断字符串是否为空
    if(str.length() == 0)
    	System.out.println("通过length判断-str是空串");
    if(str.equals(""))
    	System.out.println("通过equals判断-str是空串");
    if(str.isEmpty())
    	System.out.println("通过isEmpty判断-str是空串");
    

系列2 查找

  • str1.contains(str2) 判断字符串中是否包含另一个字符串,返回值为boolean类型
    • String str1 = "java";
      String str2 = "javaweb";
      System.out.println(str2.contains(str1));//true
      
  • indexOf(String str) 查找str在指定字符串第一次出现的索引位置,找不到返回-1
    • String str1 = "java";
      String str2 = "ajavaweb";
      System.out.println(str2.indexOf(str1));//1
      
  • lastIndexOf(String str)查找str在指定字符串最后一次出现的索引位置,找不到返回-1
    • String str1 = "java";
      String str2 = "ajavawebjava";
      System.out.println(str2.lastIndexOf(str1));//8
      

系列3 字符串截取

  • substring(int startIndex) 从指定下标截取到字符串末尾 (包含指定下标位置的字符)
    • String str = "ajavawebjava";
      System.out.println(str.substring(5));//webjava
      
  • substring(int startIndex,int endIndex) 从开始索引值截取至结束索引值 (左闭右开)
    • String str = "ajavawebjava";
      System.out.println(str.substring(5,8));//web
      

系列4 和字符相关

  • char charAt(int index) 获得字符串索引位置的字符
    • String str = "ajavawebjava";
      System.out.println(str.charAt(1));//j
      
  • toCharArray() 将字符串转为char数组
    • String str = "ajavawebjava";
      char[] chars = str.toCharArray();
      System.out.println(Arrays.toString(chars));//[a, j, a, v, a, w, e, b, j, a, v, a]
      

系列5 和字节相关

  • String --> byte[]

  • getBytes() 将字符串转为byte数组 默认采用平台的字符集

  • getBytes(String charsetname) 将字符串转为byte数组 设置的字符集

    • String str="你好";
      byte[] bytes = str.getBytes("gbk");
      for (int i = 0; i < bytes.length; i++) {
      	System.out.print(bytes[i]+ "\t");//-60	-29	-70	-61	
      }
      
  • byte[] --> String

  • new String(byte[] b,String charset);

    • String str=new String("你好".getBytes());
      String str1=new String("你好".getBytes("utf-8"),"utf-8");
      
    • 乱码产生的原因
      • a. 编码格式不支持中文
      • b. 编码格式和解码格式不一致

系列6 开头和结尾

  • (1)startsWith(String str) 判断是否以指定字符串开头
  • (2) endsWith(String str) 判断是否以指定字符串结尾

系列7 正则匹配 : 用于验证数据的格式是否正确

  • (1) matches(String 正则表达式); 验证字符串是否符合整合表达式的要求 (java这一端比较少用正则)
  • 常用正则表达式:
    • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
    • Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
    • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
    • 15位身份证号:^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$
    • 18位身份证号:^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
    • 只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$

系列8:替换

  • replace(char oldChar, char newChar); 用新字符替换字符串中所有的旧字符
    • String str="java";
      String replace = str.replace('a', 'b');
      System.out.println(str);//jbvb	
      
  • 支持正则表达式:replaceAll(String regex/String oldString, String newString) 用新字符串替换字符串中所有的旧字符串
    • String str="java,mysql,oracle,java,sqlserver";	
      String replaceAll = str.replaceAll("^j[a-z]*", "python");
      System.out.println(replaceAll); //python,mysql,oracle,java,sqlserver
      
      String replaceAll2 = str.replaceAll("java", "python");
      System.out.println(replaceAll2); //python,mysql,oracle,python,sqlserver
      
  • 支持正则表达式:replaceFirst(String regex/String oldString, String newString);用新字符串替换字符串中第一个的旧字符串
    • String str="java,mysql,oracle,java,sqlserver";
      String replaceFirst = str.replaceFirst("java", "linux");
      System.out.println(replaceFirst);	//linux,mysql,oracle,java,sqlserver
      

系列9:拆分

  • split(String str)以str为分割点,拆分字符串
    • String str="mysql_java_oracle_java_sqlserver";
      String[] split = str.split("_");
      System.out.println(Arrays.toString(split));//[mysql, java, oracle, java, sqlserver]
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值