前面在举例时有出现过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入门篇(五)——Java的字符串/String类的更多相关文章

  1. 《java入门》第一季之类(String类字符串一旦被赋值就没法改变)

    毫无疑问,String类是java里面最重要的类之一.因此它有很多方法需要了解和掌握. 字符串一旦被赋值,值就不能发生改变: package cn.itcast_02; /* * 字符串的特点:一旦被 ...

  2. Java基础篇(02):特殊的String类,和相关扩展API

    本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...

  3. 《java入门第一季》之类(String类常见方法小叙)

    String类下面的构造方法和一些常见的方法: /* * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,可以知道 * A:字符串字面值"abc&quo ...

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

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

  5. JAVA笔记3__字符串String类/对象一对一关联

    import java.lang.String; import java.util.Scanner; public class Main { public static void main(Strin ...

  6. Java基础系列2:深入理解String类

    Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...

  7. Java总结篇:Java多线程

    Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...

  8. JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

    JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...

  9. java提高篇-----理解java的三大特性之封装

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

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

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

随机推荐

  1. 《Django By Example》Chap 4中出现的 “RelatedObjectDoesNotExist”错误

    models.py

  2. 使用JavaScript将图片保存至本地

    在最近的开发当中,我们需要为img标签以及canvas动态绘制的图像提供下载功能,下面是经过探索后我们得出的结果. 一.Canvas 版本 // 下载Canvas元素的图片 function down ...

  3. Java 反编译工具下载

    反编译,通俗来讲,就是将.java 文件经过编译生成的 .class 文件还原.注意这里的还原不等于 .java 文件.因为Java编译器在编译.java 文件的时候,会对代码进行一些处理. 那么接下 ...

  4. CSS3 自定义动画(animation)

    除了在之前的文章中介绍过的 CSS3 的变形 (transformation) 和转换 (transition) 外,CSS3 还有一种自由度更大的自定义动画,开发者甚至可以使用变形(transfor ...

  5. 启用composer镜像服务

    使用composer下载东西,需要FQ时,可使用其镜像服务 安装composer后,命令行执行全局配置 composer config -g repo.packagist composer https ...

  6. Python学习_03_列表、元组、字符串

    列表.元组.字符串这些通过顺序访问的对象统称为序列. 序列的标准操作符 对于一般的序列对象,包括列表.元组.字符串,都具有以下的标准操作: 1. element [not] in seq判断一个元素是 ...

  7. Head First设计模式之模板方法模式

    一.定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法结构的情况下,重定义该算法中的某些特定步骤. 比较通俗的说法,子类决定如何实现算法中的某些步骤,比如两个一连串 ...

  8. Qt实现QQ界面

    1.Qt实现QQ界面是通过QToolBox类来实现的,基本结构是:QToolBox里面装QGroupBox,然后QGroupBox里面装QToolButton,设置好相关属性即可 2.定义类继承QTo ...

  9. File System 之本地文件系统

    上一篇文章提到了,最近做一个基于 File System/IndexedDB的应用,上一篇是定额和使用的查询. 因为LocalFileSystem只有chrome支持,有点尴尬,如果按需加载又何来尴尬 ...

  10. AJAX的写法

    AJAX可以说是前端开发必须要会的技术.AJAX是异步的javascript and xml.是他们技术的合称. 1.原生写ajax.很多小伙伴在会了jQuery后,将原生都忘记了,所以原生我还是要在 ...