java:Java中的String详解

目录

前言:

 String类的常用方法

1.构造方法:

2.字符串比较:

3.字符串查找:

4.字符串转化:

StringBuffer和StringBuilder: 强大的字符串处理工具

1. StringBuffer和StringBuilder的作用和区别

2. StringBuilder常用方法和与String的比较

String类的不可变性特性及其原因

String类的不可变性:

原因:

不可变对象的优点和适用场景

优点:

适用场景:

字符串修改的效率问题

直接对String对象修改和使用StringBuffer/StringBuilder的效率差异

直接对String对象修改:

使用StringBuffer/StringBuilder:

推荐频繁修改字符串时使用StringBuffer/StringBuilder

频繁修改字符串时:

效率比较:

实际应用场景:使用String类和StringBuffer/StringBuilder类处理字符串

实际应用效果:


前言:

String类在Java中非常重要,因为它是用于表示和操作字符串的核心类。在C语言中,要表示字符串只能使用字符数组或字符指针,而Java为了更方便地处理字符串,专门提供了String类。

在Java开发和编程中,字符串是一种非常常见的数据类型,经常用于各种操作和场景,比如:

  • 字符串拼接:将多个字符串连接在一起
  • 字符串比较:判断两个字符串是否相等或大小关系
  • 字符串查找:在字符串中查找特定字符或子串
  • 字符串替换:用一个新的字符串替换原有的字符串内容
  • 字符串截取:从一个字符串中截取出部分内容
  • 字符串转换:将字符串转换为其他数据类型或格式

     在开发中,经常会遇到需要处理字符串的情况,比如用户输入、文件读取、网络通信等。因此,熟练掌握String类的基本用法和常见操作是非常重要的。在面向对象编程中,String类的引入也符合面向对象的思想,将数据和操作数据的方法封装在一起,提高了代码的可维护性和可读性。


 String类的常用方法

1.构造方法

  • 使用常量串构造:通过直接赋值字符串常量来创建String对象。
  • 直接new String对象:使用new关键字创建String对象。
  • 使用字符数组进行构造:通过字符数组构造String对象。
    String s1 = "hello bit";
    String s2 = new String("hello bit");
    char[] array = {'h','e','l','l','o','b','i','t'};
    String s3 = new String(array);

2.字符串比较

  • 使用==比较是否引用同一个对象。
  • 使用equals(Object anObject)方法按照字典序比较字符串内容。
  • 使用compareTo(String s)方法按照字典序进行比较。
  • 使用compareToIgnoreCase(String str)方法进行忽略大小写比较。
    String s1 = new String("hello");
    String s2 = new String("world");
    String s3 = s1;
    System.out.println(s1 == s2); // false
    System.out.println(s1.equals(s2)); // true
    System.out.println(s1.compareTo(s2)); // -15
    System.out.println(s1.compareToIgnoreCase(s2)); // -15

3.字符串查找

  • 使用charAt(int index)方法返回指定位置的字符。
  • 使用indexOf和lastIndexOf方法查找字符或子字符串的位置。
    String s = "hello world";
    System.out.println(s.charAt(1)); // 'e'
    System.out.println(s.indexOf('o')); // 4
    System.out.println(s.lastIndexOf('o')); // 7

4.字符串转化

  • 使用valueOf方法将数值、布尔值、对象等转化为字符串。
  • 使用toUpperCase和toLowerCase方法进行大小写转换。
    String s1 = String.valueOf(1234);
    String s2 = String.valueOf(true);
    String s3 = "hello";
    System.out.println(s1); // "1234"
    System.out.println(s2); // "true"
    System.out.println(s3.toUpperCase()); // "HELLO"

StringBuffer和StringBuilder: 强大的字符串处理工具

      在Java中,除了String类外,还有StringBuffer和StringBuilder这两个类用于处理可变的字符串。它们提供了更灵活的字符串操作方法,让我们来深入了解它们的作用和区别。

1. StringBuffer和StringBuilder的作用和区别

  • StringBuffer

    • StringBuffer是线程安全的,所有的方法都是同步的,适合在多线程环境下使用。
    • 由于线程安全的特性,性能相对较低,适合在多线程环境下进行字符串操作。
  • StringBuilder

    • StringBuilder是非线程安全的,性能比StringBuffer更高,适合在单线程环境下使用。
    • 由于非线程安全的特性,StringBuilder的操作速度更快,适合在单线程环境下进行频繁的字符串操作。

2. StringBuilder常用方法和与String的比较

StringBuilder类提供了丰富的方法来操作可变的字符串,以下是一些常用方法和与String的比较:

  • 常用方法
    • append(String str): 在尾部追加字符串。
    • charAt(int index): 获取指定位置的字符。
    • length(): 获取字符串长度。
    • deleteCharAt(int index): 删除指定位置的字符。
    • insert(int offset, String str): 在指定位置插入字符串。
    • reverse(): 反转字符串。
    • toString(): 将StringBuilder转换为String。
      StringBuilder sb = new StringBuilder("hello");
      sb.append(" world");
      System.out.println(sb); // 输出: hello world
      System.out.println(sb.charAt(1)); // 输出: 'e'
      System.out.println(sb.length()); // 输出: 11
      sb.deleteCharAt(5); // 删除索引为5的字符
      System.out.println(sb); // 输出: helloorld
      sb.insert(5, " "); // 在索引5处插入空格
      System.out.println(sb); // 输出: hello world
      sb.reverse(); // 反转字符串
      System.out.println(sb); // 输出: dlrow olleh

  • 与String的比较
    • StringBuilder是可变的,可以直接修改字符串内容,而String是不可变的,每次修改都会创建新的对象。
    • 在频繁修改字符串内容时,使用StringBuilder效率更高,避免不必要的对象创建和内存消耗。

String类的不可变性特性及其原因

String类的不可变性

  • String类是不可变的,即一旦创建了String对象,其内容就不能被修改
  • String对象的内容在创建后不可更改,任何对String对象的操作都会返回一个新的String对象,而不会修改原始对象的内容。

原因

  • String类被设计为不可变的主要原因是为了提高程序的性能和安全性
  • 当字符串是不可变的时候,可以避免在多线程环境下出现并发访问的问题,因为不需要对字符串进行同步操作。
  • 不可变的字符串可以被缓存和重复使用,减少内存消耗和提高性能。
  • 不可变性还可以确保字符串在传递时不会被意外修改,增加程序的稳定性和可靠性。

不可变对象的优点和适用场景

优点

  • 线程安全:不可变对象是线程安全的,不需要额外的同步操作。
  • 缓存优化:不可变对象可以被缓存,提高内存利用率和性能。
  • 安全性:不可变对象不会被意外修改,避免了潜在的错误和安全漏洞。
  • 代码简洁:不可变对象可以简化代码逻辑,减少错误的发生。

适用场景

  • 字符串处理:在字符串处理中,不可变对象可以确保字符串内容不会被修改,适合用于存储常量字符串和文本。
  • 缓存和共享:不可变对象适合用于缓存和共享,可以提高性能和减少内存消耗。
  • 函数式编程:在函数式编程中,不可变对象可以避免副作用,使代码更加纯净和可靠。

字符串修改的效率问题

直接对String对象修改和使用StringBuffer/StringBuilder的效率差异

直接对String对象修改

  • 当直接对String对象进行修改时,每次修改都会创建一个新的String对象,原始对象不会被修改。
  • 这种方式会导致频繁的对象创建和销毁,消耗大量的内存和时间。

使用StringBuffer/StringBuilder

  • StringBuffer和StringBuilder是可变的字符串类,可以直接修改字符串内容而不创建新对象
  • 当需要频繁修改字符串内容时,使用StringBuffer/StringBuilder可以避免不必要的对象创建和提高效率。

推荐频繁修改字符串时使用StringBuffer/StringBuilder

频繁修改字符串时

  • 如果需要在循环或多次操作中修改字符串内容,推荐使用StringBuffer或StringBuilder。
  • StringBuffer适用于多线程环境下,因为它是线程安全的,而StringBuilder适用于单线程环境下,性能更高。

效率比较

  • 使用StringBuffer/StringBuilder进行字符串修改的效率远高于直接对String对象进行修改。
  • StringBuffer/StringBuilder允许直接修改字符串内容,避免了不必要的对象创建和销毁,提高了程序的性能和效率。

示例

下面是一个比较直接对String对象修改和使用StringBuilder的效率的示例代码:

long start = System.currentTimeMillis();
String s = "";
for(int i = 0; i < 10000; ++i){s += i;
}
long end = System.currentTimeMillis();
System.out.println("直接对String对象修改耗时:" + (end - start) + "ms");start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 10000; ++i){sb.append(i);
}
end = System.currentTimeMillis();
System.out.println("使用StringBuilder耗时:" + (end - start) + "ms");

实际应用场景:使用String类和StringBuffer/StringBuilder类处理字符串

案例:处理用户输入的字符串并进行操作

import java.util.Scanner;public class StringProcessingExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 1. 从用户输入中获取字符串System.out.println("请输入一个字符串:");String inputString = scanner.nextLine();// 2. 使用String类进行字符串操作System.out.println("输入字符串的长度:" + inputString.length());System.out.println("输入字符串是否为空:" + inputString.isEmpty());// 3. 使用StringBuffer/StringBuilder进行字符串操作StringBuilder reversedString = new StringBuilder(inputString).reverse();System.out.println("反转后的字符串:" + reversedString);// 4. 查找特定字符在字符串中的位置char searchChar = 'a';int index = inputString.indexOf(searchChar);if (index != -1) {System.out.println("字符 '" + searchChar + "' 在字符串中的位置:" + index);} else {System.out.println("字符 '" + searchChar + "' 未在字符串中找到");}// 5. 拆分字符串为单词并输出String[] words = inputString.split(" ");System.out.println("输入字符串中的单词:");for (String word : words) {System.out.println(word);}}
}
实际应用效果:
  • 用户输入字符串后,程序会对字符串进行长度、是否为空、反转、查找特定字符位置、拆分单词等操作。
  • 使用String类和StringBuffer/StringBuilder类进行字符串操作,展示了不可变字符串和可变字符串的区别和效果。
  • 通过实际案例展示了如何处理用户输入的字符串,并展示了字符串操作的实际应用场景和效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ModuleNotFoundError: No module named google.protobuf 亲测有效

真的无语了每次都是环境bug&#xff0c;这次又遇上了ModuleNotFoundError: No module named google.protobuf 我先尝试了 pip uninstall protobuf pip uninstall google pip install google pip install protobuf接着还是没起色&#xff0c;我试了试 conda install -c anaco…

探索通过GPT和云平台搭建网安实战培训环境

项目背景 网络安全是一个不断演变的领域&#xff0c;面临着日益复杂的挑战和不断扩大的威胁。数字化时代&#xff0c;随着勒索攻击、数据窃取、网络钓鱼等频频出现&#xff0c;网络攻击的威胁指数和影响范围进一步增加&#xff0c;如何防范网络攻击&#xff0c;确保数据安全&a…

测试技术的发展趋势是什么

测试技术的发展趋势是在不断提高灵敏度、精确度和可靠性的基础上&#xff0c;向小型化、非接触化、多功能化、智能化和网络化方向发展。 测试人员技能需求的转变&#xff1a;测试人员需要具备更多的技能&#xff0c;如编程、脚本编写、数据分析等&#xff0c;以适应自动化和AI…

HTML5+CSS3小实例:菜单按钮的三种切换动画

实例:菜单按钮的三种切换动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initia…

漂亮的个人主页源码

源码介绍 漂亮的个人主页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 漂亮的个人主页源码

原创: 重构证据定义以消解贝叶斯确证逻辑的内在矛盾

摘要&#xff1a;现行的贝叶斯确证逻辑沿袭传统确证逻辑的证据观&#xff0c;不考虑经验事实与待确证假说之间逻辑关系的确证作用&#xff0c;因而存在着旧证据问题、非相干确证问题、乌鸦悖论等内在矛盾。依据科学方法论重新构筑证据的逻辑表达&#xff0c;厘清确证的量化过程…

【正则表达式】正则表达式基本语法元素

目录 字符类量词边界匹配逻辑和分组转义和特殊字符验证正则表达式是否能够成功提取数据 字符类 .&#xff1a;匹配除换行符之外的任何单个字符。 [abc]&#xff1a;匹配方括号内的任何字符。 [^abc]&#xff1a;匹配不在方括号内的任何字符。 [a-z]&#xff1a;匹配任何小写字…

Linux安装 swoole

第一步:去官网下载swoole扩展包 ,下载地址&#xff1a; https://github.com/swoole/swoole-src/releases,下载后放入服务器根目录即可。 第二步:cd 进到该目录。执行命令/www/server/php/71/bin/phpize(注:当时我php版本是7.1)&#xff0c;该命令执行成功后应该提示如下: Con…

DZY Loves Chemistry (并查集)

//新生训练 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; bool a[60][60]; bool vis[60]; int n; long long int cnt; void bfs(int x) {int y;queue<int> q;v…

真实世界的密码学(二)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第六章&#xff1a;非对称加密和混合加密 本章内容包括 对秘密信息进行加密的非对称加密方法 对数据进行加密到公钥的混合加密方法 非对称和…

mysql基础11——索引

索引 mysql高效访问数据的方式——>索引 快速检索数据的存储结构 索引分为单字段索引和双字段索引 单字段索引 创建单字段索引&#xff1a; 方式1&#xff1a;create直接创建索引 create index 索引名 on table 表名&#xff08;字段&#xff09;; 方式2&#xff1…

容器环境下 JVM 设置最佳实践

文章目录 背景解决堆内存配置jdk 版本 < 8u131jdk 版本 8u131~191jdk 版本 8u191+非堆内存配置CPU 配置最佳实践RainBond 堆内存实践第 1 步:编写 shell 脚本第 2 步:调整 Dockerfile 使用脚本设置内存完整的 Dockerfile 及 shell 脚本参考

R:UpSet韦恩图制作

#安装UpSetR install.packages("UpSetR") library(UpSetR) #install.packages("UpSetR") library(UpSetR) library(Cairo) # 从CSV文件中读取数据 setwd("C:/Users/fordata/Desktop/研究生/第二个想法(16s肠型&#xff0b;宏基因组功能)/第二篇病毒组…

互连芯片浪潮席卷AI服务器:突破瓶颈,再创辉煌

改变AI服务器&#xff1a;互连芯片技术创新和突破 AI服务器崛起&#xff0c;引领未来创新根据TrendForce数据&#xff0c;AI服务器出货量达130,000台&#xff0c;占服务器总出货量的1%。主要制造商推出生成式AI产品&#xff0c;推动订单激增。ChatGPT等应用的需求持续增长&…

使用WebSocket实现答题积分排名实时更新的功能

需求分析 接到一个需求&#xff0c;是一个答题积分小程序&#xff0c;其中有一个功能需求是需要实时更新答题积分排名的。之前通常比较常见的需求&#xff0c;都是指定某个时间点才更新答题排行榜的数据的。 经过技术调研&#xff0c;要实现答题积分排名实时更新的功能&#…

加速产能!推荐五款制造业项目管理软件

随着技术的不断发展&#xff0c;许多制造企业开始意识到使用制造业项目管理软件的重要性。在本文中&#xff0c;我们将探讨适用于制造业的项目管理软件&#xff0c;制造业项目管理软件推荐&#xff0c;以帮助项目团队更加高效管理资源。 制造业项目管理难题 怎样正确利用工作资…

Redis底层数据结构之SDS

目录 一、概述二、SDS结构三、为什么使用SDS 下一篇 redis底层数据结构之ziplist 一、概述 Redis 中的 SDS&#xff08;Simple Dynamic String&#xff0c;简单动态字符串&#xff09;是 Redis 用于存储字符串值的底层实现&#xff0c;是对 C 语言传统字符串&#xff08;以 nu…

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户&#xff0c;然后通过本地电脑telnet 软件ensp中的设备&#xff0c;尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

前端开发与html学习笔记

一、前端开发概述 前端开发&#xff1a;也叫做web前端开发&#xff0c;它指的是基于web的互联网产品的页面(也可叫界面)开发及功能开发互联网产品&#xff1a;指网站为满足用户需求而创建的用于运营的功能及服务&#xff0c;百度搜索、淘宝、QQ、微博、网易邮箱等都是互联网产…

Java基础之继承、多态、抽象类

Java基础 1.猜数字小游戏 import java.util.Random; import java.util.Scanner;public class MathTest {public static void main(String[] args) {// 猜数字小游戏//int randomValue (int) (Math.random() * 100 1); 随机产生[1,101)之间的整数Random random new Random(…