String 在Java中的用法详解

2023-11-01

1、创建字符串:

(1)常见的构造String的方式:

① 方式一:(直接赋值)

String str1 = "hello";

② 方式二:(构造方法)

String str2 = new String("hello");

③ 方式三:

char[] value = {'a','b','c','d'};
String str3 = new String(value);

三种方式的区别:
在这里插入图片描述
面试: String 类中两种对象实例化的区别

1、直接赋值:只会开辟一块对内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2、构造方法:会开辟两块堆内存空间,不会自动保存在对象池中,可以使用 intern() 方法手工入池

(2)String的基本概念:

string 是一种 引用类型,类似于 C语言中的指针
引用: 只能指向对象的数据结构
(我们可以把引用想象成一个标签,“贴”到一个对象上,一个对象可以贴一个或多个标签;如果一个对象没有一个标签就会被JVM当垃圾回收掉)

String str = "cool";
String str2 = "cool";

在这里插入图片描述
这时可能有人就会问了:
如果修改了 str ,str2 会随之改变嘛?

String str = "cool";
String str2 = "cool";
str = "beautiful";
System.out.println(str2);

//执行结果:  cool

在这里插入图片描述
事实上,str = “beautiful” 这样的代码并不能修改字符串,而是让 str 这个引用指向了一个新的 String 对象。(字符串内容不可变)

2、字符串比较相等:

(1)== 型:
基本数据类型比较的是数值的大小

int x = 10 ;
int y = 10 ;
System.out.println(x == y); 
// 执行结果
true

对于String来说,如果是直接赋值的话,因为两个引用指向字符串常量池中同一个对象,所以返回 true

String str1 = "Hello";
String str2 = "Hello"; 
System.out.println(str1 == str2); 
// 执行结果
true

若是构造方法的话,两个引用各自指向两个对象,因为new了两个对象,所以结果是false

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false

所以,String使用 == 比较的 并不是在比较字符串的内容,而是比较两个引用是否指向同一个对象

(2)在 Java 中,要想比较字符串的内容,必须采用 String 类提供的 equals 方法

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true

3、字符、字节、字符串的转换

(1)字符与字符串

String 可以和 char[] 相互转换

NO 方法名称 类型 描述
1 public String(char value[]) 构造 将字符数组的所有内容变为字符串
2 public String(char value[],int offset,int count) 构造 将部分字符数组的内容变成字符串
3 public char charAt(int index) 普通 取得指定索引位置的字符,索引从0开始
4 public char[] toCharArray() 普通 将字符串变成字符数组返回

代码实例:

String str = "hello" ; 
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h

字符串与字符数组的转换

String str = "helloworld" ; 
// 将字符串变为字符数组
char[] data = str.toCharArray() ; 
for (int i = 0; i < data.length; i++) { 
 System.out.print(data[i]+" "); 
} 
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换

(2)字节与字符串

String 和 byte[] 相互转换

NO 方法名称 类型 描述
1 public String(byte bytes[]) 构造 将字节数组变为字符串
2 public String(byte bytes[],int offset,int length) 构造 将部分字节数组中的内容变为字符串
3 public byte[] getBytes() 普通 将字符串以字节数组的形式返回
4 public byte[] getBytes(String charssetName) throws UnsupportEncodingException 普通 编码转化处理

代码实例:

String str = "helloworld" ; 
// String 转 byte[] 
byte[] data = str.getBytes() ; 
for (int i = 0; i < data.length; i++) { 
 System.out.print(data[i]+" "); 
} 
// byte[] 转 String 
System.out.println(new String(data));

那么何时使用 byte[], 何时使用 char[] 呢?
byte[] : 是把 String 按照一个字节一个字节的方式处理,这种合适在网络传输,数据存储这样的场景下使用,更适合针对二进制数据来操作。
char[] : 是把 String 按照一个字符一个字符的方式处理,更适合针对文本数据来操作,尤其是包含中文的时候。

4、字符串常见操作:

(1)字符串比较:

NO 方法名称 类型 描述
1 public boolean equals(Object anObject) 普通 区分大小写的比较
2 public boolean equalsIanoreCase(String anotherString) 普通 不区分大小写的比较
3 public int compareTo(String anotherString) 普通 比较两个字符串大小关系
String str1 = "hello" ; 
String str2 = "Hello" ; 
System.out.println(str1.equals(str2)); // false 
System.out.println(str1.equalsIgnoreCase(str2)); // true
System.out.println("a".compareTo("A")); // 32

(2)字符串查找:

NO 方法名称 类型 描述
1 public boolean contains(CharSequence s) 普通 判断一个子字符串是否存在
2 public int indexOf(String str) 普通 从头开始查找指定字符串的位置,查到了返回位置的开始索引,查不到返回-1
3 public int indexOf(String str,int fromIndex) 普通 从指定位置开始查找子字符串的位置
4 public int lastIndexOf(String str) 普通 由后往前查找子字符串的位置
5 public int lastIndexOf(String str,int fromIndex) 普通 从指定位置由后往前查找
6 public boolean startsWith(String prefix) 普通 判断是否以指定字符串开头
7 public boolean startsWith(String prefix,int toffset) 普通 从指定位置开始判断是否以指定字符串开头
8 public boolean endsWith(String suffix) 普通 判断是否以指定字符串结尾

代码示例:
字符串查找,最好用最方便的就是 contains()

String str = "helloworld" ; 
System.out.println(str.contains("world")); // true

使用 indexOf() 方法进行位置查找

String str = "helloworld" ; 
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("cool")); // -1,没有查到
if (str.indexOf("hello") != -1) { 
 System.out.println("可以查到指定字符串!"); 
}

判断开头或结尾:

String str = "**@@helloworld!!" ; 
System.out.println(str.startsWith("**")); // true 
System.out.println(str.startsWith("@@",2)); // ture 
System.out.println(str.endwith("!!")); // true

(3)字符串替换:

NO 方法名称 类型 描述
1 public String replaceAll(String regex,String replacement) 普通 替换所有的指定内容
2 public String replaceFirst(String regex,String replacement) 普通 替换首个内容

字符串的替换处理:

String str = "helloworld" ; 
System.out.println(str.replaceAll("l", "_")); 
System.out.println(str.replaceFirst("l", "_"));

注意:
由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串

(4)字符串拆分:

NO 方法名称 类型 描述
1 public String[] split(String regex) 普通 将字符串全部拆分
2 public String[] split(String regex,int limit) 普通 将字符串部分拆分,该数组长度就是 limit 极限

实现字符串的拆分处理:

String str = "hello world " ; 
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) { 
 System.out.println(s); 
}

字符串的部分拆分:

String str = "hello world " ; 
String[] result = str.split(" ",2) ; 
for(String s: result) { 
 System.out.println(s); 
}

拆分IP地址:

String str = "192.168.1.1" ; 
String[] result = str.split("\\.") ; 
for(String s: result) { 
 System.out.println(s); 
}

注意:

  1. 字符" | “,” * “,” + " 都得加上转义字符,前面加上" \ ".
  2. 而如果是"",那么就得写成" \ \ ".
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

多次拆分:

String str = "name=zhangsan&age=18" ; 
String[] result = str.split("&") ; 
for (int i = 0; i < result.length; i++) { 
 String[] temp = result[i].split("=") ; 
 System.out.println(temp[0]+" = "+temp[1]); 
}

(5)字符串的截取:

NO 方法名称 类型 描述
1 public String substring(int begindex) 普通 从指定索引截取到结尾
2 public String substring(int beginIndex,int endIndex) 普通 截取部分内容

代码示例:

String str = "helloworld" ; 
System.out.println(str.substring(5)); 
System.out.println(str.substring(0,5));

注意:

  1. 索引从0开始
  2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

(6)其他操作:

NO 方法名称 类型 描述
1 public String trim() 普通 去掉字符串中的左右空格,保留中间空格
2 public String toUpperCase() 普通 字符串转大写
3 public String toLowerCase() 普通 字符串转小写
4 public native String intern() 普通 字符串入池操作
5 public String concat(String str) 普通 字符串连接,等同于"+",不入池
6 public int length() 普通 取得字符串长度
7 public boolean isEmpty() 普通 判断字符串是否为空字符串,但不是null,而是长度为0

观察 trim() 方法的使用:

String str = " hello world " ; 
System.out.println("["+str+"]"); 
System.out.println("["+str.trim()+"]");

观察 isEmpty() 方法:

System.out.println("hello".isEmpty()); 
System.out.println("".isEmpty()); 
System.out.println(new String().isEmpty());

首字母大写:

public static void main(String[] args) { 
 System.out.println(fistUpper("yuisama")); 
 System.out.println(fistUpper("")); 
 System.out.println(fistUpper("a")); 
 } 
 public static String fistUpper(String str) { 
 if ("".equals(str)||str==null) { 
 return str ; 
 } 
 if (str.length()>1) { 
 return str.substring(0, 1).toUpperCase()+str.substring(1) ; 
 } 
 return str.toUpperCase() ; 
 }

5、String、StringBuffer、StringBuilder区别(面试)

String StringBuffer StringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 可变类,速度更快
内容不可修改 可以修改 可以修改
线程安全 线程不安全
多线程操作字符串 单线程操作字符串

对于 String 来说,其拼接是被底层优化为了 StringBuilder

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String 在Java中的用法详解 的相关文章

随机推荐

  • 怎么让别人连接自己的数据库(MySQL)

    怎么让别人连接自己的数据库 MySQL update user set host where user root and host localhost flush privileges
  • 实现领域驱动设计----第一章

    带着问题上路 什么是领域驱动设计 是什么 为什么要做领域驱动设计 为什么要做 怎样做领域驱动设计 怎样做 其他的设计模式与领域驱动设计的区别 有类似为什么要做 但是是在取长补短的总结 译者序 就像在20世纪六七十年代出现了软件危机之后 面向
  • LINK : fatal error LNK1104: 无法打开文件“XXXXX.lib”解决方法

    1 首先我们一开始是配置包含的库目录 2 找到我们缺少XXXX lib对应的目录 确定 3 然后在链接器 输入 附加的依赖项中我们输入这个lib文件的全名 这一步按照实际情况添加 然后编译链接即可 主要原理分析 1 报错提示找不到这个lib
  • 玩转Mysql系列 - 第17篇:存储过程&自定义函数详解

    这是Mysql系列第17篇 环境 mysql5 7 25 cmd命令中进行演示 代码中被 包含的表示可选 符号分开的表示可选其一 需求背景介绍 线上程序有时候出现问题导致数据错误的时候 如果比较紧急 我们可以写一个存储来快速修复这块的数据
  • Ubuntu下的Nginx + Uwsgi + Django项目部署详细流程

    文章目录 前言 环境 工具 申请一个服务器 获取服务器实例 获取IP 配置安全组 配置放行端口 http www iszip com post 022714 html 连接服务器 配置用户 使用pyenv管理python版本 下载pyenv
  • sublime 搜索时忽略文件夹

    如上图 添加 folder exclude patterns 要忽略的文件夹 转载于 https www cnblogs com benchan2015 p 4949017 html
  • STM32------ADC实验

    目录 前言 一 库函数 1 ADC Init函数 2 ADC使能函数 3 ADC使能软件转换函数 4 ADC规则通道配置函数 5 ADC获取转换结果函数 6 实验目的 二 软件设计 1 adc c 2 adc h 前言 一 库函数 1 AD
  • react动态二级/三级路由操作

    一级路由就不写了 比较简单 下面是在一级页面mvvm中进行写入二级及三级路由页面 app js中进行路由配置
  • 【golang】巧用select {}阻塞main函数

    很多时候我们需要让main函数不退出 让它在后台一直执行 例如 func main for i 0 i lt 10 i 启动20个协程处理消息队列中的消息 c consumer New go c Start select 阻塞 可能大多数人
  • Leetcode304.二维区域和检索——动态规划之矩阵前缀和

    文章目录 引入 Leetcode题解 引入 接上文Leetcode10 正则表达式匹配 动态规划之一个模型三个特征 在第17次双周赛的时候 我遇到这么一道题1314 矩阵区域和 不过在此 我们先讨论该题的解法的经典题型 304 二维区域和检
  • k8s-kubeadm安装k8s

    前言 本文主要介绍Docker和Kubernetes的安装步骤 安装Docker采用官网提供的安装方式 安装k8s采用官网提供的kubeadm方式 其中镜像地址都采用了国内阿里镜像地址 k8s集群服务器初始化 准备工作 关闭防火墙 syst
  • 【C++】挖金子(黄金矿工)分析与代码实现

    帮 大一学弟 AC一道题 题面 思路 每个格子都可以作为开始节点 遍历找到最大数 可以直接用优先队列去模拟 或者用dfs 回溯 代码 include
  • python中yield总结

    总结 1 通常的for in 循环中 in后面是一个数组 这个数组就是一个可迭代对象 类似的还有链表 字符串 文件 它可以是mylist 1 2 3 也可以是mylist x x for x in range 3 它的缺陷是所有数据都在内存
  • c#如何判断两个对象是否相等

    在c 中判断对象相等 这是对引用类型进行判断 而不是对值类型 如果是对字符串 或者是数值进行判断相等只需要用 运算符就可以了 对两个对象用 运算符 只能判断他们两个在内存中的地址是否一样的 1 对一个类只实例化一次 向那些赋值来赋值去的引用
  • ab常见问题汇总

    测试服务器ab 被测试服务器apache apache版本2 2 25 问题一 socket Too many open files 24 解决 在测试服务器操作 1 查看当前系统设置 open files n 1024为1024 root
  • FPGA 时序约束 二 :创建时钟和时钟不相关约束

    创建时钟是针对代码中主时钟而言 创建时钟之前需要知道代码中的主时钟都是什么 可以在综合以后 打开综合 然后在TCL 中输入命令 report clock networks name mynetwork 确定了主时钟 就可以对其创建时钟周期约
  • win 双机mysql集群_heartbeat双机 V3 CRM实现多台mysql集群

    一 系统环境 OS AS 5 3 i386 两服务器 db ha1 10 0 3 194 db ha2 10 0 3 195 VIP 10 0 3 111 资源名称 ha mysql1 ha mysql2 fs mysql1 fs mysq
  • 将字符串“I am a student.”逆序输出为“student. a am I”

    给到一串字符 I am a student 将其输出为 student a am I 整体思路为先将整个字符串逆序为 tneduts a ma I 然后再将每个单词进行逆序转换为 student a am I 那么我们只需先写出将整个字符串
  • 数组目标值target两个整数,并返回它们的数组下标

    1 题目背景 给定一个整数数组nums和一个整数目标值target 请你在该数组中找出和为目标值target的那两个整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺序
  • String 在Java中的用法详解

    认识String类 和 String的使用 1 创建字符串 1 常见的构造String的方式 2 String的基本概念 2 字符串比较相等 3 字符 字节 字符串的转换 1 字符与字符串 2 字节与字符串 4 字符串常见操作 1 字符串比