JavaSE入门---认识String类、学习String类的相关方法

news2024/10/5 17:27:33

文章目录

  • 什么是String类?
  • String类的常用方法
    • 字符串构造(三种)
    • String对象的比较(四种)
    • 字符串查找
    • 转化
      • 数值和字符串转化
      • 大小写转化
      • 字符串和数组转化
      • 格式化
    • 字符串替换
    • 字符串拆分
    • 字符串截取
    • 字符串的其他方法
  • 字符串常量池
  • 字符串修改

什么是String类?

在C语言中要表示字符串只能使用字符数组或者字符指针,而且需要再使用标准库提供的字符串系列函数来完成大部分字符串相关的操作。但是这种将数据和操作数据的方法分开的方式不符合面向对象的思想,因此,Java专门提供了String类。

String类的常用方法

字符串构造(三种)

		//使用常量串构造
        String s1 = "hello";
        
        //直接new String对象
        String s2 = new String("hello");
        
        //通过字符数组构造
        char[] array = {'h','e','l','l','o'};
        String s3 = new String(array);

注:

  1. String是引用类型,内部并不存储字符串本身。
  2. 在Java中,“” 引起来的也是String类型对象。

String对象的比较(四种)

1. == 比较是否引用同一个对象
注:对于基本类型变量,比较的是两个变量中存储的值是否相同;
对于引用类型变量,比较的是两个引用变量引用的是否是同一个对象

		int a = 10;
        int b = 20;
        int c = 10;
        String s1 = new String("string1");
        String s2 = new String("string2");
        String s3 = s1;

        // 比较基本数据类型
        System.out.println(a==b);    //false
        System.out.println(a==c);    //true
        
        // 比较引用数据类型
        System.out.println(s1==s2);  //false
        System.out.println(s1==s3);  //true

2. boolean equals(Object o)
注:默认按照==比较 但是在自己重写之后可以按照自己定义的比较规则比较。

		String s1 = new String("string1");
        String s2 = new String("string2");
        String s3 = s1;

        System.out.println(s1.equals(s2));   //false
        System.out.println(s1.equals(s3));   //true

3. int compareTo(String s)
注:1 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小的差值。
2 如果两个字符串的长度不一样,且前K个字符相同,返回两个字符串长度的差值

		String s1 = new String("string1");
        String s2 = new String("string2");
        String s3 = s1;

        System.out.println(s1.compareTo(s2));    //-1
        System.out.println(s1.compareTo(s3));    //0

4. int compareToIgnoreCase(String s)
注: 和compareTo()比较方式一样,但是忽略大小写。

		String s1 = new String("String1");
        String s2 = new String("string2");
        String s3 = s1;

        System.out.println(s1.compareToIgnoreCase(s2));    //-1
        System.out.println(s1.compareToIgnoreCase(s3));    //0

字符串查找

		//得到字符串中位置为index的字符
        char ch = s1.charAt(index);

        
        //从前往后找 返回字符ch第一次出现的位置  没有返回-1
        int index = s1.indexOf(char ch);

        //从fromIndex开始往后找  找第一次出现字符ch的位置
        int index = s1.indexOf(ch,fromIndex);

        //从前往后找 返回字符串str 第一次出现的位置  没有返回-1
        int index = s1.indexOf(String str);

        //从fromIndex开始往后找  找第一次出现字符串str的位置
        int index = s1.indexOf(String str,fromIndex);

        
        //从后往前找 返回字符ch第一次出现的位置   没有返回-1
        int index = s1.lastIndexOf(char ch);

        //从fromIndex开始往前找  找第一次出现字符ch的位置
        int index = s1.lastIndexOf(char ch,fromIndex);
        
        //从后往前找 返回字符串str 第一次出现的位置  没有返回-1
        int index = s1.lastIndexOf(String str);
        
        //从fromIndex开始往前找  找第一次出现字符串str的位置
        int index = s1.lastIndexOf(String str,fromIndex);

转化

数值和字符串转化

 		//数字转字符串
        String s1 = String.valueOf(123);
        String s2 = String.valueOf(123.12);

        //字符串转数字
        int data1 = Integer.parseInt("123");
        double data2 = Double.parseDouble("123.12");

大小写转化

		String s1 = "hello";
        String s2 = "HELLO";

        //小写转大写
        String data1 = s1.toUpperCase();
        //大写转小写
        String data2 = s2.toLowerCase();

字符串和数组转化

		String s1 = "hello";
        char[] arr = {'w','o','r','l','d'};

        //字符串转数组
        char[] chars = s1.toCharArray();
        //数组转字符串
        String str = new String(arr);

格式化

		String s1 = String.format("%d-%d-%d",2000,10,1);
        System.out.println(s1);   //2000-10-1

字符串替换

		String s1 = "hello";

        //替换全部的单个字符或者替换全部的字符串
        String str1 = s1.replace('l','a');
        String str2 = s1.replace("he","ab");
        
        //替换全部的字符串
        String str3 = s1.replaceAll("ll","aa");
        
        //替换第一个字符串
        String str4 = s1.replaceFirst("he","ab");

字符串拆分

		String s1 = "hello world and people";
        
        //按“ ”将s1拆分 将结果保留在String数组中
        String[] ret1 = s1.split(" ");
        
        //按“ ”将s1拆分 拆分成2组 第二组和之后的信息是一个整体不再拆分
        String[] ret2 = s1.split(" ",2);

注:可以使用for-each语句进行多次拆分

字符串截取

		String s1 = "hello";

        //从1位置开始截取到结束
        String str1 = s1.substring(1);

        //截取1-3之间的部分 不包括3位置处  [1,3)
        String str2 = s1.substring(1,3);

字符串的其他方法

		String s1 = " hello ";
        
        //去掉字符串左右两侧的空格  保留中间的空格
        String str = s1.trim();

字符串常量池

		String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");

        System.out.println(s1==s2);      //true
        System.out.println(s3==s4);      //false

为什么 s1和s2创建方式相同 s1==s2,但是s3和s4创建方式也相同 s3!=s4 ?

这就不得不提到常量池了: 类似于,1、3.14、“hello”等字面类型的常量经常频繁使用,Java为了使程序运行的速度更快、更节省内存;就引入了常量池,当这些字面常量第一次创建的时候,Java先把他们存储到常量池中,再赋予变量,而在后面再次创建这些字面常量时,就会直接从常量池中查找,如果找到了则直接对变量赋值,如果没找到,则先存储到常量池中再对变量赋值。

在这里插入图片描述

注:

  1. intern():手动将字符串放到常量池中。
  2. Java为8种基本数据类型和String类都提供了常量池。
  3. ” “引起来的字符串都会放到常量池中。

字符串修改

String是一种不可变对象,是不能被修改的;所有涉及到修改字符串内容的操作都是创建一个新对象,然后修改新对象。

1. 直接修改

		String s1 = "hello";
        for (int i = 0; i < 100; i++){
            s1 += i;
        }

这种修改方式每次都会创建新的变量,然后在新的变量后面拼接i,最后让s1引用新的变量,如此这样重复100次。这样操作的消耗无疑是巨大的,每次都需要创建新的变量。

2. 借助StringBuffer或者StringBuilder

		StringBuffer stringBuffer = new StringBuffer("hello");
        for (int i = 0; i < 100; i++){
            stringBuffer.append(i);
        }

这种修改方式只会创建一次新的变量StringBuffer,然后每次都在这一个变量后面拼接i,拼接100次,最后调用StringBuffer的toString方法创建一个新的String对象,让s1引用这个对象;这样销毁就要小很多。

StringBuilder和StringBuffer的用法一样。

那么String、StringBuffer、StringBuilder有什么区别呢?

  1. String 的内容不可修改,StringBuffer、StringBuilder 的内容可以修改。
  2. StringBuffer和StringBuilder 的大部分功能是相似的,但区别是StringBuffer采用同步处理,属于线程安全操作;StringBuilder未采用同步处理,属于线程不安全操作。

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

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

相关文章

SOLIDWORKS 2024新功能 3D CAD三维机械设计10大新功能

SOLIDWORKS 2024新增功能 - 3D CAD三维机械设计 10大新增功能 1. 先前版本的兼容性 •利用您订阅的 SOLIDWORKS&#xff0c;可将您的 SOLIDWORKS 设计作品保存为旧版本&#xff0c;与使用旧版本 SOLIDWORKS 的供应商无缝协作。 •可将零件、装配体和工程图保存为最新版本…

【CSS】常见 CSS 布局

1. 响应式布局 <!DOCTYPE html> <html><head><title>简单的响应式布局</title><style>/* 全局样式 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}/* 头部样式 */header {background-color: #333;color: #fff;padding: …

【C语言练习题】添加逗号

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;C语言练习题 添加逗号 1. 题目2.讲解3.代码总结 1. 题目 牛客网在线OJ 2.讲解 因为数字位数可能不全是3的倍数&#xff0c;比如&#xff1a;23&#xff0c;445&#xff0c;555。所以我们从后向前进行&…

“我有一个大胆的想法”?Meta AI 新技术让你的思维图像一览无余!

夕小瑶科技说 原创 作者 | 付奶茶 大家之前是否想象过未来的技术进步会带来读脑器&#xff0c;计算界面是否有可能越过触摸屏、键盘进入我们思维内部读取我们脑袋中所想。尽管当前我们社会尚未达到这一阶段&#xff0c;但我们确实逐渐接近这一愿景&#xff01; 不久前&#x…

DDR电源硬件设计要点

一、DDR电源简介 1. 电源 DDR的电源可以分为三类: a、主电源VDD和VDDQ,主电源的要求是VDDQ=VDD,VDDQ是给IO buffer供电的电源,VDD是给但是一般的使用中都是把VDDQ和VDD合成一个电源使用。 有的芯片还有VDDL,是给DLL供电的,也和VDD使用同一电源即可。电源设计时,需要考…

【PyTorch】深度学习实践 02 线性模型

深度学习的准备过程 准备数据集选择模型模型训练进行推理预测 问题 对某种产品花费 x 个工时&#xff0c;即可得到 y 收益&#xff0c;现有 x 和 y 的对应表格如下&#xff1a; x &#xff08;hours&#xff09; y&#xff08;points&#xff09;12243648 求花费4个工时可得…

回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BP-Adaboost的BP…

C# 程序运行无法加载 C++ DLL“xxx.dll”: 找不到指定的模块 Exception from HRESULT: 0x8007007E

背景:由于公司需要集成期货公司的提供的DLL&#xff0c;在本地开发调试时运行正常&#xff0c;放到web服务器后运行提示找不到指定模块错误代码Exception from HRESULT: 0x8007007E 原因&#xff1a;可能是由于服务器的C:\Windows\SysWOW64系统文件夹下的模块有缺失。 排查 下载…

剑指Offer || 054.把二叉搜索树转换为累加树

题目 给定一个二叉搜索树&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也…

【FISCO-BCOS】十八、使用docker部署区块链

目录 前言&#xff1a; docker&#xff1a; 一、安装docker docker部署区块链&#xff1a; 一、 搭建单群组4节点区块链 二、启动区块链 三、检查容器 四. 查看节点 前言&#xff1a; 关于FISCOBCOS部署区块链的方式&#xff0c;我们已经学习过了很多种&#xff0c;如多群组部…

Java代理

一、代理模式 代理模式定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 上面类图中有一个订单接口类(OrderService)、一个订单实现类(OrderServiceImpl)&#xff0c;订单模块的业务相对复杂和重要&#xff0c;如果这时候要在方法执行前后加上日志&#xff0c…

三种字符串格式化方法(%、format、f-string)

一、使用 % name 第一帅 print(我是宇宙无敌天下%s % name) age 18 print(我是宇宙无敌天下%s&#xff0c;我今年%d岁%(name,age)) price 5.99print(白心火龙果单价是%.1f元一斤%price)二、使用 format 在字符串中&#xff0c;使用{ }进行占位&#xff0c;然后在字符串后…

关于编程生成的目标文件到底是怎么链接生成可执行文件的

以c/c程序为例&#xff0c;要想生成可执行文件&#xff0c;需要经过如下步骤&#xff1a; #mermaid-svg-u1JzuqIf7rGHTIIk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u1JzuqIf7rGHTIIk .error-icon{fill:#55222…

SLAM从入门到精通(rviz自定义形状)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 rviz作为很好的上位机调试工具&#xff0c;它本身可以显示很多的传感器数据。比如说lidar、map、tf、camera、点云这些&#xff0c;在rviz上面显示…

Stable Diffusion新玩法火了!给几个词就能生成动图,连动图人物的表情和动作都能随意控制

夕小瑶科技说 原创 作者 | 小戏 单说大模型 AI 的发展对人们想象力释放的助力&#xff0c;基于 Stable Diffusion 模型的方法首当其冲。透过文本描述到图像生成技术&#xff0c;大模型为我们的想象力打开了一个恢弘的梦幻世界。透过点滴文字&#xff0c;就有可能重现禁锢在我们…

【Java 进阶篇】深入浅出:Bootstrap 轮播图

在现代网页设计中&#xff0c;轮播图是一个常见的元素。它们可以用于展示图片、广告、新闻、产品或任何您希望吸引用户注意力的内容。要实现一个轮播图&#xff0c;您通常需要一些复杂的HTML、CSS和JavaScript代码&#xff0c;这对于初学者来说可能会感到困难。但幸运的是&…

HWUI源码剖析(二) - 终于讲清楚OpenGL渲染的MVP矩阵的来龙去脉

概述 研究android8.1 HWUI源码的过程中,发现OpenGL是绕不过的一个知识点,不理解OpenGL的绘制基础,必然无法很好的理解Hwui基本原理,同时熟悉OpenGL之后,HWUI也是一个非常优秀的OpenGL 2D渲染的代码,本文将介绍一下OpenGL绘制图形的重要原理,为学习HWUI源码扫清障碍,本…

04、Python 爬取免费小说思路

目录 Python 爬取免费小说思路代码解析爬取东西基本的四行代码:user-agent安装模块从 bs4 导入 BeautifulSoup ,查询某个标签开头的数据筛选遍历获取小说的章节名称每章小说的链接获取请求网址的响应获取小说的内容筛选内容整理内容爬取下载到指定文件夹完整代码:Python 爬取…

HTML+CSS+JS+Django 实现前后端分离的科学计算器、利率计算器(附全部代码在gitcode链接)

&#x1f9ee;前后端分离计算器 &#x1f4da;git仓库链接和代码规范链接&#x1f4bc;PSP表格&#x1f387;成品展示&#x1f3c6;&#x1f3c6;科学计算器&#xff1a;1. 默认界面与页面切换2. 四则运算、取余、括号3. 清零Clear 回退Back4. 错误提示 Error5. 读取历史记录Hi…

2023年【化工自动化控制仪表】最新解析及化工自动化控制仪表作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 化工自动化控制仪表最新解析参考答案及化工自动化控制仪表考试试题解析是安全生产模拟考试一点通题库老师及化工自动化控制仪表操作证已考过的学员汇总&#xff0c;相对有效帮助化工自动化控制仪表作业考试题库学员顺…