前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的。其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基本数据类型一样使用,声明与初始化等操作都是相同的,是程序经常处理的对象,所以学好String的用法很重要。

一、创建字符串

  在Java中用String类的构造方法来创建字符串变量,常用构造方法如下:

  1. 使用String()方法初始化一个新创建的String对象。

String s = new String();

  2. 使用String(char a[])方法创建String对象。

char a[] = {'h','e','l','l','o'};
String s = new String(a);

  上述代码等价于 String s = new String("hello");

  3. 使用String(char a[], int offset, int length)方法创建对象。

char a[] = {'s','t','u','d','e','n','t'};
String s = new String(a, 2, 4);

  上述代码等价于 String s = new String("uden"); 。offset表示开始截取字符串的位置(从0开始),length表示截取长度。所以此例表示从数组a中下标为2的元素‘u’开始截取,截取长度为4,所以截取出的字符串为“uden”。

  一般情况下也可以直接声明: String s = "We are Students";

二、字符串操作

  对于已经声明的字符串,可以对其进行相应的操作。

  1. 字符串连接

  当连接多个字符串时,在每两个连接的字符串之间用“+”相连,“+”就是字符串的连接符,连接之后生成一个新的字符串。

String s1 = new String("hello");
String s2 = new String("world");
String s = s1 + " " + s2;

  这种写法在之前的例子中也出现过很多次,将s1、空格、s2进行连接,运行结果就是“hello world”。

  当字符串和其他数据类型连接时,同样使用“+”连接符,连接之后的返回值是字符串。

int year = 2018;
int month = 1;
int day = 24;
float time = 2.5f; System.out.println("今天是"+year+"年"+month+"月"+day+"日"
+"这篇博客大概要写"+time+"个小时");

  当一个字符串过长时,可以通过使用“+”在两行中写。

  2. 获取字符串信息

  对一个字符串进行操作,我们首先需要知道它的长度,使用String类的length()方法可以获取声明的字符串对象的长度。

String s = "We are students";
System.out.println("字符串的长度是 : " + s.length());

  上述代码的运行结果是15,很明显空格也计算在内了,这点需要注意。

  我们需要获取的字符串信息除了长度,还有一个就是索引位置,当我们需要一个字符串的某一个字符时,需通过索引位置获取该字符。String类中提供了indexOf()和lastIndexOf()方法来获取指定字符的索引位置。区别在于,前者返回的是搜索的字符首次出现的位置的索引,后者返回的是搜索的字符最后出现位置的索引。

String str = "We are students";
System.out.println(str.indexOf("s")); // s首次出现的位置索引
System.out.println(str.lastIndexOf("s")); // s最后一次出现的位置索引

  运行结果是7和14,str的存储状态如下:

W e   a r e   s t u d e n t s
0 10 11 12 13 14

  当然,我们还可以获取指定索引位置的字符,使用String类中的charAt()方法,返回字符的索引,示例如下:

String s = "hello world";
char a = s.charAt(6);

  则字符a的值为w。

  3. 去除字符串中的空格

  对于一个字符串,有时可能需要去掉内部的空格来完成某一些操作,去掉字符串空格有两种,一种是去除字符串的前导、尾部空格,另一种是去除字符串中的所有空格,可以用不同的方法来实现。

  trim()方法用于去掉字符串的前导、尾部空格,如下:

String s1 = "    hello world    ";
String s2 = s1.trim();

  运行后,s2变为“hello world”,此方法只去除了前导空格和尾部空格,而中间的空格没有去掉。

  如果要去除所有的空格,可以使用StringTokenizer()和replaceAll()方法来实现。具体使用方法可查阅Java API,这里不过多赘述了,两个方法的语法格式如下:

StringTokenizer(String str, String delim)
str.replaceAll(String regex, String replacement)

  4. 字符串替换

  字符串替换就是新字符串替换原字符串中指定位置的字符串,生成一个新的字符串,通过replace()和replaceFirst()等方法可以实现。

String s = "bad bad study";
String s1 = s.replace("bad","good");
String s2 = s.replaceFirst("bad","good");

  上述代码s1、s2分别为使用replace()和replaceFirst()方法获得的新字符串,s1的值为“good good study”,s2的值为“good bad study”。从这里应该很容易发现它们的区别了,replace()方法是将原字符串中所有的要被替换的字符串全部替换了,而replaceFirst()方法只替换第一个出现的要被替换的字符串。

  5. 判断字符串

  判断字符串是一个比较重要的知识点,因为我们经常需要判断两个字符串是否相等,并返回它的boolean值,这里最容易出现的问题就是用“==”来判断字符串是否相等,这种做法是错误的,因为比较运算符“==”比较的是内存位置,不适宜拿来比较字符串。那字符串应该用什么来进行比较呢?

  判断字符串是否相等有equals()和equalsIgnoreCase()两种方法,区别在于前者严格区分大小写,而后者忽略大小写。我们可以举个例子试一下:

 public class Opinion {

     public static void main(String[] args) {
String s1 = new String("http://www.cnblogs.com/adamjwh/");
String s2 = new String("http://www.cnblogs.com/adamjwh/");
String s3 = new String("HTTP://WWW.CNBLOGS.COM/ADAMJWH/");
String s4 = s1; System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1 == s4 : " + (s1 == s4));
System.out.println("s1.equals(s2) : " + s1.equals(s2));
System.out.println("s1.equals(s3) : " + s1.equals(s3));
System.out.println("s1.equalsIgnoreCase(s2) : " + s1.equalsIgnoreCase(s2));
System.out.println("s1.equalsIgnoreCase(s3) : " + s1.equalsIgnoreCase(s3));
} }

  运行结果如下:

  

  现在分析一下这个代码,首先定义了两个字符串类型的变量s1、s2,并赋了两个一模一样的值(这里要注意,值是相同的),然后定义了一个s3为s1的大写形式,用于比较两个方法的区别,又定义了一个s4并将s1赋予它,说明此时s1与s4的值相同。首先用比较运算符“==”对s1、s2和s1、s4分别进行比较,获得的结果是s1不等于s2但等于s4,这是为什么呢?因为上面说过了,比较运算符“==”比较的是内存位置,这跟Java的字符串存储机制有关,基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的String常量放在常量池中,String对象放在堆中,所以得到了如上的结果,还不太懂的朋友可以搜索有关Java中字符串存储的信息。后面的equals()和equalsIgnoreCase()方法的比较就不多说了,结果很明显,二者的区别在于是否区分大小写。

  String类中还提供了startsWith()和endsWith()方法分别用于判断字符串是否以指定的内容开始和结尾,返回值都为boolean类型,具体可查阅API,这里就不多赘述了。

  6. 字母的大小写转换

  String类还提供了字母的大小写转换的方法,即toLowerCase()和toUpperCase()方法,语法格式如下:

str.toLowerCase()
str.toUpperCase()

  使用toLowerCase()和toUpperCase()方法进行大小写转换时,数字或非字符不受影响。

  7. 字符串分割

  split()方法根据指定的分割符对字符串进行分割,并将分割后的结果存放在字符串数组中。它提供了两种重载形式,一种是完全分割,一种是限定分割的份数,示例如下:

String s = new String("abc,def,ghi,jkl");
String[] s1 = s.split(","); // 根据","拆分字符串
String[] s2 = s.split(",", 2); // 根据","拆分字符串,拆分份数为2份

  s1、s2为分别用两种拆分方式拆分字符串所获得的数组。其中s1数组中的元素为“abc”、“def”、“ghi”、“jkl”;s2因为拆分分数为两份,所以s2数组中的元素为“abc”、“def,ghi,jkl”。如果想定义多个分隔符,可使用“|”。

三、格式化字符串

  格式化字符串是程序中经常用到的,主要包括日期格式化、时间格式化、日期/时间组合的格式化和常规类型格式化。

  主要使用的是format()方法,此部分内容不过多赘述了,在程序中使用时只需查阅API进行调用即可,不需要过多的记忆。

四、正则表达式

  对于正则表达式想必很多朋友应该都听说过,或者有写过脚本语言的朋友们也应该学习过正则表达式的使用。那么什么是正则表达式呢?

  在程序设计中,经常需要对输入的数据进行检查,这时就会用到这则表达式,匹配正则表达式则数据格式正确,否则格式错误。

  正则表达式的内容对于初学Java语言的朋友来说也不是很重要的内容,一般很少有用Java的正则表达式进行一下处理,大部分出现正则表达式的情况实在Java后端开发时,前端需要对输入的数据进行判断处理,可能会用JavaScript编写正则表达式,或者在HTML中直接嵌入正则表达式等等。网上关于正则表达式的资料也有很多,真要写的话一时半会儿也写不完,所以这里就不过多赘述了,有兴趣的朋友或者有需要的朋友可以了解一下,这里放条链接可供参考:http://www.runoob.com/java/java-regular-expressions.html

五、字符串生成器

  字符串生成器也即StringBuilder类,是字符串的一个重要的常用类。新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度,也可以动态地执行添加、删除和插入等字符串的编辑操作,大大提高了频繁增加字符串的效率。

  1. StringBuilder类

  说到StringBuilder就不得不说到StringBuffer了。StringBuilder类是一个可变的字符序列,提供一个与StringBuffer类兼容的API,但是并不保证与之同步,该类是StringBuffer类的一个简易替换,在字符串缓存被单个线程使用时要比StringBuffer类快,但是将StrinBuilder的实例用于多个线程是不安全的这时就要使用StringBuffer类来实现。简单来说,就是StringBuilder的效率要比StringBuffer的效率高,但在多线程中StringBuilder是不安全的,而StringBuffer是安全的,但二者的效率都比String要高。

  2. StringBuilder类的常用方法

  StringBuilder类的构造方法有很多,有append、insert、delete等。构造方法如下:

builder.append(String str);
builder.append(StringBuffer sb);
builder.insert(int offset, String str);
builder.delete(int start, int end);

  append方法是将参数指定的字符串/字符串缓存追加到字符串生成器中;insert方法是将参数指定的字符串str添加到指定的位置offset;delete方法是从指定的start开始,到指定的end为止,移除字符串生成器中该位置的子字符串。

  String类还有一种常用的方法toString(),这个方法在字符串生成器中经常使用,用于将字符串生成器转换为字符串,转换后字符串生成器的值不变。

  这里只列举了部分常用的方法,更多请查询java.lang.StringBuilder的API文档。

  

  以上就是本篇关于Java中字符串的内容,这部分内容有许多Java提供的方法需要在API中查询,相比之下知识点就不是很多,需要掌握的就是String类的应用,至于方法可在编程时查阅API来调用相应的方法,但至少要掌握几种常用的方法,比如equals()、length()、toString()方法等等。

Java入门篇(五)——字符串/String类的更多相关文章

  1. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  2. Java入门 - 语言基础 - 14.String类

    原文地址:http://www.work100.net/training/java-string.html 更多教程:光束云 - 免费课程 String类 序号 文内章节 视频 1 概述 2 创建字符 ...

  3. [Java初探04]__字符串(String类)相关

    前言 接下来将暂时将重心偏移向实际操作,不在将大量时间花费在详细的知识点整理上,将会简略知识总结笔记的记录,加强实际练习的时间,实例练习篇也不再同步进行,我会将部分我觉得重要的源码更新在每节知识点后面 ...

  4. Java核心技术第五章——1.类、超类、子类(2)

    继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...

  5. Java入门教程四(字符串处理)

    Java 语言的文本数据被保存为字符或字符串类型.字符及字符串的操作主要用到 String 类和 StringBuffer 类,如连接.修改.替换.比较和查找等. 定义字符串 直接定义字符串 直接定义 ...

  6. 【SSRS】入门篇(五) -- 设置报表格式

    原文:[SSRS]入门篇(五) -- 设置报表格式 在上一节 [SSRS]入门篇(四) -- 向报表添加数据 我们设置好了报表,并可以预览到数据,如下图: 当报表完成后,有个重要的工作就是美化报表格式 ...

  7. Java入门篇(五)——Java的字符串/String类

    前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...

  8. Java字符串String类操作方法详细整理

    关于String类的基本操作,可分为以下几类: 1.基本操作方法 2.字符串比较 3.字符串与其他数据类型之间的转换 4.字符与字符串的查找 5.字符串的截取与拆分 6.字符串的替换与修改 我觉得在整 ...

  9. Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...

随机推荐

  1. AI产品经理成长路

    AI产品经理成长路 https://www.jianshu.com/p/4b98314ad3c0 以下都是自己平时知识的一些总结,只是一些个人的愚见,下面出现的公司.书籍.视频.网站都是自己看过体验过 ...

  2. SAP MM PR中的Fixed ID字段与MD04里PR单据号后的星号

    SAP MM PR中的Fixed ID字段与MD04里PR单据号后的星号 如下图是我手工使用ME51N 创建的一个采购申请单据, ​ MD04去看这个PR, ​ 这个PR号码后面有一个*号,代表它是一 ...

  3. 如何用ABP框架快速完成项目(8) - 用ABP一个人快速完成项目(4) - 能自动化就不要手动 - 使用自动化测试(BDD/TDD)

    做为一个程序员, 深深知道计算机自动化的速度是比人手动的速度快的, 所以”快速”完成项目的一个重要武器就是: 能自动化就不要手动.   BDD/TDD有很多优势, 其中之一就是自动化, 我们这节文章先 ...

  4. JavaScript面向对象编程指南(五) 原型

    第5章 原型 5.1 原型属性 function f(a,b){ return a*b; }; // length 属性 f.length; // constructor 构造属性 f.constru ...

  5. html之head标签

    本文内容: head标签 介绍 常用子标签 meta title link style script 首发时间:2018-02-12 修改: 2018-04-24:修改了标题名称,重新排版了内容,使得 ...

  6. JS 同步输入

    var txtBigBalance; //金额同步输入 if ($.browser.msie)//IE { $("#txtBalanceP").get(0).onpropertyc ...

  7. c/c++求解图的关键路径 critical path

    c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...

  8. c/c++柔性数组成员

    柔性数组成员 定义和声明分离 #include <stdio.h> //只是告诉编译器,当编译到使用到这个函数的的代码时,虽然还没有找到函数定义的实体,但是也让它编译不出错误. exter ...

  9. php学习----数据类型2

    Boolean 布尔类型 这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转 ...

  10. March 09th, 2018 Week 10th Friday

    All good things must come to an end. 好景无常. Love is when the other person's happiness is more importa ...