JavaSE学习值之--String类(一)

简介: JavaSE学习值之--String类(一)

 💕"不要同情自己,同情自己是卑劣懦夫的勾当!"💕

作者:Mylvzi

文章主要内容:JavaSE学习值之--String类

前言:

 在C语言中我们已经接触过字符串,在C语言中不存在字符串类型,存储字符串往往是通过字符数组或字符指针,同时C语言的库中也提供了很多与字符串有关的函数,如strcpy,strcat,strstr等等,但是这种将数据和操作方法分割的做法不符合面向对象编程的思想,所以在Java中提供了字符串类型--》String

 String类本质上是class,含有属性和方法,方法之中存放了大量且实用的与字符串有关的方法

下面就为大家详细讲解String类

一.String类

1.String类的属性

注意:Java中的字符串区别于C语言,并不存在“字符串以\0结尾”这种说法

2.字符串的构造

 下面介绍常见的三种字符串构造方法:

/**
         * 字符串构造
         */
        // 1.直接构造
        String str1 = "hello";
        System.out.println(str1);
        // 2.实例化一个String类对象
        String str2 = new String("hello");
        System.out.println(str2);
        // 3.通过字符数组的转化
        char[] arr = {'h','e','l','l','o'};
        String str3 = new String(arr);
        System.out.println(str3);

注意Java中String类是一种引用数据类型,存放的引用对象的地址,而不存储对象本身

// String类是一种引用类型,存储的是对象的地址
        // s1和s2引用的是不同对象 s1和s3引用的是同一对象
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;
        System.out.println(s1.length()); // 获取字符串长度---输出5
        System.out.println(s1.isEmpty()); // 如果字符串长度为0,返回true,否则返回false

注意:

1.String类有求字符串长度的方法通过:str.length()  

STtring类里面的length是一种方法,数组里面的是一种属性,方法有一个();

2.isEmpty方法用于判断字符串的长度是否为0

注意isEmpty判断的是字符串的长度,如果字符串是null,此时代表空引用,编译器会报错

String s1 = "";
        System.out.println(s1.length());// 输出0
        String s2 = null;
        System.out.println(s2.length());// 报错

3.被" "引起来的就是字符串,可直接调用方法

System.out.println("hello".length());// 输出5

3.String类对象的比较

1.==判断是否是同一引用(地址相同)

==

左右两边都是基本数据类型,比较的是值的大小,根据值是否相等返回false/true

左右两边都是引用数据类型,比较的是引用对象的地址是否相同,也就是是否是同一引用

// String类是一种引用类型,存储的是对象的地址
        // s1和s2引用的是不同对象 s1和s3引用的是同一对象
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;
        System.out.println(s1 == s2);// false
        System.out.println(s2 == s3);// false
        System.out.println(s1 == s3);// true

来看一种特殊情况:

 当我们直接引用字符串”hello“ 时,str1和str2却相等了?这是为什么?引用类型比较的不是地址吗?是的,比较的是地址。但对于"hello"这样的字符串来说,他是存储在堆区之中的”常量池“上,地址是固定的。也就是说,当第一次使用hello给str1赋值后,常量区上就已经存放了hello这个字符串,再次赋值是会先从常量池中的"hello"获取,获取的和str1是一样的"hello"(地址和值都是一样的)

2.equals 方法

 ==只能用来比较两个引用对象的地址是否相同,而大多数情况下我们是通过引用类型的内容来判断是否相等的,对于String类来说也是这样的,我们要比较的是字符串的具体内容,而String类中有一个自带的比较内容的方法-->equals(本质还是继承于Object类的

)

String str1 = "hello";
        String str2 = "hello";
        String str3 = "world";
        System.out.println(str1.equals(str2));// true
        System.out.println(str1.equals(str3));// false

总结:

 equals方法用来判断两个字符串的内容是否相同

3.compareTo以及他的接口

再来看String类的定义:

可以看见String类实现了Comparable接口,所以就要重写接口中的compareTo方法

比较思路:

如果两个字符串的长度不一样,先比较长度相同的部分,如果长度相同部分完全相同,则直接返回长度的差值(共同长度是最短字符串的长度)

代码示例:

String str1 = "hello";
        String str2 = "hello";
        String str3 = "world";
        String str4 = "helloworld";
        System.out.println(str3.compareTo(str1));// 15
        System.out.println(str1.compareTo(str2));// 0
        System.out.println(str4.compareTo(str1));// 输出5
        System.out.println("====================");
        String str5 = "abc";
        String str6 = "acc";
        System.out.println(str5.compareTo(str6));// 输出-1

compareToIgnoreCase方法

 在一些情况下,我们认为大写和小写只是形式上的不同,内容却是相同的,比如"hello"=="HELLO",在不考虑大小写的情况下进行比较,就可以利用方法

compareToIgnoreCase

String str1 = "hello";
        String str2 = "HELLO";
        String str3 = "HEllo";
        System.out.println(str1.compareToIgnoreCase(str2));// 0
        System.out.println(str1.compareToIgnoreCase(str3));// 0

总结:
1.compareTo方法返回的Int类型的数据,本质上是对应字符串在字典上的顺序(字典中,前面的字母是小的,后面的字母大,小写比所有大写大)

2.忽略大小写带来的形式上的不同,我们可以利用compareToIgnoreCase方法

3.自定义类型一定要重写equals方法和hashcode方法,因为你的逻辑是根据自定义类型的内容进行比较的

4. 字符串查找

 字符串查找也是字符串中非常常见的用法,String类中也提供了很多字符串查找的方法

1.charAt方法--》返回对应索引上的字符

String str1 = "abcdef";
        System.out.println(str1.charAt(0));// 输出a
        System.out.println(str1.charAt(1));// 输出b
        System.out.println(str1.charAt(2));// 输出c
        System.out.println(str1.charAt(-1));// 异常
        System.out.println(str1.charAt(100));// 异常

JavaSE学习值之--String类(二)+https://developer.aliyun.com/article/1413506


目录
相关文章
|
14天前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
32 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
11天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
16 2
|
13天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
14 1
|
17天前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
47 4
|
21天前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
22 2
|
27天前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
32 4
|
27天前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
55 2
|
25天前
|
C语言 C++
C++番外篇——string类的实现
C++番外篇——string类的实现
19 0
|
25天前
|
C++ 容器
C++入门7——string类的使用-2
C++入门7——string类的使用-2
20 0
|
25天前
|
C语言 C++ 容器
C++入门7——string类的使用-1
C++入门7——string类的使用-1
20 0