String类

String类

String类是Java中的字符串类型,它是引用类型

三种常用的字符串构造

public class Test {public static void main(String[] args){String str1 = "hello";String str2 = new String("hello");char[] array = {'h','e','l','l','o'};String str3 = new String(array);}
}

其中str1的写法是str2的简化版,注意这里不涉及常量池的概念,后文会引入常量池重新画图

练习

 使用equals比较字符串的值是否相同

使用comparaTo方法比较俩个字符串的大小

public class Test {public static void main(String[] args) {String str1 = "hello";String str2 = "hello";int ret = str1.compareTo(str2);if(ret > 0 ){System.out.println("s1>s2");}else if(ret<0){System.out.println("s1<s2");}else {System.out.println("s1==s2");}}
}

关于comparaTo方法,之前的文章有详细的介绍 

字符串查找的方法

char charAt(int index) 返回Index位置上字符

遍历字符串"hello"中的每一个字符

public static void main(String[] args) {String str = "hello";for (int i = 0; i < str.length(); i++) {System.out.printf(str.charAt(i)+" ");}}

 int indexOf(char ch)  找到字符串中第一个出现ch的位置下标,如果没找到就返回-1

   public static void main(String[] args) {String str = "hello";System.out.println(str.indexOf('l'));}

int indexOf(char ch,int index) 从字符串中index位置开始找,找到第一次出现ch的下标

 

  public static void main(String[] args) {String str = "hello";System.out.println(str.indexOf('l',3));}

 int indexOf(String str)在字符串str1中找字符串 str并返回其下标

public static void main(String[] args) {String str = "abdegababcge";System.out.println(str.indexOf("abc"));}

String[] args 

字面上就是一个名为args的字符串数组,运行时命令行参数,通过命令行输入的参数就会传入到这个数组中

字符串转换

String.valueOf(各种类型)

    public static void main(String[] args) {int a = 123;int b = 456;String str1 = String.valueOf(a);String str2 = String.valueOf(b);System.out.println(a+b);System.out.println(str1+str2);}

其它类型转换成字符串,类型的包装类.parse类名(字符串) 

 public static void main(String[] args) {String str = "123";int a = Integer.parseInt(str);System.out.println(a+1);}

toUpperCase 把字符串中的小写字母变成大写 

 public static void main(String[] args) {String str = "abcdef123";String str2 = str.toUpperCase();System.out.println(str2);}

toCharArray  把字符串改成字符数组

public static void main(String[] args) {String str = "abcdef";char[] array = str.toCharArray();for (int i = 0; i < array.length; i++) {System.out.print(array[i]+" ");}}

 

 字符串拆分

 String[] split(依据的分隔符)

    public static void main(String[] args) {String str = "zhangsan&wangwu";String[] strings = str.split("&");for (int i = 0; i < strings.length; i++) {System.out.println(strings[i]);}}

如果又多个分隔符 可以用 '|" 隔开

  public static void main(String[] args) {String str = "name=zhangsan&age=18";String[] strings = str.split("=|&");for (int i = 0; i < strings.length; i++) {System.out.println(strings[i]);}}

 

字符串截取

 String substring(int begain,int end)

 public static void main(String[] args) {String str = "hello";System.out.println(str.substring(1,4));}

trim() 出除去字符串中左右俩边的空格

 public static void main(String[] args) {String str = "    hello  world   ";System.out.println(str);System.out.println(str.trim());}

 字符串常量值(底层是StringTable的哈希表)

首先看如下代码

    public static void main(String[] args) {String str1 = "hello";String str2 = "hello";String str3 = new String("hello");String str4 = new String("hello");System.out.println(str1 == str2);System.out.println("--------------------");System.out.println(str3 == str4);System.out.println("--------------------");System.out.println(str1 == str3);System.out.println("--------------------");System.out.println(str1 == "hello");System.out.println("--------------------");System.out.println(str3 == "hello");}

结果 

  你知道是什么原因吗?

String str1 = "hello";

如果是这种直接用双引号引起来,没有New,会先检查常量池(String Table)有没有字符串常量"hello",如果没有就把"hello"放入到常量池中,如果常量池中已经有"hello"了,就直接指向这个常量池中的"hello",这里是在常量池中放入了一个"hello"

String str2 = "hello";

和刚刚一样,会先检查常量池有没有"hello",很显然,这次常量池中有"hello",此时就直接指向这个常量池中的"hello"

因此str1==str2,它们指向同一个地址(引用)

而str3 和 str4,是自己New了一个引用指向常量池的"hello",因此又是一个新的地址.所以str3 和 str4不指向同一个地址,str1和str3的地址当然也是不一样的
String3 = new String("hello"),这里有俩步(如果常量池没有"hello"的话),第一步把hello放入常量池,第二步重申请一个空间再指向常量池中的"hello"

同样用双引号引起来的就是常量池中的字符串(如果有直接指向,没有就放入),因此这里的str1会等于"hello",而str3指向的不是常量池中的"hello",因此它们的地址不相等

  intern(),手动把字符串放到常量池中

字符串不可变

String里面的value数组是private类型,外界无法访问到,因此字符串是不可以被修改的,当然value数组类也被final修饰,指向也不可以改变,而String类同样也被final修饰,意味着这个类不可以被继承

StringBuilder 和 StringBuffer

字符串拼接

现在让字符串去拼接1w个数,看看它的执行效率

public static void main(String[] args) {String str = "abcd";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {str += i;}long end = System.currentTimeMillis();System.out.println(end-start);}

执行结果:

字符串在实现拼接的时候,其实是利用StringBuilder拼接的,虽然这个代码看上去没有StringBuilder,但是背后是用到的,它等价于如下代码

public static void main(String[] args) {String str = "abcd";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {StringBuilder stringBuilder = new StringBuilder();stringBuilder = stringBuilder.append(str);stringBuilder = stringBuilder.append(i);str = stringBuilder.toString();}long end = System.currentTimeMillis();System.out.println(end-start);}

 

可以看到字符串在拼接的时候,是先创建一个StringBuilder对象,再利用这个对象的append方法去拼接字符串,最后在使用toString方法把结果给原先的字符串

根据上述代码,我们可以把StringBuilder的创建放在for循环外面,这样在拼接过程中就只创建了一次SrtingBuilder对象,再把StringBuilder的对象的结果给原先字符串也拿出for循环

  public static void main(String[] args) {String str = "abcd";long start = System.currentTimeMillis();StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < 10000; i++) {stringBuilder = stringBuilder.append(str);stringBuilder = stringBuilder.append(i);}str = stringBuilder.toString();long end = System.currentTimeMillis();System.out.println(end-start);}

 

可以看到效率提升非常明显

Strinig StringBuilder StringBuffer的区别

String中的value数组被private修饰,且value数组被final修饰不可以改变指向该数组的引用,同样String类也被final修饰,String类不可以被继承..因此String类是不可以被修改的 ,我们修改的字符串最后返回的都是一个新的引用

StringBuilder 和 StringBuffer在单线程下没有太大区别,StringBuilder和StirnfBuffer是可以被修改的,返回的是它们本身....StringBuffer中的方法被synchronized 修饰,给该方法加锁,一般用在多线程场景下,保证线程安全.

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

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

相关文章

【Rust 基础篇】Rust 树形结构:实现与应用

导言 树形结构是计算机科学中一种常见的数据结构&#xff0c;它具有层级结构和递归特性。在 Rust 中&#xff0c;我们可以使用结构体和枚举等语言特性来定义树形结构&#xff0c;并通过引用和所有权等机制有效地管理数据。本篇博客将详细介绍 Rust 中树形结构的实现和应用&…

云计算——虚拟化层架构

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 前言 本章将会讲解云计算的虚拟化层架构&#xff0c;了解云计算虚拟化层都有哪些架构模式…

WPF嵌入外部exe应用程序-实现基本的嵌入

WPF嵌入外部exe应用程序 使用场景功能实现嵌入基本功能实现1.导入windows API2.运行外部程序3. 获取窗体句柄4. 嵌入窗体5.设置子窗体位置整个代码 嵌入存在的问题&#xff1a; 使用场景 在WPF桌面应用程序开发过程中&#xff0c;有时候需要将其他程序结合到一起&#xff0c;让…

mssql 以xml类型为存储过程传递不确定数量的参数

mssql 以xml类型传递不确定数量的参数 存储过程xml 处理在存储过程中参数在存储过程中使用 xml 作为参数存储过程 相信各位小伙伴在使用数据库的过程中,或多或少的建立了一些存储过程,并且带有一些参数,用来增加存储过程的适用性。 类似老顾的截图这样的,通常,我们需要将…

Flutter开发实战:妙用策略模式(Strategy Pa

拓维信息-品牌营销专员&#xff08;24届&#xff09; 岗位名&#xff1a;品牌营销专员&#xff08;24届&#xff09; 岗位类型&#xff1a;品牌专员 岗位职责&#xff1a; 1、参与公司品牌系统建设、负责展厅建设、媒体公关、自媒体运营、网络营销等工作&#xff0c;协同公司各…

Ocean Base-Oracle 查询表、表注释、字段、字段注释

Ocean Base-Oracle 查询所有表或视图、注释 SELECT * from user_tab_comments;Ocean Base-Oracle 查询一个表所有的字段、注释 SELECT u.column_name,c.comments,u.data_type FROM user_tab_columns uINNER JOIN user_col_comments c ON u.table_namec.table_name AND u.colu…

Redis基本全局命令(含key过期策略)

Redis基本全局命令 KEYEXISTSDELEXPIRETTLRedis的key过期策略TYPE KEY 返回所有满⾜样式&#xff08;pattern&#xff09;的key。⽀持如下统配样式。 h?llo 匹配 hello , hallo 和 hxlloh*llo 匹配 hllo 和 heeeelloh[ae]llo 匹配 hello 和 hallo 但不匹配 hilloh[^e]llo 匹配…

每日一题(set集合)-874. 模拟行走机器人

题目 874. 模拟行走机器人 题解思路 初始方向朝y轴正方向&#xff0c;遇到指令command -1 则向右转&#xff0c; 若为 -2 则向左转 定义方向[-1,0]、[0,1]、[1,0]、[0,-1] 分别为朝x轴负方向&#xff0c; y轴正方向&#xff0c; x轴正方向&#xff0c;y轴负方向初始方向为[…

Debian 系统安装中文输入法-iTOP3588开发板

Debian 系统烧写完成之后&#xff0c;并没有中文输入功能。本文档将介绍如何安装 ibus pinyin 输入法。 首先安装 fcitx 对应的工具&#xff0c;如下图所示&#xff1a; apt-get install fcitx fcitx-tools fcitx-config* fcitx-frontend* fcitx-module* fcitx-ui-* presage …

2023-7-13-第十八式观察者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

【LeetCode 算法】Walking Robot Simulation 模拟行走机器人 - 哈希

文章目录 Walking Robot Simulation 模拟行走机器人问题描述&#xff1a;分析代码哈希 Tag Walking Robot Simulation 模拟行走机器人 问题描述&#xff1a; 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以…

opencv-06 使用numpy.array 操作图片像素值

opencv-06 使用numpy.array 操作图片像素值 **1&#xff0e;二值图像及灰度图像****利用item 读取某一个像素值****利用itemset 修改像素值****彩色图像numpy.arry 像素值操作** numpy.array 提供了 item()和 itemset()函数来访问和修改像素值&#xff0c;而且这两个函数都是经…

基于MATLAB的无人机遥感数据预处理与农林植被性状估算

查看原文>>>基于MATLAB的无人机遥感数据预处理与农林植被性状估算 在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节…

Offset Explorer2 监视kafka的利器

kafka作为一个生产者和消费者集为一体的框架&#xff0c;消费者必须一直保持打开的状态&#xff0c;并且每隔一段时间接收一次数据&#xff0c;才能够保持生产者放入的数据及时被处理掉&#xff0c;而生产者则可以每隔一段时间发送一波数据&#xff0c;这样消费者就能够接收到了…

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员&#xff0c;我们经常需要对数据库中的数据进行增删改查&am…

前端node.js入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Node.js 入门 什么是 Node.js&#xff1f; 什么是前端工程化&#xff1f; Node.js 为何能执行 JS&…

kafka无消息丢失配置

目录 前言&#xff1a; 消息丢失的场景 生产者消息丢失 Broker消息丢失 消费者消息丢失 消息丢失问题排查 无消息丢失配置&#xff1a; 参考资料&#xff1a; 前言&#xff1a; 使用消息中间件时&#xff0c;我们遇到最头疼的事就消息丢失&#xff0c;小则影响程序错误&…

【数据结构】二叉树详解(2)

⭐️ 前言 ✨ 往期文章链接&#xff1a;二叉树的概念性质 上一篇我们讲了二叉树的结构定义&#xff0c;以及前序/中序/后序的递归遍历&#xff0c;还有一些二叉树的接口实现&#xff0c;本篇我们补充一个二叉树的接口 BinaryTreeDepth。✨上一篇文章链接&#xff1a;二叉树详…

【C++】命名空间、缺省参数和函数重载

文章目录 一、命名空间1.命名空间定义2.命名空间使用 二、缺省参数1.分类2.其他注意事项 三、函数重载总结 一、命名空间 在一个大型的项目中&#xff0c;不同成员写的程序中会不可避免的带来命名冲突的问题&#xff0c;这种情况下命名空间可以很好的解决这种命名冲突大的问题…

java面试真题【上册】

tips&#xff1a;下面简述题为java面试真题&#xff0c;阅读本文且感兴趣的&#xff0c;还有将要面试的小伙伴有条件的准备一下笔和纸&#xff0c;将之转述出来成为自己的知识&#xff0c;希望接下来的面试好运连连 目录 1.Java中的四种访问权限分别是什么&#xff1f;它们分…