Java基础之String类
String类
字符串是不可变的,对其做的任何改变,会生成一个对象,不会改变有原有对象。
==和equals()
String s1 = "good";
String s2 = "good";
if (s1 == s2) {} // true 这种直接把字符串赋值给对象的情况,是存储在常量池里的,指向同一个地址
// another example
String s1 = "good";
String s2 = new String("good");
if (s1 == s2) {} // false, new出来的对象存储在堆内存,和存放在常量池指向的不是同一个地址
// 当然,两个都是new出来的对象,即使他们内容相同,用“==”来比较地址也是不同的
// String类覆盖了equals()方法,比较的是字符串的内容。故一般不用==来比较
// 无论是以上那种情形,只要内容是"good",就是true
if (s1.equals(s2)) {}
像Integer一类的由基本数据类型封装成的对象,也是覆写了equals方法的,和String类一样也是比较的内容。但是在使用==
比较的时候有些区别。
Integer a = new Integer(6);
Integer b = new Integer(6);
// 可以像如上方式实例化,也可像下面这样,下面这种方式称为自动装箱(从int -> Integer)
Integer c = 6;
Integer d = 6;
Integer e = 128;
Integer f = 128;
if (c==d) {} // true
if (e == f) {} // false,why?
- 自动装箱时候,当使用==比较,仅限于闭区间[-128, 127],两个内容相同的对象地址也是相同的,超出这个范围,地址就不同了,比较结果false
- 当然equals方法比较的还是内容,不管哪种方式实例化,只要内容相同,比较结构就是true。
compareTo()
字符串的比较用str1.compareTo(str2)
,实际上是String类实现了Comparable
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcdfg";
String s4 = "1bcdfg";
String s5 = "cdfg";
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1)
System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3)
System.out.println( s1.compareTo(s4) ); // 48 (第一个字符就不等,结束比较,"a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)
注意:String s1 = ""
和String s2 = null
无论是用equals()
还是==
比较都是flase。因为s1表示该字符串内容为空,长度为0,指向某个地址。而s2没有绑定任何地址,是一个空指针,更谈不上有长度(调用length()报错)。
String类一些常用方法
一般来说,实例化String类String str = "good"
就可满足。但有时候使用String str = new String("...")
能实现额外的功能。
char[] a = {97, 98, 99}; // 和这个等价char[] a = {'a', 'b', 'c'};
String str = new String(a); // 可以传入字符数组,打印abc
// 还能指定偏移量和字符个数,1表示从数组下标1开始,2表示取用的个数
String str = new String(a, 1, 2); // 打印bc
- indexOf() / lastIndexOf
public class Demo {
// 查找指定字符串是否存在
public static void main(String[] args) {
String str1 = "abcdefmnabc";
// 从头开始查找是否存在指定的字符
System.out.println(str1.indexOf("c")); // 打印2,这里传入99也是一样的,ASCII码对应
// 从第4个字符位置开始往后继续查找
System.out.println(str1.indexOf("c", 3)); // 打印10,即最后一个
System.out.println(str1.indexOf("abc")); // 传字符串也行,打印0
//若指定字符串中没有该字符则系统返回-1
System.out.println(str1.indexOf("z"));
}
lastIndexOf()反向
charAt(int index)
// 返回指定下标的字符
String str1 = "abcdefmnabc";
// 若想打印字符串中每个字符,可以这样写
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
subString(int begin, int end)
// 返回该字符串的一个子字符串,区间是左闭右开的
String str1 = "abcdefmnabc";
str.subString(1, 4); // 返回bcd
toCharArray()
// 返回字符数组char[]
char[] chs = str.toCharArray();
String.valueOf()
// 可传入数字
System.out.println(String.valueOf(97)); // 仅仅是将97转换成字符串97,没有转换成'a'
// 传入字符数组,连接起来
char[] chs = {'a','b', 98};
System.out.println(String.valueOf(chs)); // 打印abb
replace(char old, char new)
// 将指定的字符,全部替换成新的字符
String str1 = "abacd";
str.replace('a', 'e'); // 返回ebecd
可以传正则表达式(regex)的String类方法
- split(String regex)
String str = "a1b2c3d";
String[] words = str.split("\\d"); // 按数字分割,注意返回的是String[]
for (String ch: words) {
System.out.println(ch); // 依次打印abcd
}
- replaceAll(String regex, String another)
String str = "a1b2c3d";
String new_str = str.replaceAll("\\d", "-"); // 把所有数字替换为"-"
System.out.println(new_str); // 打印a-b-c-d
- matches()
// 判断该字符串是否和指定的正则表达式规则匹配
String str = "abc123de45@163.com";
// 匹配邮箱
boolean b = str.matches("\\w+@\\w+\\.[a-z]{2,3}");
System.out.println(b);
正则表达式的一般调用顺序
[abc]
a或者b或者c{2,}、{2,5}、{11}
分别表示重复至少2次,重复2次到5次之间(包括),恰好重复11次\w
表示匹配单词字符[a-zA-Z_0-9]\d
匹配数字\s
匹配空白字符,包括空格、换行符、制表符.
表示匹配任意+
匹配一个或多个,*
匹配0个或多个,?
匹配0个或者1个.*?
非贪婪模式匹配任意字符串
Pattern p = Pattern.compile("1\\d{10}");
Matcher m = p.matcher("12345678901dhf18133338888");
// m.matches(); 返回false,虽然前面11位是满足的,但是Java中是matches()匹配整个,当整个字符串都和规则匹配才返回true
// Python中是从头开始匹配,若有满足,返回第一个匹配的,所有会匹配上12345678901
// find()找到所有和规则匹配的字符串。调用一次只能找到一个,若找到,指向下一个,用while找到所有
while (m.find())
System.out.println(m.group()); // 会找到两个结果
// 注意不要使用了m.matches()后又去用m.find(),会有影响,我也不知道是为什么
Pattern p = Pattern.compile("1\\d{10}");
Matcher m = p.matcher("12345678901dhf18133338888");
boolean b = m.matches(); // 返回false,匹配后再用如下的find()
while (m.find())
System.out.println(m.group()); // 只能找到最后一个结果18133338888
String一些简单的方法
trim()去除字符串两端的空格。
concat()连接两个字符串,功能和
+
连接字符串类似。contains()返回boolean值,判断该字符串是否包含传入的字符串。
startWith()/endWith()判断该字符串是否以指定的字符串开头或者结尾。
toUpperCase()/toLowerCase()转换大小写,对每个字符进行操作。
getBytes(),使用平台的默认字符集将此
String
编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
StringBuffer/StringBuilder
两个都是可变字符序列。StringBuffer可用于多线程,保证同步,线程安全。效率不高。StringBuilder一般用于单线程,不保证同步,线程不安全,但是效率高。一般用StringBuilder就行。
- 长度可变
- 可以存储不同类型的数据
- 需要转换为字符串后来使用
public static void main(String[] args) throws InterruptedException {
StringBuilder sb = new StringBuilder();
sb.append(123);
sb.append("abc"); // 可以添加任意类型数据
System.out.println(sb); // 123abc
sb.insert(3,"good"); // 第三个字符后面插入
System.out.println(sb); // 123goodabc
sb.replace(0, 3, "zzz"); // [0,3)区间的替换
System.out.println(sb); // zzzgoodabc
System.out.println(sb.length()); // 10
sb.setLength(20);
sb.setCharAt(19,'z');
System.out.println(sb); // zzzgoodabc z,中间有9个空格
sb.deleteCharAt(19);
System.out.println(sb); // zzzgoodabc ,后面有10个空格
System.out.println(sb.reverse()); // 字符序列反转, cbadoogzzz,前面10个空格
System.out.println(sb.capacity()); // 34,容量是通常大于长度的
//sb.setLength(0); 删除该字符序列的一种方法,长度设置为0
sb.delete(0, sb.length()); // 删除该字符序列的另外一种方法,删除整个区间内的字符
}
by @sunhaiyu
2016.12.14
Java基础之String类的更多相关文章
- Java基础笔记-String类
String 类(被final修饰) 字符串是一种特殊的对象,一旦字符串被初始化就不可以被改变了.(内容不变) 例如: String s = “abc”; String s1 = new Stri ...
- Java基础教程——String类
String类 Java程序中的所有字符串字面值(如 "abc" )都是String的实例 字符串是常量(因为 String 对象是不可变的,所以可以共享) 字符串的本质是字符数组 ...
- Java 基础之 String 类
String String 被声明为 final,因此不能被继承.(Integer 等包装类也不能被继承) 在 java8 中,String 内部使用 char 数组 来存储数据 public fin ...
- Java基础笔记-String类2
StringBuffer 特点: 是字符串缓冲区. 是一个容器,其长度可变,可以操作添加多个数据类型. 最后通过toString方法变成字符串. 被final锁修饰,因此不能被继承. 存储: 方法1: ...
- Java入门 - 语言基础 - 14.String类
原文地址:http://www.work100.net/training/java-string.html 更多教程:光束云 - 免费课程 String类 序号 文内章节 视频 1 概述 2 创建字符 ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- Java基础之File类的使用
Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法 ...
- Java基础之String、StringBuffer、StringBuilder浅析
Java基础之String.StringBuffer.StringBuilder浅析 一.前言: 位于java.lang包下的String.StringBuilder.StringBuffer一般都是 ...
- Java基础-常用工具类(一)
object类 Object 类是所有类的的父类,如果一个类没有明确使用EXPENTS关键字明确标识继承另外一个类,那么这个类默认继承object类,oject类中的方法适合所有子类 1)toStri ...
随机推荐
- Cordova各个插件使用介绍系列(四)—canvas2ImagePlugin保存二维码到手机本地
详情链接地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/cordova-4-canvas2imageplugin/ 在前面几篇 ...
- 摘记:Web应用系统测试内容
表示层: 内容测试,包括整体审美.字体.色彩.拼写.内容准确性和默认值 Web站点结构,包括无效的链接或图形 用户环境,包括Web浏览器版本和操作系统配置(每一个浏览器都有不同的脚本引擎或虚拟机在客户 ...
- AVAudioSession(2):定义一个 Audio Session
本文转自:AVAudioSession(2):定义一个 Audio Session | www.samirchen.com 本文内容主要来源于 Defining an Audio Session. A ...
- Normalize.css源码注释翻译&浏览器css兼容问题的理解
版本v5.0.0源码地址: https://necolas.github.io/normalize.css/5.0.0/normalize.css 翻译版: /*! normalize.css v5. ...
- Java学习笔记--脚本语言支持API
Java语言的动态性之脚本语言支持API 随着Java平台的流行,很多的脚本语言(scripting language)都可以运行在Java虚拟机啊上,其中比较流行的有JavaScript.JRuby ...
- php中memcache的运用
<?php /** * •Memcache::add — 增加一个条目到缓存服务器 * •Memcache::addServer — 向连接池中添加一个memcache服务器 * •Memcac ...
- 11.巨坑,注意了,关于显示不正常的问题,localstorage的存储问题
在存储时,localstorage和sessionstorage只能存储字符串,所以,必须把json转换为字符串再存,JSON.stringify
- ArrayList原理解析
简介 ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处 有图有码 图 ...
- .NetCore+Jexus代理+Redis模拟秒杀商品活动
开篇叙 本篇将和大家分享一下秒杀商品活动架构,采用的架构方案正如标题名称.NetCore+Jexus代理+Redis,由于精力有限所以这里只设计到商品添加,抢购,订单查询,处理队列抢购订单的功能:有不 ...
- Chrome控制台使用详解
Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...