【Java课堂】String类(一)

简介: 对于刚学过C语言的小伙伴来说,String类可能比较陌生。在C语言中我们可以用指针来表示一串字符 如 char* p = "abcd" ,而在Java中我们可以用String类来直接表示 String p = "abcd"。

前言

       对于刚学过C语言的小伙伴来说,String类可能比较陌生。在C语言中我们可以用指针来表示一串字符  如 char* p = "abcd" ,而在Java中我们可以用String类来直接表示 String p = "abcd"。

是不是方便许多,同时String类还具有很多实用的方法,现在让我们开始String类的学习吧!

1.字符串构造

String 类提供的构造方式非常多,常用的有以下三种

public static void main(String[] args) {
        //使用常量串构造
        String s1 = "你好!";
        //直接 newString 对象
        String s2 = new String("我是");
        //使用字符数组进行构造
        char[] array ={'S','t','r','i','n','g','类'};
        String s3 = new String(array);
        //打印
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }

如果想了解更多方法,可以参考Java在线文档

【注意】

① String是引用类型,内部并不存储字符串本身,这点我们可以从原码看出,其内部分为两部分 分别为 value 【存储数组】和 hash【默认为0】

public static void main(String[] args) {
        // s1 和 s2引用的是不同对象 s1 和 s3引用的是同一对象
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;

② 在Java中 "" 引起来的也是String类型对象

1. // 打印"hello"字符串(String对象)的长度
2. System.out.println("hello".length());

2.String 对象的比较

字符串比较是常见的操作之一,比如:字符串排序。Java中总共提供4中方式:

==比较是否引用同一个对象  

注意:对于内置类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址

public static void main(String[] args) {
        //对于引用类型==比较的是引用中的地址
        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);//true

equals方法比较

equals是Object中的方法,但是String类中重写了该方法,用于比较String类中引用内容是否相同 用法如下

public static void main(String[] args) {
        //对于引用类型==比较的是引用中的地址
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        //equals比较: String对象中的逐个字符
        //虽然s1和s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true
        //s2和s3引用的不是同一个对象,而且两个对象中内容也不相同,因此输出true
        System.out.println(s1.equals(s2));
        System.out.println(s2.equals(s3));

关于equals更多细节可以参考:equals() 方法详解

ⅲ compareTo(String s) 方法:按照字典序进行比较


字典序:字符串大小的顺序


与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:


先按照字典序大小比较,如果出现不等的字符,直接返回这连个字符的大小差值

如果前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("abcdefg");
        String s5 = new String("ABC");
        System.out.println(s1.compareTo(s2));//不同输出字符差值-1
        System.out.println(s1.compareTo(s3));//相同输出0
        System.out.println(s1.compareTo(s4));//前k个字符完全相同,输出长度差值-4
        System.out.println(s1.compareTo(s5));//大写和小写判定为两个字符串

compareToIgnoreCase(String str) 方法:与 compareTo 方式相同,但是忽略大小写比较

public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = new String("aBc");
        String s3 = new String("ABc");
        String s4 = new String("abcdefg");
        String s5 = new String("ABC");
        System.out.println(s1.compareToIgnoreCase(s2));
        System.out.println(s1.compareToIgnoreCase(s3));
        System.out.println(s1.compareToIgnoreCase(s4));
        System.out.println(s1.compareToIgnoreCase(s5));
    }

3.字符串查找

字符串查找也是字符串中常见的操作,String类提供了常用查找方法:

方法 功能
char charAt(int index)【用到次数很多】 返回index位置上的字符,如果index为负数或者越界,则会抛出IndexOutOfBoundsException异常
int indexOf(int ch) 返回ch第一次出现的位置,没有返回-1
int indexOf(int ch , int fromindex) 从fromIndex位置开始找ch第一次出现的位置,没有返回-1
int indexOf(String str) 返回str第一次出现的位置,没有返回-1
int indexOf(String str, int fromindex) 从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch, int fromindex) 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
int lastIndexOf(String str) 从后往前找,返回str第一次出现的位置,没有返回-1
int lastIndexOf(String str,int fromIndex) 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1
public static void main(String[] args) {
        String str = "abc abc abc defg abc cba";
        System.out.println(str.length());//24
        System.out.println(str.charAt(2));//c
        System.out.println(str.indexOf('e'));//13
        System.out.println(str.indexOf('a',7));//8
        System.out.println(str.indexOf("abc"));//返回首字母a位置的值 0
        System.out.println(str.indexOf("abc",3));//4
        System.out.println(str.lastIndexOf('c'));//21
        System.out.println(str.lastIndexOf('c',20));//17
        System.out.println(str.lastIndexOf("abc"));//返回首字母a位置的值 17
        System.out.println(str.lastIndexOf("abc",16));//8
    }

注意:上述方法都是实例方法

4.转化

1. 数值、对象、布尔值转化为字符串

一般情况下数值、对象或布尔值是不行转化成字符串的,但是String类提供了一个valueOf方法可以把这些转化成字符串

具体操作如下

public static void main(String[] args) {
        String str1 = String.valueOf(123);
        String str2 = String.valueOf(6.6);
        String str3 = String.valueOf(true);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }

而对象转化成字符串有点复杂,如果该对象类型没有重写toString方法的话,valueOf就会调用Object类中的toString方法,最后字符串中存放的是该对象的hash值

public static void main(String[] args) {
        String str = String.valueOf(new Student(10));
        System.out.println(str);

如果该类重写了toString方法,那就存放是toString方法中的内容

class Student{
    int age;
    public Student(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) {
        String str = String.valueOf(new Student(10));
        System.out.println(str);
    }
}

2.大小写转化

String类中也提供了大小写转换的方法

小写转大写:toUpperCase()


大写转小写:toLowerCAse()


当上述两个方法只会对英文转换,对中文无效,同时改变大小写,并不是把当前字符串的值改变,而是产生新的字符串!

public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO";
        //小写转大写
        String ret = s1.toUpperCase();
        System.out.println(ret+" s1->"+s1);
        //大写转小写
        ret = s2.toLowerCase();
        System.out.println(ret+" s2->"+s2);
    }

3.字符串转数组

String类中还提供了一个toCharArray方法,可以把字符串有引用的数据提取出来转换为数组

public static void main(String[] args) {
        String s = "hello";
        //字符串数组
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.println(ch[i]);
        }
        System.out.println();
        //数组转字符串
        String s2 = new String(ch);
        System.out.println(s2);
    }

4.格式化

public static void main(String[] args) {
     String s = String.format("%d-%d-%d", 2019, 9,14);
     System.out.println(s);
}


相关文章
|
2天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
13 1
|
1天前
|
Java 开发者
在Java中,接口和超类在多态性中扮演着重要的角色
Java中的接口和超类支持多态性,接口作为规范,允许多继承和回调机制;超类提供基类,实现代码重用和方法重写,两者共同促进代码的灵活性和可维护性。
23 10
|
2天前
|
Java
Java并发Futures和Callables类
Java程序`TestThread`演示了如何在多线程环境中使用`Futures`和`Callables`。它创建了一个单线程`ExecutorService`,然后提交两个`FactorialService`任务,分别计算10和20的阶乘。每个任务返回一个`Future`对象,通过`get`方法获取结果,该方法会阻塞直到计算完成。计算过程中模拟延迟以展示异步执行。最终,打印出10!和20!的结果。
|
2天前
|
C++
【C++】string类(介绍、常用接口)
【C++】string类(介绍、常用接口)
15 2
|
2天前
|
存储 缓存 安全
【 Java中String源码分析(JVM视角你不来看看?】
【 Java中String源码分析(JVM视角你不来看看?】
9 0
|
6天前
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
24 4
|
6天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
25 3
|
6天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
16 1
|
8天前
|
Java
Java String类型转换成Date日期类型
Java String类型转换成Date日期类型
|
8天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别