码迷,mamicode.com
首页 > 其他好文 > 详细

6、字符串

时间:2015-11-29 16:22:13      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

? ?

6.1 String 字符串

? ?

Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准的Java类库中提供了一个预定义类(String)。

每个用双引号括起来的字符串都是String类的一个实例:

String a = "";//这是一个字符串

????????String get = "Hello";

? ?

6.1.1子串

String类的 substring() 方法可以从一个较大的字符串中提起出一个子串。

String greeting = "Hello World!"; //原字符串

????????String s = greeting.substring(0,5);// substring(int startIndex,int endIndex); 取值区间为[starIndex,endIndex)

技术分享

substring(int starIndex,int endIndex) 是从基字符串的startIndex 位置开始复制 到endIndex 位置,但是不包括endIndex位置的字符

优点:子字符的长度容易计算:长度=endIndex – startIndex;

6.1.2 拼接

????Java允许使用‘+‘连接(拼接)两个字符串。

常用示例:

String greeting = "Hello World!";

System.out.println("这是一个字符串"+greeting);//可以使用+连接两个字符串

6.1.3不可变字符串

? ?

String对象是不可变的。String类中每一个看起来会修改String值得方法实际上都是创建一个全新的String对象,以包含后的字符串内容。而最初的String对象丝毫未动。

以substring(int startIndex,int endIndex)方法的源码为例:

public String substring(int beginIndex, int endIndex) {

if (beginIndex < 0) {

throw new StringIndexOutOfBoundsException(beginIndex);

}

if (endIndex > value.length) {

throw new StringIndexOutOfBoundsException(endIndex);

}

int subLen = endIndex - beginIndex;

if (subLen < 0) {

throw new StringIndexOutOfBoundsException(subLen);

}

return ((beginIndex == 0) && (endIndex == value.length)) ? this

: new String(value, beginIndex, subLen);

}

? ?

可以发现当产生字符串时,是产生了一个新的String对象返回。

6.1.4检测字符串是否相等

  • 使用equals方法来检测两个字符串时否相等

    表达式: s.equals(t) 如果字符串s与字符串t则返回true;否则返回false。

    S与t可以是字符串变量,也可以是字符串常量 。

    String greeting = "Hello World!";

    "Hello World!".equals(greeting);//合法

    ? ?

    ? ?

  • 使用equalsIgnoreCase方法,不区分大小写检测两个字符串是否相等。

    String greeting = "Hello World!";

    System.out.println("hello world!".equalsIgnoreCase(greeting));//不区分打小写的比较两个字符是否相等

    ? ?

  • 不能使用 == 符号判断两个字符串是否相等。这个运算符是只能够确定两个字符串是否放在同一个位置上。如果是放在同一位置上那么就相等

    String greeting = "Hello World!"; //原字符串

    String s = greeting.substring(0,5);

    String get ="Hello";

    System.out.println("使用==比较两个不共享字符串:"+(get==s));

    System.out.println("使用==比较两个共享字符串:"+("Hello World!"=="Hello World!"));

实际上只有字符串常量是共享的,而+活substring的操作产生的字符串时不共享的。

6.1.5空串与null

  • 空串 ""是长度为0的字符串

    判断字符串是否为空串 str.length == 0 或str.equals("")

  • 字符串还可以存放null值,当为字符串为 null时,不能调用方法

    判断是否 为null

    null == str

    ? ?

String empty = "";

????????System.out.println("empty是否为空串:"+("".equals(empty)));

????????String nullStr = null ;

????????System.out.println("nullStr是否为null"+(nullStr == null));

????nullStr.equals("");//编译时正确,运行时抛出异常: java.lang.NullPointerException.原因:nullStr null

6.1.6 String类API

下面 是一些常用的String类方法介绍:

  • char charAt(int index)

    返回给定位置的字符。

  • int compareTo(String other)

    按字典顺序,如果字符串位于other之前返回负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。

  • boolean endsWith(Stirng suffix)

    如果字符串以suffix结尾,返回true

  • int length()

    返回字符串的长度

  • String replace(CharSequence oldString, CharSequence newString)

    返回一个新的字符串,这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数

  • boolean startsWith(String suffix)

    如果字符串以suffix开始,返回true

  • String toLowerCase()

    返回一个新的字符串,把字符串所有的字符转化为小写

  • String toUpperCase()

    返回一个新的字符串,把字符串所有的字符转化为大写

  • String trim()

    返回一个新的字符串,去除字符串中头部和尾部的空格

    ? ?

    ? ?

    示例:

    步骤1,在Demo010项目的com.zjk.type包下创建StudyString类

    源码:

package com.zjk.type;

/**

*

*@类名 StudyString

*@日期 20151129日上午11:26:23

*@作者 zjkorder

*@版本 v1.0

*@描述????

* 字符串类的学习

* main方法所在类

*/

public class StudyString {

???? ? ?

???? ?

????public static void main(String[] args) {

???????? ?

????????String greeting = "Hello World!"; //原字符串

????????String get ="Hello";

????????String s = greeting.substring(0,5);// substring(int startIndex,int endIndex); 取值区间为[starIndex,endIndex)

????????System.out.println(s);

???????? ?

????????System.out.println("这是一个字符串"+greeting);//可以使用+连接两个字符串

????????System.out.println("比较两个字符串是否相等:"+("Hello World!".equals(greeting)));//合法

????????System.out.println("使用==比较两个不共享字符串:"+(get==s));

????????System.out.println("使用==比较两个共享字符串:"+("Hello World!"=="Hello World!"));

????????System.out.println("不区分大小写比较两个字符串是否相等:"+("hello world!".equalsIgnoreCase(greeting)));//不区分打小写的比较两个字符是否相等

???????? ?

????????String empty = "";//这是一个字符串

????????System.out.println("empty是否为空串:"+("".equals(empty)));

????????String nullStr = null ;

????????System.out.println("nullStr是否为null"+(nullStr == null));

//????????nullStr.equals("");//编译时正确,运行时抛出异常: java.lang.NullPointerException.原因:nullStr null

???????? ? ?

???????? ?

????????/* API */

????????String ss = " Hello World!"; //原始字符串

????????System.out.println("ss字符串的长度为:"+(ss.length()));

????????System.out.println("ss的第3个字符为:"+(s.charAt(3)));

????????System.out.println("\"kl\"字符串在与ss字符串排序比较"+(ss.compareTo("kl")));

????????System.out.println("ss字符串是否是以\"!\"结尾"+(ss.endsWith("!")));

????????System.out.println("ss字符串是否是以\" \"开始"+(ss.startsWith(" ")));

????????System.out.println("\"hello world!\"代替ss字符串中的\"Hello World\""+(ss.replace("Hello World!", "hello world!")));

????????System.out.println("ss字符串全部变为大写:"+(ss.toUpperCase()));

????????System.out.println("ss字符串全部变为小写:"+(ss.toLowerCase()));

????????System.out.println("去除ss字符串头部和尾部的空格:"+(ss.trim()));

???????? ?

???????? ?

????}

? ?

}

? ?

6.2可变字符StringBuilder和StringBuffer

? ?

6.2.1 StringBuilfer

????每次连接字符串,都会构建一个新String对象,即耗时又浪费空间使用StringBuilder类可以避免这个问题的发生

第一:构建字符串构建器:

StringBuilder builder = new StringBuilder();//一个空的字符串构造器

????????StringBuilder builder2 = new StringBuilder("Hello");//一个有初始值的字符串构造器

????第二: 需要添加内容时,调用append方法

builder.append("hello");//在字符串的后面添加一个字符串

第三:需要显示是调用toString方法

System.out.println(builder.toString());//输入

API文档:

  • int length()

    返回字符长度

  • void setCharAt(int I,char c)

    将第i位置的字符设置为c

  • StringBuilder insert(int offset,String str)

    在oddset位置插入字符str并返回插入后字符构建器

  • StringBuilder delete(int startIndex,int endIndex)

    删除startIndex位置到endIndex-1位置的字符串并返回删除后的字符构造器

    示例:

    步骤1: 在Demo010项目的com.zjk.type包下创建StudyStringBuilder类

    源码:

package com.zjk.type;

/**

*

*@类名 StudyStringBuilder

*@日期 20151129日下午3:04:34

*@作者 zjkorder

*@版本 v1.0

*@描述????

* StringBuilder类的学习

* main方法所在类

*/

public class StudyStringBuilder {

? ?

? ?

????/**

???? *

???? * @Title: main

???? * @Description: TODO(这里用一句话描述这个方法的作用)

???? * @param @param args 设定文件

???? * @return void

???? * @throws

???? *

???? */

????public static void main(String[] args) {

???????? ?

????????StringBuilder builder = new StringBuilder();//一个空的字符串构造器

????????StringBuilder builder2 = new StringBuilder("Hello");//一个有初始值的字符串构造器

????????builder.append("hello");//在字符串的后面添加一个字符串

????????System.out.println(builder.toString());//输入

????????System.out.println("字符构建器的长度为:"+builder.length());

????????builder.setCharAt(0, ‘H‘);//将第0位置的h更改为H

????????System.out.println("更改后的字符串为:"+builder.toString());

????????builder = builder.insert(0, ‘h‘);//在第0位置插入h

????????System.out.println("更改后的字符串为:"+builder.toString());

????????builder = builder.delete(1, 2);//删除第1位置到2-1位置的字符

????????System.out.println("更改后的字符串为:"+builder.toString());

???????? ?

???????? ?

????}

}

? ?

6.2.2 StringBuffer

? ?在讲解StringBuffer类之前先来回顾一下String类特点:

一个字符串常量就是String类的匿名对象;

String类对象有两种实例化方式:

? ? ? ? ? ? ? ? ? ? ? |-方式一:直接赋值,可以自动入池,只开辟一块内存空间;

? ? ? ? ? ? ? ? ? ? ? |-方式二:构造方法实例化,会开辟两块空间,其中一块将成为垃圾,不会自动入池,可以使用intern()方法手工入池;

·字符串内容一旦声明则不可改变。

? ? ? 正是因为字符串内容一旦声明不可改变,所以如果在频繁修改字符串内容的程序上是不能够使用String的,那么为此在Java之中又提供有一个StringBuffer类,而String和StringBuffer类最大的特征在于:String不可改变内容,而StringBuffer可以改变。在String类对象之中使用"+"可以实现字符串连接操作,但是在StringBuffer类之中只能够使用append()方法实现字符串连接:public StringBuffer append(数据类型b)。既然返回的是StringBuffer就可以一直使用append()连接。

跟StringBuilder类的方法组相似。

6.2.3 String StringBuilder和StringBuffer的比较

String、StringBuffer、StringBuilder的区别:

  • String不适合于字符串的频繁修改,而StringBuffer和StringBuilder适合于频繁修改,而且速度要远远高于String;
  • StringBuffer是在JDK ?1.0的时候引入的,而StringBuilder是在JDK ?1.5的时候引入的,而且StringBuffer和StringBuilder继承结构相同,方法的组成也相同;
  • StringBuffer中的所有方法都使用synchronized进行标记,都是同步方法,性能相对较低,而StringBuilder采用的异步处理,性能相对较高,但是StringBuffer在多线程操作时的数据安全性要高于StringBuilder。

6.3输入

需要在控制台输入需要Scanner的对象。

System.out 是标准输出流那么System.in 就是标准输入流

第一:构建Scanner对象

Scanner input = new Scanner(System.in);//构建控制台接收对象

第二:读取读取输入的一行数据

String ss = input.nextLine();//接收控制台输入的一行数据并保存到SS字符串中

第三: 关闭Scanner

input.close();//关闭控制台的接收器

?

Scanner 的常用方法有:

  • String next()

    读取输入的单词以空格作为分割

  • Int nextInt()

    读取输入的整数返回int型数据

  • double nextDouble()

    读取输入的浮点数

  • boolean hasNext()

    检测输入中是否还有其他单词

  • boolean hasNextInt()

    检测输入中是否还有其他整数

  • boolean hasNextDouble()

    检测输入中是否还有其他浮点数

    ?

    如果是读取密码可以使用:

    Console类实现(在IDE中无法使用)

    ?

    ? ?

    ? ?

    ? ?

    ? ?

    ??

6、字符串

标签:

原文地址:http://www.cnblogs.com/zjkorder/p/5004773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!