| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> JAVA String类 -> 正文阅读 |
|
[Java知识库]JAVA String类 |
目录 String基本概念字符串的不可变性众所周知,String的特点是不可变,所以为什么是不可变呢?怎么实现的不可变呢? 来看它的源码: 可以看到,我们平时 String str = "abc",其中的"abc"都是存储于String内的数组中的,并且这个数组是被final修饰的,所以String类就能借助这个数组实现“不可变”这个特点。 我们对str操作时,总会感觉改变了str的值,其实你只是把str换了个指向罢了
字符串的常量池同时,你会不会为搞不懂常量池、不知道怎么判断两个字符串是否相等而发愁?如下:
由于String类型实在是太常用了,为了节约空间,JAVA类库的设计者在实现时增添了一个东西,名为常量池。 (以前常量池在方法区,现在在堆区) 每生成一个字符串,该字符串都将在常量池"登记",当要第二次使用时,就共享它,而不是再创建一个新的同样的字符串。 当你直接将str1指向字符串"abc"时,会先在常量池中寻找这个字符串,如果找到了,直接将str1指向"abc",如果没找到,会在常量池中创建一个"abc",并将str1指向它。看一下代码执行过程: String str1 = "abc"; 这一步执行时,str1没找到"abc",所以它会在常量池创建"abc",并将str1指向"abc"。 String str2 = "abc"; 这一步执行时,因为str1已经组建了"abc",所以str2直接指向"abc"。 接下来看看String str3 = new String("abc"); 它并不是直接将str3指向"abc",而是在堆区的其他地方new 一个String类大小的空间,开头说过,String内部其实是有一个数组存放字符的,此时这个数组就会指向"abc"。注意,并不是str3指向"abc"哦,是str3内部的数组。 在了解字符串的不可变性和常量池之后,你是不是对String的理解更为深入了呢?来看看这几道题吧。 1、在执行以下操作后 , Str1 = ______;
答案 :hello 解析 :只是改变了str2的指向,而不是它的内容 2、一大波题目正在来临
1、s1 == s2?:上面已经讲过,都直接指向常量池,相等 2、s1 == s3 :相等,如果右侧都是常量,常量池中直接连接这两个字符串;如果右侧出现变量,本质是new了一个StringBuilder然后一个一个连接, 3、s1 == s4 :s4可以看作右侧是一个常量+一个变量,故本质是new Stringbuilder(),不相等 4、s1 == s8 :s8是两个变量,本质是new Stringbuilder(),故 s1 != s8。 5、s4 == s5 :虽然都是new 出的String,但是在堆区地址不同,故不相同 常用方法0.求字符串长度,length
1. 字符串转数组,toCharArray将String字符串转换为字符数组。 String 类的内容和长度是固定的(final),要对其操作就要借助一些方法,虽然这些方法可以对字符串的内容进行操作,但这不改变对象实例,而是生成了一个新的实例。 有些题给了字符数组,没给字符串,而字符串是不能单个操作的。就要把它转换成字符数组进行操作。 如:给已知字符串排序
先将str字符串转换成字符数组,调用Arrays.sort方法进行升序排列 2.字符串比较,equals==的介绍 C++中可以用 == 进行字符串内容之间的比较,而用于java时,== 进行的是地址的比较。 String str1 = "abc"; 这样的初始化方法是:先在常量池中寻找 "abc" 这样的字符串,若找到,直接将 str1 指向它,若没找到,会创建一个再将str1指向它
str1和str2都是对方法区常量池中"abc"的引用,地址相同,故str1 == str2。 str3没有用到常量池,它是堆区内容,与str1 ,str2地址不同,故str1 != str2。 a 和 b 虽然都在堆区,但申请空间地址不同 equals方法 故想要比较字符串内容时,用到equals方法。
当遇到 常量与变量进行比较时,建议把常量放在前面。
原因: 因为如果把变量写在前面 a.equals("abc") 万一 str 是 NULL ,程序会报错,空指针异常 NullPointerExcption 忽略大小写比较:equalsIgnoreCase()
3.字符串切割,split类似C语言中的strtok,比它牛逼 strtok切割后返回的是地址,而split切割后返回的是已经切割好的字符串数组,故需要 String[] 接收
注意: split 方法中的参数是正则表达式,如果想切割字符串中的".",会切割失败 如:
能运行但是没有输出(因为切割失败,b数组的长度为0)。 想要切割".",就要写成"\\."的形式
切割成功,b数组的长度为3 4.替换指定内容,replace将字符串的所有符合要求的内容替换为指定内容。返回值为字符串
5.查找子串 indexOfint a.indexOf(b)? 返回b在a中第一次出现的位置
来做几道关于String常用方法的练习题: 2、反转字符串 StringBuilder、StringBufferString类是不可变的,但是StringBuilder和StringBuffer是可变的。 接下来就是StringBuilder类和StringBuffer类。 刚才一直说
这个过程其实是StringBuilder来完成的,那么它到底是怎么实现的呢? 我们通过反编译软件XJad来完成这件事: XJad下载地址: 链接: XJad下载 提取码: 5knf 在把.class文件放入XJad中后显示: 可以看到str4 的创建过程很复杂,它先是new 了一个StringBuilder类,又将str1和str2拼接上,最后再转为String类赋值给str4。这就是字符串拼接的本质。 那么我们就能理解平时打印的时候,
其实它的过程比你想象的更加复杂哦: 先创建一个StringBuildder对象,连接上"i = ",再连接上i这个数字,再将StringBuilder转换成Strin类输出。 当然,如果你不想下载XJad的话,可以在IDEA查看反汇编代码哦~由于只是拓展,我只贴两张图: 接下来说说StringBuilder和StringBuffer的区别:
由于本篇博客只是浅浅涉猎javase的String类,所以要想知道更多关于StringBuilder和StringBuffer的内容,可以参考这位大佬的博客:StringBuilder和StringBuffer的区别 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 2:54:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |