赞
踩
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符、串应用又非常广泛,因此Java语言专门提供了String类
- ublic static void main(String[] args) {
- // 使用常量串构造
- String s1 = "hello bit";
- System.out.println(s1);
- // 直接newString对象
- String s2 = new String("hello bit");
- System.out.println(s1);
- // 使用字符数组进行构造
- char[] array = {'h','e','l','l','o','b','i','t'};
- String s3 = new String(array);
- System.out.println(s1);
- }
1. ==比较是否引用同一个对象
注意:对于内置类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址
- public static void main(String[] args) {
- int a = 10;
- int b = 20;
- int c = 10;
- // 对于基本类型变量,==比较两个变量中存储的值是否相同
- System.out.println(a == b); // false
- System.out.println(a == c); // true
- // 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
- String s1 = new String("hello");
- String s2 = new String("hello");
- String s3 = new String("world");
- String s4 = s1;
- System.out.println(s1 == s2); // false
- System.out.println(s2 == s3); // false
- System.out.println(s1 == s4); //
String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照
如下规则进行比较,比如: s1.equals(s2)
- public boolean equals(Object anObject) {
- // 1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回true
- if (this == anObject) {
- return true;
- } /
- / 2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false
- if (anObject instanceof String) {
- // 将anObject向下转型为String类型对象
- String anotherString = (String)anObject;
- int n = value.length;
- // 3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false
- if (n == anotherString.value.length) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = 0;
- // 4. 按照字典序,从前往后逐个字符进行比较
- while (n-- != 0) {
- if (v1[i] != v2[i])
- return false;
- i++;
- } r
- eturn true;
- }
- } r
- eturn false;
- public static void main(String[] args) {
- String s1 = new String("hello");
- String s2 = new String("hello");
- String s3 = new String("Hello");
- // s1、s2、s3引用的是三个不同对象,因此==比较结果全部为false
- System.out.println(s1 == s2); // false
- System.out.println(s1 == s3); // false
- // equals比较:String对象中的逐个字符
- // 虽然s1与s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true
- // s1与s3引用的不是同一个对象,而且两个对象中内容也不同,因此输出false
- System.out.println(s1.equals(s2)); // true
- System.out.println(s1.equals(s3)); // false
- }
int compareTo(String s) 方法: 按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
- public static void main(String[] args) {
- String s1 = new String("abc");
- String s2 = new String("ac");
- String s3 = new String("abc");
- String s4 = new String("abcdef");
- System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1
- System.out.println(s1.compareTo(s3)); // 相同输出 0
- System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
- }
int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较
- public static void main(String[] args) {
- String s1 = new String("abc");
- String s2 = new String("ac");
- String s3 = new String("ABc");
- String s4 = new String("abcdef");
- System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
- System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
- System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
- }
常用方法
- public static void main(String[] args) {
- String s = "aaabbbcccaaabbbccc";
- System.out.println(s.charAt(3)); // 'b'
- System.out.println(s.indexOf('c')); // 6
- System.out.println(s.indexOf('c', 10)); // 15
- System.out.println(s.indexOf("bbb")); // 3
- System.out.println(s.indexOf("bbb", 10)); // 12
- System.out.println(s.lastIndexOf('c')); // 17
- System.out.println(s.lastIndexOf('c', 10)); // 8
- System.out.println(s.lastIndexOf("bbb")); // 12
- System.out.println(s.lastIndexOf("bbb", 10)); // 3
- public static void main(String[] args) {
- // 数字转字符串
- String s1 = String.valueOf(1234);
- String s2 = String.valueOf(12.34);
- String s3 = String.valueOf(true);
- String s4 = String.valueOf(new Student("Hanmeimei", 18));
- System.out.println(s1);
- System.out.println(s2);
- System.out.println(s3);System.out.println(s4);
- System.out.println("=================================");
- // 字符串转数字
- // 注意:Integer、Double等是Java中的包装类型,这个后面会讲到
- int data1 = Integer.parseInt("1234");
- double data2 = Double.parseDouble("12.34");
- System.out.println(data1);
- System.out.println(data2);
- }
- //大小写转换
- public static void main(String[] args) {
- String s1 = "hello";
- String s2 = "HELLO";
- // 小写转大写
- System.out.println(s1.toUpperCase());
- // 大写转小写
- System.out.println(s2.toLowerCase());
- }
- 字符串数组转换
- public static void main(String[] args) {
- String s = "hello";
- // 字符串转数组
- char[] ch = s.toCharArray();
- for (int i = 0; i < ch.length; i++) {
- System.out.print(ch[i]);
- } S
- ystem.out.println();
- // 数组转字符串
- String s2 = new String(ch);
- System.out.println(s2);
- String str = "hello world hello bit" ;
- String[] result = str.split(" ",2) ;
- for(String s: result) {
- System.out.println(s);
- }
- //拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.
- //代码示例: 拆分IP地址
- String str = "192.168.1.1" ;
- String[] result = str.split("\\.") ;
- for(String s: result) {
- System.out.println(s);
- }
- //注意事项:
- 1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .
- 2. 而如果是 "\" ,那么就得写成 "\\\\" .
- 3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符
intern 是一个native方法(Native方法指:底层使用C++实现的,看不到其实现的源代码),该方法的作用是手动将创建的String对象添加到常量池中
- public static void main(String[] args) {
- char[] ch = new char[]{'a', 'b', 'c'};
- String s1 = new String(ch); // s1对象并不在常量池中
- //s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中
- String s2 = "abc"; // "abc" 在常量池中存在了,s2创建时直接用常量池中"abc"的引用
- System.out.println(s1 == s2);
- } /
- / 输出false
- // 将上述方法打开之后,就会输出true
String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:
1. String类被final修饰,表明该类不能被继承
2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。