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 动态代理的机制和特 ...
随机推荐
- php5.6 + apache2.4+mysql5.7 配置
----------------------------------------------------- ★软件工具:(下载时注意下载相应版本,不同版本安装细节可能会有差异!!) 1>http ...
- 3D惯导Lidar SLAM
3D惯导Lidar SLAM LIPS: LiDAR-Inertial 3D Plane SLAM 摘要 本文提出了最*点*面表示的形式化方法,并分析了其在三维室内同步定位与映射中的应用.提出了一个利 ...
- CUDA运行时 Runtime(二)
CUDA运行时 Runtime(二) 一. 概述 下面的代码示例是利用共享内存的矩阵乘法的实现.在这个实现中,每个线程块负责计算C的一个方子矩阵C sub,块内的每个线程负责计算Csub的一个元素.如 ...
- 5G和AI机器人平台为工业4.0和无人机提供服务
5G和AI机器人平台为工业4.0和无人机提供服务 Qualcomm 5G and AI robotics platform delivers for Industry 4.0 and drones 高 ...
- 开发掉坑(二)前端静态资源 Uncaught SyntaxError: Unexpected token <
某天,有同学反馈后台管理系统出现静态资源无法加载的问题. 复现如下: 进入首页. 点击侧边栏某个子功能,静态资源可正常访问到. 等待10分钟左右,点击侧边栏其他子功能,无法访问到静态资源. 查看控制台 ...
- Qt中的布局浅析与弹簧的使用,以及Qt居中的两种方法
1. 布局 为什么要布局: 布局之后窗口的排列是有序的 布局之后窗口的大小发生变化, 控件的大小也会对应变化 如果不对控件布局, 窗口显示出来之后有些控件的看不到的 布局是可以嵌套使用 常用的布局方式 ...
- JVM面试题(史上最强、持续更新、吐血推荐)
文章很长而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三部 ...
- 浅谈lambda表达式<最通俗易懂的讲解
Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论.Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中.想想看,在Java8 ...
- 惊艳面试官的 Cookie 介绍
Cookie 是什么 Cookie 是用户浏览器保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上. Cookie 主要用于以下三个方面: 会话状态管理(如用户登录 ...
- 史上最详细的Air7xx驱动安装教程
由于Air7xx系列4G模块需要安装USB驱动,但是很多开发者对USB驱动的安装方法不是十分了解,所以经常出现问题,导致安装失败.特书此文,手把手教你装USB驱动. 第一步 从官网下载最新的驱动程序 ...