String类,string类的特点
1,String类是final修饰的,不能被继承
2,String类的底层使用数组存储
JDK1.9之前:char[]value
JDK1.9之后:byte[]value
3,String类的对象不可变
(1),字符串常量池中存储字符串常量,可以共享
(2),每次修改都会产生新对象,频繁修改的话效率不高
如果涉及到大量的字符串修改操作,建议使用StringBuffer或StringBuilder
如何实现不可变的?
(1),类本身不能继承,没有子类会重写
(2),底层存储的value数组都是final修饰的
(3),底层存储的value数组私有化
(4),对外提供的所有修改字符串的方法,都返回一个新字符串对象
4,在java程序代码中任意使用“”引起来的部分都是字符串的对象
String对象的创建
1、字面常量值
String str = "hello";
2、使用构造器
String str = new String();
String str = new String("hello");
char[] arr = {...};
String str = new String(arr);
byte[] arr = {...};
String str = new String(arr);
//....
3、静态方法
String str = String.copyValueOf(xx);
String str = String.valueOf(xx);
4、xx.toString()
Student stu = new Student(xx);
String str = stu.toString();
StringBuffer s = new StringBuffer(xx);
String str = s.toString();
5、和字符串的拼接+
int a = 10;
String str = a + "";
10.5.3 String对象的个数
String str = "hello";//1个
String str = new String("atguigu");//2个
String s1 = "hello";//1个
String s2 = "world";//1个
String s3 = s1 + s2 + "java";//"java"1个,s1 + s2拼接结果1个,最后结果1个
10.5.4 String对象的拼接
1、+
(1)常量池中的字符串常量 + 常量池中的字符串常量 :结果是在常量池中
(2)变量 + xx:结果都在堆
(3)指向堆中的字符串常量 + xx:结果都在堆
(4)xx拼接结果.intern():结果都在常量池
2、concat:拼接的结果都是新的字符串,都在堆中
10.5.5 String对象的比较
1、==:比较地址
2、equals(xx):比较字符串内容,严格区分大小写
3、equalsIgnoreCase(xx):比较字符串内容,不区分大小写
4、compareTo(xx):比较字符串的大小,按照字符编码值比较,严格区分大小写
5、compareToIgnoreCase(xx):比较字符串的大小,按照字符编码值比较,不区分大小写
6、java.text.Collator:文本校对器比较大小,按照指定语言环境的自然语言顺序比较大小(字典排序)
10.5.6 空字符串与空字符串的判断
if(str !=null && str.isEmpty())
if(str !=null && str.length()==0)
if(str !=null && str.equals(""))
if("".equals(str))
10.5.7 String类的常用API
| 序号 | 方法签名 | 方法功能简介 |
|---|---|---|
| 1 | String() | 创建空字符串 |
| 2 | String(String original) | 根据original创建一个新字符串 |
| 3 | static String valueOf(xx value) | 根据value内容创建一个字符串 |
| 4 | String intern() | 将字符串的内容存入常量池 |
| 5 | String concat() | 字符串拼接 |
| 6 | boolean equals(Object obj) | 判断当前字符串与指定字符串内容是否已在,严格区分大小写 |
| 7 | boolean equalsIgnoreCase(String obj) | 判断当前字符串与指定字符串内容是否已在,不区分大小写 |
| 8 | int compareTo(String str) | 比较当前字符串与指定字符串的大小,严格区分大小写 |
| 9 | int compareToIgnoreCase(String str) | 比较当前字符串与指定字符串的大小,不区分大小写 |
| 10 | boolean isEmpty() | 判断当前字符串是否为空 |
| 11 | int length() | 返回当前字符串的长度 |
| 12 | String toLowerCase() | 将当前字符串转为小写 |
| 13 | String toUpperCase() | 将当前字符串转为大写 |
| 14 | String trim() | 去掉当前字符串前后空白符 |
| 15 | boolean contains(xx) | 判断当前字符串中是否包含xx |
| 16 | int indexOf(xx) | 在当前字符串中查找xx第一次出现的下标 |
| 17 | int lastIndexOf(xx) | 在当前字符串中查找xx最后一次出现的下标 |
| 18 | String substring(int beginIndex) | 从当前字符串的[beginIndex, 最后]截取一个子串 |
| 19 | String substring(int beginIndex, int endIndex) | 从当前字符串的[beginIndex, endIndex)截取一个子串 |
| 20 | char charAt(index) | 返回当前字符串[index]位置字符 |
| 21 | char[] toCharArray() | 将当前字符串的内容用一个字符数组返回 |
| 22 | String(char[] value) | 用value字符数组的元素构建一个新字符串 |
| 23 | String(char[] value,int offset, int count) | 用value字符数组的[offset]开始的count个字符构建一个新字符串 |
| 24 | static String copyValueOf(char[] data) | 用data字符数组的元素构建一个新字符串 |
| 25 | static String copyValueOf(char[] data, int offset, int count) | 用data字符数组的[offset]开始的count个字符构建一个新字符串 |
| 26 | static String valueOf(char[] data) | 用data字符数组的元素构建一个新字符串 |
| 27 | static String valueOf(char[] data, int offset, int count) | 用data字符数组的[offset]开始的count个字符构建一个新字符串 |
| 28 | byte[] getBytes() | 将当前字符串按照平台默认字符编码方式编码为字节序列 |
| 29 | byte[] getBytes(字符编码方式) | 将当前字符串按照指定字符编码方式编码为字节序列 |
| 30 | String(byte[] bytes) | 将bytes字节序列按照平台默认字符编码方式解码为字符串 |
| 31 | String(byte[] bytes,String charsetName) | 将bytes字节序列按照指定字符编码方式解码为字符串 |
| 32 | boolean startsWith(xx) | 判断当前字符串是否以xx开头 |
| 33 | boolean endsWith(xx) | 判断当前字符串是否以xx结尾 |
| 34 | boolean matchs(xx) | 判断当前字符串是否满足xx正则 |
| 35 | String replace(xx,yy) | 将当前字符串中所有xx替换为yy |
| 36 | String replaceFirst(xx,value) | 将当前字符串中第一个满足xx正则的字符替换为value |
| 37 | String repalceAll(xx, value) | 将当前字符串中所有满足xx正则的字符替换为value |
| 38 | String[] split(xx) | 将当前字符串按照xx正则拆分为多个字符串 |
| 39 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将当前字符串的[srtBegin,srcEnd)部分字符复制到dst字符数组中,dst数组从[dstBegin]开始存储 |
10.7 StringBuffer和StringBuilder
10.7.1 String类与StringBuffer和StringBuilder区别
String类的对象是不可变字符序列,StringBuffer和StringBuilder的对象是可变字符序列。
StringBuffer:老点,线程安全的,因为它的方法有synchronized修饰
StringBuilder:JDK1.5之后引入的,线程不安全,单线程情况下推荐使用。
10.7.2 StringBuffer和StringBuilder的API
| 序号 | 方法签名 | 方法区功能简介 |
|---|---|---|
| 1 | StringBuffer() | 创建一个空的可变字符序列,默认长度16 |
| 2 | StringBuffer(String str) | 用字符串str内容创建一个可变字符序列 |
| 3 | StringBuffer append(数据类型 b) | 在当前字符序列后面追加b |
| 4 | StringBufferinsert(int index, 数据类型 s) | 在当前字符序列[index]插入s |
| 5 | StringBuffer delete(int start, int end) | 删除当前字符序列[start,end)部分字符 |
| 6 | StringBuffer deleteCharAt(int index) | 删除当前字符序列[index]位置字符 |
| 7 | void setLength(int newLength) | 修改当前字符序列的长度为newLength |
| 8 | void setCharAt(int index, char ch) | 替换当前字符序列[index]位置字符为ch |
| 9 | StringBuffer reverse() | 将当前字符序列内容反转 |
| 10 | StringBuffer replace(int start, int end, String str) | 替换当前字符序列[start,end)部分字符为str |
| 11 | int indexOf(String str) | 在当前字符序列中开始查找str第一次出现的下标 |
| 12 | int indexOf(String str, int fromIndex) | 在当前字符序列[fromIndex]开始查找str第一次出现的下标 |
| 13 | int lastIndexOf(String str) | 在当前字符序列中开始查找str最后一次出现的下标 |
| 14 | int lastIndexOf(String str, int fromIndex) | 在当前字符序列[fromIndex]开始查找str最后一次出现的下标 |
| 15 | String substring(int start) | 截取当前字符序列[start,最后]部分构成一个字符串 |
| 16 | String substring(int start, int end) | 截取当前字符序列[start,end)部分构成一个字符串 |
| 17 | String toString() | 将当前可变字符序列的内容用String字符串形式表示 |
| 18 | void trimToSize() | 如果缓冲区大于保存当前字符序列所需的存储空间,则将重新调整其大小,以便更好地利用存储空间。 |
| 19 | int length() | 返回当前字符序列的长度 |
| 20 | char charAt(int index) | 返回当前字符序列[index]位置字符 |
| 21 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将当前字符串的[srtBegin,srcEnd)部分字符复制到dst字符数组中,dst数组从[dstBegin]开始存储 |
String类,string类的特点的更多相关文章
- 简单看看这两个类 String和StringBuilder
我记得以前在园子里面讨论这两个类的文章有很多很多,并且还拿出了很多的测试报告,在什么情况下,谁比谁快,在什么情况下,该用谁 不该用谁等等这些,我这里就不比较了,我就简单看看他们里面的内部实现,那就先看 ...
- string、math类、random随机数、datetime、异常保护
今天讲的知识点比较多,比较杂,以至于现在脑子里还有点乱,慢慢来吧... string (1)string.length; (获得你string字符串的长度) (2)a = a.Trim(); 重新赋值 ...
- 类-string/Manth/Random/DateTime-及练习
类一.string类:.Length 字符串的长度 .Trim() 去掉开头以及结尾的空格.TrimStart() 去掉开头的空格.TrimEnd() 去掉结尾的空格 .ToLower() 全部转换为 ...
- 2016年10月12日--string、Math类、Random随机数、DateTime、异常保护
string string.length; //得到string长度 string.Trim(); //去掉string前后的空格 string.TrimStart(); //去掉string前的空格 ...
- String类StringBuffer类与StringBuilder类gc垃圾回收
String类的特点 直接赋值和new调用构造方法两种, 直接赋值时会将字符串常量入内存池,当其他变量再赋相同值时,不再在堆空间开辟内存 new构造方法会开辟两块堆内存空间,可以使用intern手工入 ...
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- 编写类String的构造函数、析构函数和赋值函数
已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const Str ...
- 类string的构造函数、拷贝构造函数和析构函数
原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html 类string的构造函数.拷贝构造 ...
- 编写类String 的构造函数、析构函数和赋值函数
编写类String 的构造函数.析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造 ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
随机推荐
- laravel-事件
1.注册事件以及监听器 首先我们需要在 app/Providers/目录下的EventServiceProvider.php中注册事件监听器映射关系,如下: /** * The event liste ...
- Luogu_1280_尼克的任务
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- 从TP-Link到雷蛇,纷纷入局智能手机业到底想干什么?
"眼看他起朱楼,眼看他宴宾客,眼看他楼塌了",这句形容世态炎凉的话其实与智能手机市场更为相像.诺基亚的辉煌与没落.黑莓的强势与消声无迹.摩托罗拉的数次易手.小米的横空出世与 ...
- zctf 2016 android writeup - Jieming的博客
本文为2016年zctf中android的writeup. 首先点我下载题目.使用jeb反编译,对username和password进行部分验证后,再将username+password及一个数据库查 ...
- Turn and Stun server · J
本文简介了Turnserver(Turn + Stun)服务器的搭建.Turnserver主要提供了stun服务,支撑NAT.防火墙穿透,turn服务器,支撑打洞失败时的数据中转.使用场景上类似于前端 ...
- Git私服搭建
Git私服搭建 一.Git服务器搭建方式 GIT是一个分布式版本管理系统,既然是分布那么必定会涉及远程通信,那么GIT是采用什么协议进行远程通信? Git支持的四种通信协议: Local(本地协议) ...
- hive、Hbase、mysql的区别
1.Hive和HBase的区别 1)hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce. 2)hive是面向行存储的数据库. 3)Hive本身 ...
- ASP.NET CORE 启动过程及源码解读
在这个特殊的春节,大家想必都在家出不了们,远看已经到了回城里上班的日子,但是因为一只蝙蝠的原因导致我们无法回到工作岗位,大家可能有的在家远程办公,有些在家躺着看书,有的是在家打游戏:在这个特殊无聊的日 ...
- 使用移动自适应布局+easy mock实现移动界面的简单实现
一.使用easy mock模拟数据 easy mock链接地址 二.自己写移动自适应布局 自己编写主要是利用rem进行宽度栅格布局: html { /* 相当于一个界面适配器,pc以及移动端都可以进行 ...
- CSS 实现元素较宽不能被完全展示时将其隐藏
首发于本人的博客 varnull.cn 遇到一个需求,需要实现的样式是固定宽度的容器里一排显示若干个标签,数量不定,每个标签的长度也不定.当到了某个标签不能被完全展示下时则不显示.大致效果如下,标签只 ...