调皮的String及多种玩法(上部)

2024-03-16 22:04

本文主要是介绍调皮的String及多种玩法(上部),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

👨‍💻作者简介:👨🏻‍🎓告别,今天

📔高质量专栏 :☕java趣味之旅

欢迎🙏点赞🗣️评论📥收藏💓关注

💖衷心的希望我的📙作品能给大家带来收获。

🎊前言:

让我们如大自然般🌱悠然自在😊地生活一天吧,
别因为有坚果外壳或者蚊子翅膀落在铁轨上🛤️而翻了车🚆。让我们该起床时🛏️就赶紧起床🛏️,
该休息🛏️时就安心休息🛏️,
保持安宁而没有烦扰的心态;身边的人要来就让他来,要去就让他去,
让钟声🕰️回荡,让孩子👼哭喊—
下定决心好好地过一天。


🙏希望大家都可以过好每一天。也🙏希望我的博客,能给大家带来💯收获。

1.String类的重要性 

C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提 供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。

在面试中也频繁被问到,比如:String、StringBuffStringBulider之间的区别等。

2.String的常用方法

2.1 字符串构造

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

public 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);

}

 其他方法需要用到时,大家参考Java在线文档:String官方文档-传送口

【注意】:

1.String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类实例变量如下:

public static void main(String[] args) {

// s1s2引用的是不同对象 s1s3引用的是同一对象

String str = new String("hello");

String str1 = new String("hi");

String str3 = str;

String str2 = null;//st2这个引用 不指向任何对象;

String str4 = " ";

System.out.println(s1.length()); // 获取字符串长度---输出5

System.out.println(s1.isEmpty()); // 如果字符串长度为0,返回true,否则返回false

System.out.println(str2.isEmpty());//报空指针异常

System.out.println(str4.isEmpty());//true

}

//打印str3也是hello

该图例并没有常量池
该图例并没有常量池

2. Java“”引起来的也是String类型对象。

// 打印"hello"字符串(String对象)的长度

System.out.println("hello".length());

3. String对象的比较

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

3.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); // true
}

1. boolean equals(Object anObject) 方法:按照字典序比较  

字典序:字符大小的顺序

String类重写了父类Objectequals方法,Objectequals默认按照==比较,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++;
}
return true;
}
}
return 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
}

 2. 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
}

比较大小的时候对应字符进行比较
1.对应字符不一样,就看对应字符的Ascll码值
2.对应字符长度不一样,返回值是对应的Ascll码的差值 

3. boolean equalsIgnoreCase(Object anObject) 方法:与equals方式相同,但是忽略大小写比较

public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ABc");
System.out.println(s1. equals(s2)); // fase
System.out.println(s1. equalsIgnoreCase(s2)); // true
}

4. 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
}

 4. 字符串查找

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

public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s.charAt(3));//返回下标为3的字符d
System.out.println(s.charAt(-1));//报错
System.out.println(s.charAt(100));//报错

 

public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.indexOf('c'));//默认从0开始,返回对应字符出现的下标位置,从头开始一个一个查。6
System.out.println(s.indexOf('c', 10)); //从10位置开始找c第一次出现的位置 15
System.out.println(s.indexOf("bbb")); // 从一个字符串找另一个字符串  3
System.out.println(s.indexOf("bbb", 10)); //从10位置开始找bbb第一次出现的位置 12

 

public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.lastIndexOf('c')); //从后往前找c的位置 17
System.out.println(s.lastIndexOf('c', 10)); //从10下标位置往前找c的位置 8
System.out.println(s.lastIndexOf("bbb")); // 12
System.out.println(s.lastIndexOf("bbb", 10)); // 3

5. 字符串的转化

1. 数值和字符串转化

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

补充:

包装类:首先是一个类,其次类中有更多的方法,使用起来更方便

序列化是指把对象转化为字符串

反序列化,是指把字符串转化为对象

2. 大小写转换 

public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
System.out.println(s1);//为什么依然输出hello
// 大写转小写
System.out.println(s2.toLowerCase());
}

以上的转换不是在原来的字符串进行转换,而是生成一个新的。因为在JAVA中String是不可变的 

3. 字符串转数组

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

 

🎊总结

以上就是对String的简单介绍以及简单方法的运用,后面就会讲关于String的一些oj题和进阶方法。

这篇关于调皮的String及多种玩法(上部)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816857

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Java文件上传的多种实现方式

《Java文件上传的多种实现方式》文章主要介绍了文件上传接收接口的使用方法,包括获取文件信息、创建文件夹、保存文件到本地的两种方法,以及如何使用Postman进行接口调用... 目录Java文件上传的多方式1.文件上传接收文件接口2.接口主要内容部分3.postman接口调用总结Java文件上传的多方式1

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

hdu2072(string的应用)

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25447    Accepted Submission(s): 5957 Problem Description lily的好朋友xiaoou333最近很空,他

【UVA】10739 - String to Palindrome(动态规划)

比较水的动态规划 dp[i][j] 将原串 i ~ j 之内的字符转化为回文字符所需要的最小操作次数 其中删除操作和添加操作本质上是一样的。 三个状态转移方程: dp[i][j] = min(dp[i][j] ,dp[i + 1][j]); dp[i][j] = min(dp[i][j] ,dp[i + 1][j - 1]); dp[i][j] = min(dp[i][j] ,dp[

理解String的compareTo()方法返回值

compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序), 如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值。 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符作比较, 以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。 我们可以通过阅读源码加深对compareTo()的理解: comp