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. 教你如何将txt复制到excel的各个单元格;并解决科学计数法显示问题及导致的个位数变0问题

    1.如果你的txt或log等文件中的数据每个数据刚好都回车了,那么直接粘贴到excel即可: 2.如果你的txt或log等文件中数据较多,回车之后的每一行数据仍需再次分列,那么要求:每一行中需要分列的 ...

  2. Laravel wxxcx 微信小程序获取用户信息

    wxxcx 是Laravel5微信小程序登录获取用户信息扩展 部署 12345678 # 安装$ composer require iwanli/wxxcx# 注册服务# 在 /config/app. ...

  3. 杀入红海市场 ZUK手机底气在哪?

       从越来越奢华的发布会舞台屏幕,到创意越来越烧脑的邀请函,一款新手机的发布工作变得越来越系统化.何时展示.如何亮相,都成为影响一部手机情怀,甚至销售好坏的重要因素.虽然很难以一个固定标准衡量各个手 ...

  4. zepto.js和jquery.js函数比较有什么优点?

    1.Zepto.js 是专门为现代智能手机浏览器退出的 Javascript 框架, 拥有和jQuery相似的语法, 但是和jQuery相比下来, 他有很多优点, 大小方面 , 压缩后的 zepto. ...

  5. 视频播放插件JWPlayer的使用

      JwPlayer  简介   JW Media Player是一个开源的在网页上使用的Flash视频.音频以及图片播放器,支持 Sliverlight 播放,支持H.264 ( .mp4, .mo ...

  6. 通过ELK快速搭建集中化日志平台

    ELK就是ElasticSearch + LogStash + Kibana 1.准备工作 ELK下载:https://www.elastic.co/downloads/ jdk version:1. ...

  7. linux下大文件处理

    linux下采用先分割后合并的策略处理大文件 第一步:分割文件 split split 参数:-a, --suffix-length=N     指定输出文件名的后缀,默认为2个-b, --bytes ...

  8. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

  9. 使用TensorFlow训练自己的语音识别AI

    这次来训练一个基于CNN的语音识别模型.训练完成后,我们将尝试将此模型用于Hotword detection. 人类是怎样听懂一句话的呢?以汉语为例,当听到"wo shi"的录音时 ...

  10. Leetcode 141题 环形链表(Linked List Cycle) Java语言求解

    题目描述: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Map ...