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类的特点的更多相关文章

  1. 简单看看这两个类 String和StringBuilder

    我记得以前在园子里面讨论这两个类的文章有很多很多,并且还拿出了很多的测试报告,在什么情况下,谁比谁快,在什么情况下,该用谁 不该用谁等等这些,我这里就不比较了,我就简单看看他们里面的内部实现,那就先看 ...

  2. string、math类、random随机数、datetime、异常保护

    今天讲的知识点比较多,比较杂,以至于现在脑子里还有点乱,慢慢来吧... string (1)string.length; (获得你string字符串的长度) (2)a = a.Trim(); 重新赋值 ...

  3. 类-string/Manth/Random/DateTime-及练习

    类一.string类:.Length 字符串的长度 .Trim() 去掉开头以及结尾的空格.TrimStart() 去掉开头的空格.TrimEnd() 去掉结尾的空格 .ToLower() 全部转换为 ...

  4. 2016年10月12日--string、Math类、Random随机数、DateTime、异常保护

    string string.length; //得到string长度 string.Trim(); //去掉string前后的空格 string.TrimStart(); //去掉string前的空格 ...

  5. String类StringBuffer类与StringBuilder类gc垃圾回收

    String类的特点 直接赋值和new调用构造方法两种, 直接赋值时会将字符串常量入内存池,当其他变量再赋相同值时,不再在堆空间开辟内存 new构造方法会开辟两块堆内存空间,可以使用intern手工入 ...

  6. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;

    ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口:       2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...

  7. 编写类String的构造函数、析构函数和赋值函数

    已知类String的原型为: class String {   public:  String(const char *str = NULL); // 普通构造函数  String(const Str ...

  8. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html   类string的构造函数.拷贝构造 ...

  9. 编写类String 的构造函数、析构函数和赋值函数

    编写类String 的构造函数.析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造 ...

  10. JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类

    字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...

随机推荐

  1. laravel-事件

    1.注册事件以及监听器 首先我们需要在 app/Providers/目录下的EventServiceProvider.php中注册事件监听器映射关系,如下: /** * The event liste ...

  2. Luogu_1280_尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  3. 从TP-Link到雷蛇,纷纷入局智能手机业到底想干什么?

    ​   "眼看他起朱楼,眼看他宴宾客,眼看他楼塌了",这句形容世态炎凉的话其实与智能手机市场更为相像.诺基亚的辉煌与没落.黑莓的强势与消声无迹.摩托罗拉的数次易手.小米的横空出世与 ...

  4. zctf 2016 android writeup - Jieming的博客

    本文为2016年zctf中android的writeup. 首先点我下载题目.使用jeb反编译,对username和password进行部分验证后,再将username+password及一个数据库查 ...

  5. Turn and Stun server · J

    本文简介了Turnserver(Turn + Stun)服务器的搭建.Turnserver主要提供了stun服务,支撑NAT.防火墙穿透,turn服务器,支撑打洞失败时的数据中转.使用场景上类似于前端 ...

  6. Git私服搭建

    Git私服搭建 一.Git服务器搭建方式 GIT是一个分布式版本管理系统,既然是分布那么必定会涉及远程通信,那么GIT是采用什么协议进行远程通信? Git支持的四种通信协议: Local(本地协议) ...

  7. hive、Hbase、mysql的区别

    1.Hive和HBase的区别 1)hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce. 2)hive是面向行存储的数据库. 3)Hive本身 ...

  8. ASP.NET CORE 启动过程及源码解读

    在这个特殊的春节,大家想必都在家出不了们,远看已经到了回城里上班的日子,但是因为一只蝙蝠的原因导致我们无法回到工作岗位,大家可能有的在家远程办公,有些在家躺着看书,有的是在家打游戏:在这个特殊无聊的日 ...

  9. 使用移动自适应布局+easy mock实现移动界面的简单实现

    一.使用easy mock模拟数据 easy mock链接地址 二.自己写移动自适应布局 自己编写主要是利用rem进行宽度栅格布局: html { /* 相当于一个界面适配器,pc以及移动端都可以进行 ...

  10. CSS 实现元素较宽不能被完全展示时将其隐藏

    首发于本人的博客 varnull.cn 遇到一个需求,需要实现的样式是固定宽度的容器里一排显示若干个标签,数量不定,每个标签的长度也不定.当到了某个标签不能被完全展示下时则不显示.大致效果如下,标签只 ...