Java | 字符串的使用 & 分析
字符串
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,在程序中所有的双引号字符串,都是String类的对象。
字符串的特点
1、字符串的内容永不可变。
2、正在是因为字符串的不可变,所以字符串是可心共享使用的。
3、字符串效果上相当于是char[]字符数组,但是底层其实是byte[]字节数组。
创建字符串
创建字符串一共有两种比较常用的方法,两种常用的方法。
第一种常用的方法
直接在等号后面加上一字符串的常量。
String str = "Hello World!";
System.out.println("第一种常用的创建方法:" + str);
//输出的结果:第一种常用的创建方法:Hello World!
第二种常用的方法
用String类的无参构造方法。
String str = new String();
System.out.println("第二种常用的的创建方法:" + str);
//输出的结果:第二种常用的创建方法:(后面是空,没有值的)
第一种不常用的方法
用String类的有参构造方法。【public String(char[])】
char[] arrch = {'老', '酒','馆','的','锅'};
String str = new String(arrch);
System.out.println("第一种不常用的创建方法:" + str);
//输出的结果:第一种不常用的创建方法:老酒馆的锅
第二种不常用的方法
用String类的有参构造方法。【public String(byte[])】
byte[] arrbyte = {97, 98, 99}; //里面的数字,是对照ASCII表的
String str = new String(arrbyte);
System.out.println("第二种不常用的创建方法:" + str);
//输出的结果:第二种不常用的创建方法:abc
上面的所有加上引号的字符串,都是一个String对象,都在在常量池里面的
字符串的常量池
在上面说到,所有的加引号的字符串都在常量池中间,但是常量池是什么东西呢?
常量池其实就是在创建类的时候,所类中的所有的常量写到常量池当中。
例:
String str1 = "abc";
String str2 = "abc";
char[] arrch = {'a', 'b', 'c'};
String str3 = new String(arrch);
//比较三个Sting的地址 输出的结果:
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
System.out.println(str2 == str3); //false
要据上面的图可以得知,常量池中其实存的也是一个地址,在常量如果相等的情况下,会指向常量池中的同一个地址。常量池中的地址,指向的是一个字节数组,所有的数组最后存的都是字节数组。
而字符数组在在jvm中存储的是按照一个数组来存储的,当String的构造方法调用这个数组的时候,这个数组会转成字符数组的形式,然后再给String类的构造方法。
而用构造方法构造的String类,他是一个对象了,所以不在常量池中在着了,是在堆中随机存储着,所以说,str1 == str2 地址相同,但是str1 == str3、str2 == str3地址不相同。
对于引用类型来说,==进行的是地址值的比较。
字符串的操作和使用
比较方法
在我们日常用的时候,如果我们只想比较字符串里面的值,不关心地址,就可用比较方法,所以说java专门写了两个比较的方法。
public boolean equals(Object obj) 和 public boolean equalsIgnoreCase(Sttring str)
上面的两个方法,一个是严格区分大小写的,一个是忽略大小写的。
例:
equals方法的使用:
String str1 = "ABC";
String str2 = "ABC";
char[] arrch = {'A', 'B', 'C'};
String str3 = new String(arrch);
//比较三个Sting的地址 输出的结果:
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
//也可心直接和常量进行比较
String str = null;
System.out.println(str.equals("ABC")); //不推荐使用:会报错 => java.lang.NullPointerException(空指针异常)
System.out.println("ABC".equals(str)); //推荐使用
equalsIgnoreCase方法的使用:
String str4 = "guo";
String str5 = "GUO";
System.out.println(str4.equalsIgnoreCase(str5));
//true 但是只能进行英文的忽略大小写比较
获取字符串长度
在日常使用中获取长度和比较是String类里面用的最多的两个方法了。
public int length()
例:
String str = "dfghjhgfdfg";
System.out.println("字符串的长度是:"+str.length());
//字符串的长度是:11
拼接字符串
拼接字符串,也有自己的方法,但是我们在用的时候,一般是直接用‘+’来直接拼接的,没有使用方法。
在拼接字符串的时候,我们要知道,拼接出来的字符串,是和原来的字符串是一点都不相等的,不管用方法还是用‘+’号。就是因为常量不可改变。
方法:public String concat(String str);
例:
String str1 = "老";
String str2 = "酒馆";
System.out.println(str1.concat(str2));
//老酒馆
System.out.println(str1 + str2);
//老酒馆
获取指定位置的单个字符
也是常用的方法:public char charAt(int index);
例:
String str = "老酒馆的锅";
char c = str.charAt(2);
System.out.println("指定位置出来的字符是:" + c);
//指定位置出来的字符是:馆
查找字符串首次出现的位置索引
在java里面只要是索引就是从0开始的,所以字符串也是。
String里面常用的方法是:public int indexOf(String str);
例:
String str = "老酒馆的锅";
int index = str.indexOf("酒馆");
System.out.println("字符串首次出现的位置索引:"+index);
//字符串首次出现的位置索引:1
截取字符串
String类里面截取字符串只有一种方法,但是这一种方法有一个重载。
public String substring(int begin) 、 public String substring(int begin,int end) 这两种方法。
第一种方法:
String str = "老酒馆的锅";
//从0开始数,在第三个字符串的地方开始往后面截取,包括3
String substring = str.substring(3);
System.out.println(substring); //的锅
第二种方法:
String str = "老酒馆的锅";
//从0开始数,在第一个字符串的地方开始往后面截取,包括1
//但是不包括后面,[1,3);
String substring = str.substring(1, 3);
System.out.println(substring); //酒馆
字符串转换
字符串转换可以在非常多的场景里面用的到,所以String类里面也提供的有技持的方法。
public char[] toCharArray(); 将当前字符串拆分成为字符数组。
public byte[] getBytes(); 获得当前字符串底层的字节数组。
public String replace(CharSequence oldStr,CharSequence newStr); 将所有的老字符串都替换成新的字符串。
toCharArray():
String str = "老酒馆的锅";
//转换成字符数组
char[] chars = str.toCharArray();
System.out.println(chars[0]); //老
getBytes():
String str = "老酒馆的锅";
//转换成字节数组
byte[] chars = str.getBytes();
//这里面对应的是utf-8里面的字符
System.out.println(chars[0]); // -24 => 老
System.out.println(chars[1]); //-128 =>酒
System.out.println(chars[2]); //-127 =>馆
replace(CharSequence oldStr,CharSequence newStr):
String str = "Hello Word !";
//把所有的o替换成&号
String str2 = str.replace("o", "&");
System.out.println(str2); //Hell& W&rd !
字符串分割方法
在日常使用中会对有规律的字符串按照对应的规则分成若干份。
public String[] split(String regex);
String str = "Hello Word !";
//根据空格进行切分
String[] strs = str.split(" ");
for (String s : strs) {
System.out.println(s);
}
/* 分割成三个字符串了
Hello
Word
!
*/
//有一种特殊的情况,就是根据"."进行切割的时候必须在点前面加上\\
String s = "aaa.bbb.ccc";
String[] split = s.split(".");
System.out.println(split.length); //0
String[] split1 = s.split("\\.");
System.out.println(split1.length); //3
//这就说明必须在点的前面加上\\,
//这是因为在split里面是按照正侧表达式进行切割的,"."具有特殊函意,所以要加上转义字符
以上就是字符串的简单的介绍和使用方法了。
细节决定成败!
个人愚见,如有不对,恳请扶正!
Java | 字符串的使用 & 分析的更多相关文章
- java 字符串内存分配的分析与总结
经常在网上各大版块都能看到对于java字符串运行时内存分配的探讨,形如:String a = "123",String b = new String("123" ...
- Java字符串分割函数split源码分析
spilt方法作用 以所有匹配regex的子串为分隔符,将input划分为多个子串. 例如: The input "boo:and:foo", for example, yield ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- 为什么Java字符串是不可变对象?
转自 http://developer.51cto.com/art/201503/468905.htm 本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Ja ...
- 三个实例演示 Java Thread Dump 日志分析
原文地址: http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html jstack Dump 日志文件中的线程 ...
- 三个实例演示 Java Thread Dump 日志分析(转)
原文链接:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 转来当笔记^_^ jstack Dump ...
- 初探Java字符串
转载: 初探Java字符串 String印象 String是java中的无处不在的类,使用也很简单.初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是final的. 不过,String是 ...
- Java 动态代理机制分析及扩展,第 1 部分
Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...
随机推荐
- 解决Caused by: org.apache.ibatis.exceptions.PersistenceException:
在mybatis-config核心配置文件中注册了xml以后出现了新的异常错误 Caused by: java.io.IOException: Could not find resource cn.d ...
- libevent中数据缓冲区buffer分析
很多时候为了应对数据IO的"慢"或者其他原因都需要使用数据缓冲区.对于数据缓冲,我们不陌生,但是对于如何实现这个缓冲区,相信很多时候大家都没有考虑过.今天就通过分析libevent ...
- Python+Selenium自动化 模拟鼠标操作
Python+Selenium自动化 模拟鼠标操作 在webdriver中,鼠标的一些操作如:双击.右击.悬停.拖动等都被封装在ActionChains类中,我们只用在需要使用的时候,导入这个类就 ...
- 如何在框架外部自定义C++ OP
如何在框架外部自定义C++ OP 通常,如果PaddlePaddle的Operator(OP)库中没有所需要的操作,建议先尝试使用已有的OP组合,如果无法组合出您需要的操作,可以尝试使用paddle. ...
- C++中头文件和实现文件的关系
头文件相当于是声明的集合,包括头文件的语句#Include实质为程序代码的宏替换. 编译阶段将函数和变量登记在符号表,链接时将各种函数的入口地址在其中查找到来调用,解引用.
- MySQL笔记04(黑马)
今日内容 多表查询 事务 DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...
- 【SQLite】教程08-SQLite可视化工具
推荐使用"SQLiteStudio" 下载地址:http://www.downza.cn/soft/208363.html 设为中文的方法: 最后重启软件即可!
- Kubernetes集群安装
一.环境介绍 主机名 IP地址 master 192.168.0.100 node1 192.168.0.101 node2 192.168.0.102 1.1.操作系统: CensOS8.4.210 ...
- 《手把手教你》系列基础篇之(一)-java+ selenium自动化测试-环境搭建(上)(详细教程)
1.简介 jmeter系列的文章结束,本来想趁热打铁顺别将Jmeter和接口测试介绍一下,但是感觉Jmeter时间太长了怕大家吃腻了,还有一个原因就是许多小伙伴们或者童鞋们私信问宏哥什么时候可以有ja ...
- 如何设置Python环境变量
大家好,我是Yivies.相信很多python的初学者们在进行一顿下一步下一步的安装之后,在windows command命令行输入python的时候会出现这样的情况: 可我们希望它是这样子的: 其实 ...