String 在Java中的用法详解
认识String类 和 String的使用
- 1、创建字符串:
- (1)常见的构造String的方式:
- (2)String的基本概念:
- 2、字符串比较相等:
- 3、字符、字节、字符串的转换
- (1)字符与字符串
- (2)字节与字符串
- 4、字符串常见操作:
- (1)字符串比较:
- (2)字符串查找:
- (3)字符串替换:
- (4)字符串拆分:
- (5)字符串的截取:
- (6)其他操作:
- 5、String、StringBuffer、StringBuilder区别(面试)
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);
}
注意:
- 字符" | “,” * “,” + " 都得加上转义字符,前面加上" \ ".
- 而如果是"",那么就得写成" \ \ ".
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
多次拆分:
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));
注意:
- 索引从0开始
- 注意前闭后开区间的写法, 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
String 在Java中的用法详解相关推荐
- Java中SimpleDateFormat用法详解
Java中怎么才能把日期转换成想要的格式呢,或把字符串转换成一定格式的日期,如把数据库中的日期或时间转换成自己想要的格式,JAVA中提供了SimpleDateFormat类可以实现,以下是Simple ...
- Java中Map用法详解
原文地址http://blog.csdn.net/guomutian911/article/details/45771621 原文地址http://blog.csdn.net/sunny2437885 ...
- Java中 DecimalFormat 用法详解
对Java中 DecimalFormat 的所有基础用法进行了一个汇总.DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度.0 表示如果位数不足则以 0 填充,# 表示只要有 ...
- java中ArrayList用法详解,基本用法(含增删改查)
1.什么是ArrayList ArrayList就是 动态数组,它提供了 ①动态的增加和减少元素 ②实现了ICollection和IList接口 ③灵活的设置数组的大小 ArrayList是一个其 ...
- java中单例模式用法详解
最近空闲的时候回顾了一下常用的设计模式,其中单例模式是创建型模式中比较基础的一种设计模式,说起单例模式,想必大家并不模式,我们都知道的是,在单例模式下,能够保证一个类只有一个实例对象,就是说,外部访问 ...
- Java中JDBC连接数据库详解
今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...
- JAVA中的Random详解
JAVA中的Random详解 首先,在JDK自带的常用的random中有两个,这俩都是产生随机数的,不过一个是util下的random,另外一个是Math下的.我们分别介绍一下 util中的rando ...
- Python中self用法详解
Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...
- java中new关键字详解
java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...
最新文章
- 甲骨文们是怎么被干掉的
- Android killer软件闪退的解决办法?
- 【APICloud系列|30】苹果MAC电脑取消辅助功能-语音识别
- mysql 忘记密码
- Java 算法 超级玛丽
- Stackint stack = new Stackint报错原因
- [蓝桥杯]试题 基础练习 Sine之舞
- C语言实现24点游戏算法
- C语言编程练习----2021级山东理工大学ACM实验二题解
- Nginx 局域网共享
- 关于下载文件以及在swagger-ui中遇到的坑
- matlab 设置坐标轴位置/方向 y轴反向
- 用计算机的画图工具画画,电脑绘画软件哪个好用?电脑绘画软件推荐
- 网页打不开的时候怎么办
- chainfire android8.1,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
- ElastaicSearch 查询
- Linux 服务器 apt 源配置方法【一文读懂】
- 淘宝、天猫图片搜索商品接口API调用展示
- CTF学习-PHPS文件泄露
- 抓包神器charles使用与破解实战
热门文章
- python爬知识星球付费数据_以知识星球为例,教你如何运营一个付费社群|社群运营成功案例...
- layui laydate设置最小时间为当前时间,不能选择今天之前的时间
- 海康工业相机SDK错误码常见场景解析
- python三大神器_python函数进阶与三大神器
- 一步一步从理论到实践实现textrank
- ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结
- TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)
- 提取一个字符串(少于80个字符)中的所有数字字符(‘0’...‘9’)并输出。
- Linux hwclock命令参数及用法详解--Linux显示/设置硬件时钟命令
- office 2013出现的各种问题及解决方法(win10 14393版本)