【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);
}


相关文章
|
13天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
36 17
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
8天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
9天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
20 2
|
13天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
17天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
17天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
17天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
21 3
|
20天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
21 5
|
21天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
29 2