2、String类
String类
String 对象用于保存字符串,也就是一组字符序列
字符串常量对象是用双引号括起来的字符序列,例如:"你好"、"12.07"、"boy"等
字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节
String 类有很多构造器,构造器的重载
String s1 = new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count);
String s5 = new String(byte[] b);
//String 类实现了接口 Serializable 【String 可以串行化:可以在网络传输】
// 接口 Comparable 【String 对象可以比较大小】
//String 是final 类,不能被其他的类继承
//String 有属性 private final char value[]; 用于存放字符串内容
//一定注意:value 是一个final类型,不可以修改:即value 不能指向新的地址,但是单个字符内容是可以变化
final char[] value = {'a', 'b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H';
//value = v2; 不可以修改value 地址
创建String对象的两种方式
方式一:直接赋值 String s = "hsp";
先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。
s最终指向的是常量池的空间地址
方式二:调用构造器 String s2 = new String("hsp");
- 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp",重新创建,
如果有,直接通过value指向,最终指向的是堆中的空间地址
- 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp",重新创建,
练习题
String a = "hsp";
String b = new String("hsp"); System.out.println(a==b.intern()); //T
System.out.println(b==b,intern()); //F /*
知识点:
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用equals(Object) 方法确定),
则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用
解读:b.intern()方法最终返回的是常量池的地址(对象)
*/ String a = "hello" + "abc"; //==>等价优化 String a = "helloabc";String对象特性
String a = "hello";
String b = "abc";
//1. 先创建一个 StringBuilder sb = StringBuilder()
//2. 执行 sb.append("hello")
//3. sb.append("abc");
//4. String c = sb.toString()
//最后其实是 c 指向堆中的对象(String) value[] -> 池中 "helloabc"
String c = a + b;
//String c1 = "ab" + "cd"; 常量相加,看的是池。
//String c1 = a + b; 变量相加,是在堆中
String类的常用方法
String 类是保存 字符串常量的,每次更新都需要重新开辟空间,效率极低,因此java设计者还提供了 StringBuilder 和 StringBuffer来增强String的功能,并提高效率。
常用方法
equals // 区分大小写,判断内容是否相等
equalsIgnoreCase // 忽略大小写的判断内容是否相等
length //获取字符的个数,字符串的长度
indexOf //获取字符(字符串)在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1
lastIndexOf // 获取字符(字符串)在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1
substring // 截取指定范围的字符串
String name = "hello,张三";
//下面name.substring(6) 从索引6开始截取后面所有的内容
System.out.println(name.substring(6));
//name.substring(0,5) 从索引0开始截取,截取到索引 5-1=4位置
System.out.println(name.substring(0,5));
trim // 去前后空格
charAt :获取某索引处的字符,注意不能使用Str[index]这种方式
String str = "hello";
//str[0] 不对
//str.charAt(0) => h
toUpperCase 转换成大写
toLowerCase 转换成小写
concat 拼接字符串
String s1 = "宝玉";
s1 = s1.concat("林黛玉").concat("薛宝钗").concat("together");
replace 替换字符串中的字符
//s1.replace() 方法执行后,返回的结果才是替换过的
//注意 对 s1 没有任何影响 s1 = "宝玉 and 林黛玉 林黛玉 林黛玉";
//s1中,将所有的 林黛玉 替换成 薛宝钗
s11 = s1.replace("林黛玉","薛宝钗");
System.out.println(s1); // 宝玉 and 林黛玉 林黛玉 林黛玉
System.out.println(s11); // 宝玉 and 薛宝钗 薛宝钗 薛宝钗
split 分割字符串,对于某些分割字符,我们需要转义比如 | \\等
//1. 以 , 为标准对 poem 进行分割,返回一个数组
//2. 在对字符串进行分割时,如果有特殊字符,需要加入转义符 \
String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
String[] split = poem.split(",");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
} poem = "E\\aaa\\bbb";
split = poem.split("\\\\");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
} /*
运行结果:
锄禾日当午
汗滴禾下土
谁知盘中餐
粒粒皆辛苦
E
aaa
bbb
*/
toCharArray 转换成字符数组
String s = "happy";
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
System.out.println(chs[i]);
} /*
运行结果:
h
a
p
p
y
*/
compareTo 比较两个字符串的大小,如果前者大,则返回正数,后者大,则返回负数,如果相等,返回0
//1. 如果长度相同,并且每个字符也相同,就返回0
//2. 如果长度相同或者不相同,但是在进行比较时,可以区分大小
// 就返回 if (c1 != c2) {
// return c1 - c2;
// }
//3. 如果前面的部分都相同,就返回 str1.len - str2.len
String a = "jchn";
String b = "jack";
System.out.println(a.compareTo(b)); //返回值是 'c' - 'a' = 2 的值 //compareTo 源代码
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
format 格式字符串
// %d 是整数来替换
// %s 表示后面由字符串来替换
// %.2f 表示使用小数来替换,替换后,只会保留小数点后两位,并且进行四舍五入的处理
// %c 使用char 类型来替换 int aaa = 10;
System.out.format("aaa=%d ",aaa);
String info1 = "aaa=%d";
String info2 = String.format(info1,aaa);
System.out.println(info2); /*
运行结果:
aaa=10 aaa=10
*/
图片来自于 韩顺平 零基础30天学会Java
2、String类的更多相关文章
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
- C++ string类的实现
c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ...
- String类的功能
String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...
- java基础复习:final,static,以及String类
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...
- String类和StringBuffer类的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明
Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- String类常用方法
1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...
- 运用String类实现一个模拟用户登录程序
package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...
随机推荐
- 步态识别《GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition》2018 CVPR
Motivation: 步态可被当作一种可用于识别的生物特征在刑侦或者安全场景发挥重要作用.但是现有的方法要么是使用步态模板(能量图与能量熵图等)导致时序信息丢失,要么是要求步态序列连续,导致灵活性差 ...
- 论文阅读 Inductive Representation Learning on Temporal Graphs
12 Inductive Representation Learning on Temporal Graphs link:https://arxiv.org/abs/2002.07962 本文提出了时 ...
- 地址解析协议(ARP) 分析
什么是ARP协议 ARP(A ddress R esolution P rotocol)- 地址解析协议 ,用于将IP地址解析为MAC地址.复杂来说,ARP用于32位IPv4地址和以太网的48位MAC ...
- 5-21 拦截器 Interceptor
Spring MVC拦截器 什么是拦截器 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后(还有其它特殊时机)对请求进行处理或加工的特定接口 常见面试题:过滤器和拦截器的 ...
- day01 Java_JVM,JCR,JDK
精华笔记: java开发环境: 编译运行过程: 编译期:.java源文件,经过编译,生成.class字节码文件 运行期:JVM加载.class并运行.class(0和1) 特点:跨平台.一次编程到处使 ...
- 发布自己的npm组件库
发布自己的npm组件库 前期准备 **git上建立自己的仓库,这样子是为了在本地初始化时,可以直接生成对应的 package.json ** 克隆仓库 创建仓库成功后,gitbush本地,执行 git ...
- 关于hive分区,你知道多少呢?
文末查看关键字,回复赠书 一.理论基础 1.Hive分区背景 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入 ...
- SkiaSharp 之 WPF 自绘 粒子花园(案例版)
此案例包含了简单的碰撞检测,圆形碰撞检测方法,也可以说是五环弹球的升级版,具体可以根据例子参考. 粒子花园 这名字是案例的名字,效果更加具有科技感,很是不错,搞搞做成背景特效也是不错的选择. Wpf ...
- 11中javascrip教程教不到的小技巧
1.过滤唯一值 Set对象类型是在ES6中引入的,配合展开操作...一起,我们可以使用它来创建一个新数组,该数组只有唯一的值. 1 const array = [1, 1, 2, 3, 5, 5, 1 ...
- Apache DolphinScheduler&TiDB联合Meetup | 聚焦开源生态发展下的应用开发能力
在软件开发领域有一个流行的原则:Don't Repeat Yourself(DRY),翻译过来就是:不要重复造轮子.而开源项目最基本的目的,其实就是为了不让大家重复造轮子. 尤其是在大数据这样一个高速 ...