> 文档中心 > [JavaSE] 认识String类 (字符、字节、字符串)

[JavaSE] 认识String类 (字符、字节、字符串)

认识String类

    • 字符, 字节与字符串
      • 字符与字符串
      • 字节与字符串
      • 小结
    • 字符串常见操作
      • 字符串比较
        • equals
        • equalsIgnoreCase
        • compareTo
      • 字符串查找
        • contains
        • indexOf
        • startsWith
        • endWith
      • 字符串替换
        • replace
        • replaceFirst
      • 字符串拆分
        • split
        • 注意事项
      • 字符串的截取
        • substring
      • 其他操作方法

字符, 字节与字符串

字符与字符串

字符串内部包含一个字符数组,String 可以和 char[] 相互转换

No 方法名称 类型 描述
1 public String(char value[]) 构造 将字符数组中的所有内容变为字符串
2 public String(char value[], int offset, int count) 构造 将部分字符数组中的内容变为字符串
3 public char charAt(int index) 普通 取得指定索引位置的字符索引从0开始
4 public char[] toCharArray() 普通 将字符串变为数组返回

代码示例 No1

    public static void main(String[] args) { char[] val = {'a','b','c'}; String str = new String(val); //这玩意儿不会放到常量池的,因为没用""引起来哦~ System.out.println(str);    }    //abc

代码示例 No2

    public static void main(String[] args) { char[] val = {'a','b','c','d','e','f'}; String str = new String(val,1,3); System.out.println(str);    }    //bca

代码示例 No3

    public static void main(String[] args) { String str="Nick_Bears"; char c = str.charAt(2);//获取2下标的字符 System.out.println(c);    }//c

示例代码 No4

    public static void main(String[] args) { String str="Nick_Bears"; char[] chars = str.toCharArray();//把str指向的字符串对象变成字符数组 System.out.println(Arrays.toString(chars));    }    //[N, i, c, k, _, B, e, a, r, s]

代码示例: 给定字符串一个字符串, 判断其是否全部由数字所组成

思路: 将字符串变为字符数组而后判断每一位字符是否是" 0 “~”‘9’"之间的内容,如果是则为数字

//实现1    public static void main(String[] args) { String str ="5201314"; System.out.println(isNumberChar(str));    }    public static boolean isNumberChar(String s){ for (int i = 0; i < s.length(); i++) {     char c = s.charAt(i);     if(c<'0' || c>'9'){  return false;     } } return true;    }//true//实现2    public static void main(String[] args) { String str ="5201314"; System.out.println(isNumberChar(str));    }    public static boolean isNumberChar(String s){ for (int i = 0; i < s.length(); i++) {     //判断某个字符是不是数字     char c = s.charAt(i);     boolean flg = Character.isDigit(c);     if(flg==false){  return false;     } } return true;    }//true

字节与字符串

字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换。

No 方法名称 类型 描述
1 public String(byte bytes[]) 构造 将字节数组变为字符串
2 public String(byte bytes[], int offset, int length) 构造 将部分节数组中的内容变为字符串
3 public byte[] getBytes() 普通 将字符串以字节数组的形式返回
4 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 普通 编码转换处理

代码示例 No1

    public static void main(String[] args) { byte[] bytes={97,98,99,100}; String str = new String(bytes); System.out.println(str);    }    //abcd

示例代码 No2

    public static void main(String[] args) {     byte[] bytes={97,98,99,100};     String str = new String(bytes,1,3);     System.out.println(str);    }    //bcd

当你一不小心输入一个值的时候,String上 会出现一条斜线

示例代码 No 3

    public static void main(String[] args) { String str = "abcd"; byte[] bytes1 = str.getBytes(); System.out.println(Arrays.toString(bytes1));    }//[97, 98, 99, 100]

示例代码 No 4

    public static void main(String[] args) throws UnsupportedEncodingException { String str = "abcd"; String str1 = "abcd好可爱!"; byte[] bytes = str.getBytes("utf-8"); // 英文 1字节 中文 3字节 byte[] bytes1 = str1.getBytes("utf-8"); // 英文 1字节 中文 2字节 byte[] bytes2 = str1.getBytes("GBK"); System.out.println(Arrays.toString(bytes)); System.out.println(Arrays.toString(bytes1)); System.out.println(Arrays.toString(bytes2));    }//[97, 98, 99, 100]//[97, 98, 99, 100, -27, -91, -67, -27, -113, -81, -25, -120, -79, 33]//[97, 98, 99, 100, -70, -61, -65, -55, -80, -82, 33]

小结

那么何时使用 byte[], 何时使用 char[] 呢?

  • byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
  • char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候

回忆概念: 文本数据 vs 二进制数据

一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容

  • 如果看的懂, 就是文本数据(例如 .java 文件)
  • 如果看不懂, 就是二进制数据(例如 .class 文件)

字符串常见操作

字符串比较

  • 真假比较
  • 大小比较

No 方法名称 类型 描述
1 public boolean equals(Object anObject) 普通 区分大小写比较
2 public boolean equalsIgnoreCase(String anotherString) 普通 不区分大小写比较
3 public int compareTo(String anotherString) 普通 比较两个字符串大小关系

equals

源码分析:

  • this == anObject 判断地址是否相同,不同false
  • anObject instanceof String 判断是否为String类型,不同false
  • n == anotherString.value.length 判断长度,不同false
  • v1[i] !=v2[i] 最后一个个比较,若不同为false

代码示例:不区分大小写比较

    public static void main(String[] args) { String str1 = "Nick"; String str2 = str1; String str3 = "luck"; System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3));    }   //ture   //false

equalsIgnoreCase

代码示例:区分大小写比较

    public static void main(String[] args) { String str1 = "Nick"; String str2 = "nick"; System.out.println(str1.equalsIgnoreCase(str2));    }    //true

compareTo

范例:观察compareTo()比较

    public static void main(String[] args) { String str1 = "Nick"; String str2 = "nick"; String str3 = "Nick"; System.out.println(str2.compareTo(str1));//32 System.out.println(str1.compareTo(str3));//0 System.out.println(str1.compareTo(str2));//-32    }    

 compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。

字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一个字符的大小(根据unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容 。

字符串查找

从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:

No 方法名称 类型 描述
1 public boolean contains(CharSequence s) 普通 判断一个子字符串是否存在
2 public int indexOf(String str) 普通 从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1
3 public int indexOf(String str, int fromIndex) 普通 从指定位置开始查找子字符串位置口
4 public int lastIndexOf(String str) 普通 由后向前查找子字符串位置
5 public int lastIndexOf(String str, int fromIndex) 普通 从指定位置由后向前查找·
6 public boolean startsWith(String prefix) 普通 从指定位置开始判断是否以指定字符串开头
7 public boolean startsWith(String prefix, int toffset) 普通 判断是否以指定字符串结尾口
8 public boolean endsWith(String suffix) 普通 判断是否以指定字符串结尾口

contains

代码示例: 字符串查找,最好用最方便的就是contains()

    public static void main(String[] args) { String str = "abcdefg"; String tmp = "eg"; String tmps = "ab"; System.out.println(str.contains(tmp));//false System.out.println(str.contains(tmps));//true    }

该判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能,就必须借助、indexOf()方法完成

indexOf

代码示例: 使用indexOf()方法进行位置查找

 使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置

    public static void main(String[] args) { String str = "abcdefg"; String tmp = "de"; System.out.println(str.indexOf(tmp));//类似于c的strstr-> KMP算法 System.out.println(str.indexOf(tmp,4));//设置开始找的位置 -1 System.out.println(str.indexOf(tmp,3));// 3    }//3
    public static void main(String[] args) { String str = "dededeabcdefg"; String tmp = "de"; //从后往前找 System.out.println(str.lastIndexOf(tmp));//9 System.out.println(str.lastIndexOf(tmp,6));//4    }

startsWith

endWith

 在进行查找的时候往往会判断开头或结尾

代码示例: 判断开头或结尾

    public static void main(String[] args) { String str ="NickNickNickNick"; String tmp = "k"; //起始位置 System.out.println(str.startsWith("N"));//true System.out.println(str.startsWith("c"));//false //设置起始偏移量 System.out.println(str.startsWith("N",4));//true System.out.println(str.startsWith("N",5));//false //判断结尾 System.out.println(str.endsWith("CK"));//false System.out.println(str.endsWith("ck"));//true    }

字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

No 方法名称 类型 描述
1 public String replace(char oldChar, char newChar) 普通 替换指定所有内容
2 public String replaceFirst(String regex, String replacement) 普通 替换首个内容

replace

replace 和 replaceAll 效果一样的

代码示例: 字符串的替换处理

    public static void main(String[] args) { String str = "abababacbacbancabcba"; //相同返回this,不同会new String str2 = str.replace('a', 'b');//这里两个参数是char System.out.println(str2);//bbbbbbbcbbcbbncbbcbb    }    public static void main(String[] args) { String str = "abcabcabcabc"; //相同返回this,不同会new String str2 = str.replace("ab", "er");//这里两个参数是String System.out.println(str2);//ercercercerc    }//------------------------------------------------------------------------------    public static void main(String[] args) { String str = "abababacbacbancabcba"; //相同返回this,不同会new String str2 = str.replaceAll('a', 'b');//这里两个参数是char System.out.println(str2);//bbbbbbbcbbcbbncbbcbb    }    public static void main(String[] args) { String str = "abcabcabcabc"; //相同返回this,不同会new String str2 = str.replaceAll("ab", "er");//这里两个参数是String System.out.println(str2);//ercercercerc    }

replaceFirst

代码示例: 替换首个内容

    public static void main(String[] args) { String str = "abcabcabcabc"; String str2 = str.replaceFirst("ab", "er"); System.out.println(str2);//ercabcabcabc    }

字符串拆分

split

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。

No 方法名称 类型 描述
1 public String[] split(String regex) 普通 将字符串全部拆分
2 public String[] split(String regex, int limit) 普通 将字符串部分拆分,该数组长度就是limit极限

代码示例: 实现字符串的拆分处理(多次拆分)

    public static void main(String[] args) { String str = "name=Nick&age=20&classes=大数据一班"; String[] str1 = str.split("&"); for (String s:str1){     String[] str2 = s.split("=");     for (String ss:str2){  System.out.print(ss+" ");   //name Nick age 20 classes 大数据一班     } }    }

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义

代码示例: 拆分IP地址

    public static void main(String[] args) { String str = "192.168.1.1"; String[] arr1 = str.split("\\."); for (String s:arr1){     System.out.println(s); }    }

注意事项

  • 字符"|“,”*“,”+"都得加上转义字符,前面加上 \
  • 而如果是" \ \ ",那么就得写成 \ \ \ \ .
  • 如果一个字符串中有多个分隔符,可以用"|"作为连字符

**代码示例: | 作为连接符 **

    public static void main(String[] args) { //我要将str的全部分割! String str = "name Nick&age=20#classes=大数据一班"; String[] arr = str.split(" |&|=|#"); for(String s:arr){     System.out.print(s+" ");     //name Nick age 20 classes 大数据一班  }    }

字符串的截取

substring

从一个完整的字符串之中截取出部分内容。可用方法如下:

No 方法名称 类型 描述
1 public String substring(int beginIndex) 普通 从指定索引截取到结尾
2 public String substring(int beginIndex, int endIndex) 普通 截取部分内容

代码示例: 观察字符串截取 No 2

    public static void main(String[] args) { String str ="Nick1234567890"; String sub = str.substring(2,3);//左闭右开[ ) System.out.println(sub);//提取字串 c    }

其他操作方法

No 方法名称 类型 描述
1 public String trim() 普通 去掉字符串中的左右空格,保留中间空格
2 public String toUpperCase() 普通 字符串转大写
3 public String toLowerCase() 普通 字符串转小写
4 public native String intern() 普通 字符串入池操作
5 public String concat(String str) 普通 字符串拼接,等同于“+”,不入池
6 public int length() 普通 取得字符串长度
7 public boolean isEmpty() 普通 判断是否为空字符串,但不是null,而是长度为0

代码示例: 观察trim()方法的使用

    public static void main(String[] args) { String str = "      520  1 3 14"; System.out.println(str.trim());//去除左右两边空格,中间的空格不会被删除 //520  1 3 14    }

代码示例: 大小写转换

    public static void main(String[] args) { String str = "nick"; String str1="NICK"; System.out.println(str.toUpperCase()); //NICK System.out.println(str1.toLowerCase());//nick    }//这两个函数只转换字母

代码示例:字符串入池

    public static void main(String[] args) { String str2=new String("ni")+new String("ck"); str2.intern(); String str="nick"; System.out.println(str==str2);//true    }    //这里不去过多去讲入池了,详情看第一篇String

代码示例:拼接

    public static void main(String[] args) { String str = "Nick"; String ret = str.concat("很宠粉哦~"); //不入池是指拼接好new 出的这个对象不会自动入池 System.out.println(ret);    }//Nick很宠粉哦~

代码示例: 字符串length()

    public static void main(String[] args) { String str="12345"; System.out.println(str.length()); int[] array = {1,2,3,4,5}; System.out.println(array.length); //搞清楚方法和参数,括号带不带看清楚哦 //Java 里面的数组 非常特殊 机制很多    }

代码示例:观察isEmpty()方法

    public static void main(String[] args) { String str="123"; String str1="  "; String str2=""; String str3=new String(); System.out.println(str.isEmpty());//false System.out.println(str1.isEmpty());//false System.out.println(str2.isEmpty());//true System.out.println(str3.isEmpty());//true    }

String类并没有提供首字母大写操作,需要自己实现

代码示例: 首字母大写

    public static void main(String[] args) { String str="interesting"; System.out.println(FirstUpper(str));//Interesting    }    public static String FirstUpper(String s){ if("".equals(s) || s==null){     return s; } if(s.length()>1){     return s.substring(0,1).toUpperCase().concat(s.substring(1)); } return s.toUpperCase();    }

[JavaSE] 认识String类 (字符、字节、字符串)