本来这篇博文的内容,本人打算在之后的代码中一点一点通过实例讲解的,但是,本人发现,其实这里的知识点还是蛮重要的。

并且,字符串类型,在任何的程序语言中都是被认真对待的,所以,今天专门写一篇博文来介绍一下这个知识点!


首先,什么是字符串呢?

相信学习过C语言的同学能够知道:

字符串是由多个字符组成的一串数据(字符序列)

字符串可以看成是字符数组

没错,再Java中,也是这样的,但是,相比于C语言,Java这种高级语言,对于字符串是有封装好的类的,那就是我们这篇博文的主题——String类

String类:

在本人之前的博文中,提到过String类,但是只讲了这个类的变量,是字符串类型,并且和所有类型的变量相加,都会将其强转为字符串类型。

那么,现在,本人来讲解String类的其他的 性质 和 常用方法:

现在,本人来展示下String类的常用API

  1. String类的构造方法

常见构造方法

  • public String():

    空构造
  • public String(byte[] bytes):

    把字节数组转成字符串
  • public String(byte[] bytes,int index,int length):

    把字节数组的一部分转成字符串(index:表示的是从第几个索引开始, length表示的是长度)
  • public String(char[] value):

    把字符数组转成字符串
  • public String(char[] value,int index,int count):

    把字符数组的一部分转成字符串
  • public String(String original):

    把字符串常量值转成字符串
  1. String类的判断功能
  • public boolean equals(Object obj):

    比较字符串的内容是否相同,区分大小写
  • public boolean equalsIgnoreCase(String str):

    比较字符串的内容是否相同,忽略大小写
  • public boolean contains(String str):

    判断字符串中是否包含传递进来的字符串
  • public boolean startsWith(String str):

    判断字符串是否以传递进来的字符串开头
  • public boolean endsWith(String str):

    判断字符串是否以传递进来的字符串结尾
  • public boolean isEmpty():
  1. String类的获取功能
  • public int length():

    获取字符串的长度。
  • public char charAt(int index):

    获取指定索引位置的字符
  • public int indexOf(int ch):

    返回指定字符在此字符串中第一次出现处的索引。
  • public int indexOf(String str):

    返回指定字符串在此字符串中第一次出现处的索引。
  • public int indexOf(int ch,int fromIndex):

    返回指定字符在此字符串中从指定位置后第一次出现处的索引。
  • public int indexOf(String str,int fromIndex):

    返回指定字符串在此字符串中从指定位置后第一次出现处的索引。

    可以顺带提一下lastIndexOf系列
  • public String substring(int start):

    从指定位置开始截取字符串,默认到末尾。
  • public String substring(int start,int end):

    从指定位置开始到指定位置结束截取字符串。
  1. String类的转换功能:
  • public byte[] getBytes():

    把字符串转换为字节数组。
  • public char[] toCharArray():

    把字符串转换为字符数组。
  • public static String valueOf(char[] chs):

    把字符数组转成字符串。
  • public static String valueOf(int i):

    把int类型的数据转成字符串。

    注意:String类的valueOf方法可以把任意类型的数据转成字符串。
  • public String toLowerCase():

    把字符串转成小写。
  • public String toUpperCase():

    把字符串转成大写。
  • public String concat(String str):

    把字符串拼接
  1. String类的其他功能:

1.String的替换功能:

  • public String replace(char old, char new)

    将指定字符进行互换
  • public String replace(String old, String new)

    将指定字符串进行互换

2.String的去除字符串两空格:

  • public String trim() 去除两端空格

3.String的按字典顺序比较两个字符串

  • public int compareTo(String str)

    会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果

    如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果

    如果连个字符串一摸一样 返回的就是0
  • public int compareToIgnoreCase(String str)

    跟上面一样 只是忽略大小写的比较

我们先来展示一段代码:

package com.mec.study;

public class AboutString {

	public static void main(String[] args) {
//String的第一种生成方法:
String str1 = new String("第一种生成方法");
//String的第二种生成方法:
String str2 = "第二种生成方法";
//String的第三种生成方法:
String str3 = String.valueOf(123456); //展示字符串长度:
System.out.println(str1.length());
//取字符串字串:
System.out.println(str2.substring(3, 5));
//其他类型变量的强转,字符串的拼接
System.out.println(str3 + 321); String code = null;
for (int i = 0; i < 3; i++) {
code = String.valueOf(1000 + i).substring(1);
System.out.println(code);
}
} }

上面的代码里,蕴含着非常丰富的技巧,

那么现在,本人对上面的最后一个循环中的操作做一下说明:

有的同学可能会想,为什么不将上图中的第22行代码写成如下形式呢:

code = String.valueOf(i)

给i加1000,又将最高位“去掉”,不如不对其进行这两步操作。

这样想的同学,很遗憾,你还是在质疑本人的能力,若是不对其进行那两步操作,那么,就不会有“每个数自动补足三位(自动补零)”现象。

不信,我们来试试:



可以清晰地看到,没有了自动补零的现象!

这样的操作,其实在我们之后的工作中很常用的,希望大家能够对其重视!

下面要讲到String类的字符串的特点了:

特点:

字符串一旦被创建就不能改变

因为字符串的值是在方法区的常量池中划分空间、分配地址值的

我们还是通过一段代码来验证这个结论:

package com.mec.study;

public class AboutString {

	public static void main(String[] args) {
String str1 = "123abc123defg123wxyz"; System.out.println("原str1: " + str1);
System.out.println(str1.replace("123", "ABCD"));
System.out.println("现str1: " + str1);
} }

下面我们来看看运行结果:

可以看到,我们修改的部分在原Sting类的字符串中并没有被体现,即str并没有被改变!

事实上,str.replace()的结果是一个“新字符串”,是String新的对象

我们不断地去new一个新的对象,相当于不断地去malloc,这样下来,是很浪费时间的!

那么,该如何解决这两点问题呢?

下面本人隆重介绍两个类——StringBuffer类 和 StringBuilder类:

StringBuffer类 和 StringBuilder类:

StringBuffer类 和 StringBuilder类这两个类的API甚至完全一样,但是,为什么要设置两个类呢?

答曰:

StringBuffer类

  • 线程安全性高,但是效率低

StringBuilder类

  • 线程安全性低,但是效率高

那么,本人现在介绍下这两个类:

(由于这两个类的API几乎完全相同,所以,本人在这里通过展示StringBuffer类的API来代表两个类都有的API 的展示)

StringBuffer的构造方法

  • public StringBuffer():

    无参构造方法
  • public StringBuffer(int capacity):

    指定容量的字符串缓冲区对象
  • public StringBuffer(String str):

    指定字符串内容的字符串缓冲区对象

StringBuffer的方法

  • public int capacity():

    返回当前容量。 理论值
  • public int length():

    返回长度(字符数)。 实际值

StringBuffer的添加功能

  • public StringBuffer append(String str):

    可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
  • public StringBuffer insert(int offset,String str):

    在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

StringBuffer的替换和反转功能:

  • public StringBuffer replace(int start,int end,String str):

    从start开始到end用str替换
  • public StringBuffer reverse():

StringBuffer的截取功能:

  • public String substring(int start):

    从指定位置截取到末尾
  • public String substring(int start,int end):

    截取从指定位置开始到结束位置,包括开始位置,不包括结束位置

注意事项:

返回值类型不再是StringBuffer本身

StringBuffer和String的相互转换:

String --> StringBuffer:

  • 通过构造方法
  • 通过append()方法

B:StringBuffer --> String:

  • 使用substring方法
  • 通过构造方法
  • 通过toString()方法

而至于StringBuilder这个类,所有的API都和StringBuffer类的大致相同,本人在这里就不啰嗦了。

现在,本人来展示下,这两个类的字符串的基本使用方法:

package com.mec.study;

public class AboutStringBuffer {

	public static void main(String[] args) {
StringBuffer str = new StringBuffer("abc");
str.append(123);
System.out.println(str);
} }

最后,本人来介绍一个非常重要的方法——得到计算机当前机器时间的方法( currentTimeMillis() ):

那么,本人现在来验证下StringBuffer 究竟比 String 的速度快了多少 :

package com.mec.study;

public class AboutStringBuffer {

	public static void main(String[] args) {
//String 类字符串的拼凑耗时测试
String str = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str += 1;
}
long endTime = System.currentTimeMillis();
System.out.println("String拼凑字符串耗时: " + (endTime - startTime) + "毫秒"); //StringBuffer 类字符串的拼凑耗时测试
StringBuffer strBuffer = new StringBuffer();
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
strBuffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("String拼凑字符串耗时: " + (endTime - startTime) + "毫秒");
} }



在以上的测试中,我们能够直观地了解到:

若是我们处理的字符串只是简单常量,或者字符串在整个程序运行过程中变化不大,我们就推荐用String类字符串;

而若是我们的程序要求字符串不断变化,那么StringBuffer类字符串 和 StringBuilder类字符串 好些。

详解 字符串—— String、StringBuffer 与 StringBuilder的更多相关文章

  1. redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...

  2. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  3. String,StringBuffer与StringBuilder

    1. String,StringBuffer与StringBuilder的区别 String:存储在常量池中:是不可变的字符序列,任何对String值的改变都会引发新的String对象的生成,因此执行 ...

  4. BAT批处理中的字符串处理详解(字符串截取)

    BAT批处理中的字符串处理详解(字符串截取)   BAT批处理中的字符串处理详解(字符串截取 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理 ...

  5. Java String, StringBuffer和StringBuilder实例

    1- 分层继承2- 可变和不可变的概念3- String3.1- 字符串是一个非常特殊的类3.2- String 字面值 vs. String对象3.3- String的方法3.3.1- length ...

  6. 【Redis】redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...

  7. String, StringBuffer and StringBuilder

    一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class Stri ...

  8. String,StringBuffer和StringBuilder

    String,StringBuffer和StringBuilder分别应该在什么情况下使用? String 是Java的字符串类,其实质上也是用Char类型存储的,但是除了hash属性,其他的属性都声 ...

  9. String,StringBuffer和StringBuilder的异同

                                                                    String,StringBuffer和StringBuilder的异同 ...

随机推荐

  1. Nginx 实现API 网关

    1,网关 网关(Gateway)就是一个网络连接到另一个网络的“关口”. 在Nginx 配置负载均衡之后,可以进入到网关,在网关决定进入到哪个真实的web 服务器. 2,将Ngnix 配置 API 网 ...

  2. 一篇漫画故事带你理解透HTTPS(上)

    2020年蝙蝠纪元,二毛一如往常的呆在家中,不敢外出去浪. 为排解心中之闷,二毛抽了一口老烟,熟练的打开了全球最大的同性交友网站,准备假装了解下最近流行的项目... 只听啪的一声回车键,哪知浏览器蹦出 ...

  3. JAVA常见面试题问题简述(持续更新中)

    JAVA常见面试题问题简述 1. springcloud和dubbo的区别 ①相比之下springcloud 的社区会更加活跃,解决问题的速度也会越来越快,dubbo相对来说如果碰到没有解决的问题,就 ...

  4. mysql物理级别热备脚本

    #!/bin/bash mysql_backup_dir=/data/databaseup/ mysql_username="root" mysql_password=" ...

  5. 单芯片DP108USB声卡/音频解决方案完全替代CM108/CM108AH

    简介 DP108是一种高度集成的单芯片USB音频解决方案.所有重要的模拟模块嵌入DP108,包括双DAC和耳机放大器,ADC和麦克风助力器,锁相环,调节器,和USB收发器.许多功能与跳线或外部EEPR ...

  6. MySQL操作表的约束

    完整性:指数据库的准确性和一致性. 约束:是在表中定义的用于维护数据库完整性的一些规则. 主键:给某一个字段来唯一标识所有记录,值是唯一的,非空的 外键:多个表之间参照的完整性. 一.设置非空约束 u ...

  7. python部署-Flask+uwsgi+Nginx

    一.Flask部分(app.py) flask即Python代码:部分参考代码如下,相信很多人如果看到这篇文章一定有flask的代码能力. from app import create_app fro ...

  8. Tcl编程第三天,数学运算

    1.tcl语言没有自己的数学计算,如果想要使用数学公式,必须得用C语言的库.使用方法如下. #!/usr/bin/tclsh set value [expr 8/5] puts $value set ...

  9. 2017蓝桥杯取位数(C++B组)

    题目: 标题:取数位求1个整数的第k位数字有很多种方法.以下的方法就是一种.// 求x用10进制表示时的数位长度 int len(int x){ if(x<10) return 1; retur ...

  10. Java第十二天,权限修饰符

    Java当中权限修饰符共有四种.分别是public.protected.(default).private. 注:YSE代表可访问,NO代表不可访问.   同一个类 同一个包,非继承 不同的包,有继承 ...