JAVA从小白到大神第10章字符串

10.1java中的字符串

java中的字符串是由双引号括起来的多个字符

"Hello World","\u0048\u0045\u0020","世界你好","A",""

单个字符用双引号括起来就是字符串而不是字符了,""代表的不是null,空字符串分配了内存空间,null没有分配内存空间。

JAVASE提供了三个字符串类:String,StringBuffer,StringBuilder。String是不可变字符串,StringBuffer,StringBuilder是可变字符串。

10.2使用api文档

java中有很多类,每个类又有很多方法和变量,通过查看javaAPI文档可以知道这些类,方法,变量如何使用。

JAVA8在线API文档,网址是http://docs.oracle.com/javase/8/docs/api/

10.3 不可变字符串

10.3.1String

Java中的不可变字符串是String,属于java.lang包,他也是java非常重要的类。

创建String对象可以通过构造方法实现:

String():使用空字符串创建并初始化一个新的String对象。

String(String original):使用另外一个字符串创建并初始化一个新的String对象。

String(SringBuffer buffer):使用可变字符串对象创建并初始化一个新的String对象。

String(StringBuilder builder):使用可变字符串对象创建并初始化一个新的String对象。

String(byte[] byte):使用平台默认字符集解码指定的byte数组,通过byte数组创建并初始化一个新的String对象。

String(char[] value):通过字符数组创建并初始化一个新的String对象。

String(char[] value,int offset,int count):通过字符数组的子数组创建并初始化一个新的String对象:offset参数是子数组的第一个字符的索引,count参数指定子数组的长度。

例子:

package ChapterTen;

public class CharacterString {
    public static void main(String[] args) {
        //创建字符串对象
        String s1 = new String();
        String s2 = new String("Hello World");
        String s3 = new String("\u0048\u0065\u006c\u006c\u0020\u0057\u006f\u0072\u006c\u0064");
        System.out.println("s2 = " + s2);
        System.out.println("s3 = " + s3);
        
        char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
        //通过字符数组创建字符串对象
        String s4 = new String(chars);
        //通过子字符数组创建字符串对象
        String s5 = new String(chars,1,4);
        System.out.println("s4 = " + s4);
        System.out.println("s5 = " + s5);
        
        byte bytes[] = { 97, 98, 99 };
        //通过byte数组创建字符串对象
        String s6 = new String(bytes);
        System.out.println("s6 = " + s6 );
        System.out.println("s6字符串长度 = "  + s6.length());
        
    }
}
java.lang包中提供了许多java基础类,包括Object,Class,String,Math基本类。使用时不需要引入此包,因为他是由解释器自动引入的。

10.3.2字符串池

String s7 = "Hello";
        String s8 = "Hello";                        //字符串常量
        
        String s9 = new String("Hello");           //使用new关键字创建
        String s10 = new String("Hello");
        
        System.out.println("s7 == s8 : %b%n",s7 = s8);
        System.out.println("s9 == s10 : %b%n",s9 = s10);
        System.out.println("s7 == s9 : %b%n",s7 = s9);
        System.out.println("s9 == s8 : %b%n",s9 = s8);

得出的,结果是

s7 == s8:true

s9 == s10:false

s7 == s9:false

s9 == s8:false

10.3.3字符串拼接

String字符串拼接可以使用+运算符或者String的concat(String str)方法。

package ChapterTen;

public class Stringconcat {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = s1 + " " ;
        String s3 = s2 + "World";
        System.out.println(s3);
        
        String s4 = "Hello";
        //使用+运算符来连接,支持+=运算符
        s4 += " ";
        s4 += "World";
        System.out.println(s4);
        
        String s5 = "Hello";
        //使用concat方法连接
        s5 = s5.concat(" ").concat("World");
        System.out.println(s5);
        
        int age = 18;
        String s6 = "她的年龄是" + age + "岁";
        System.out.println(s6);
        
        java.util.Date now = new java.util.Date();
        //对象拼接自动调用toString()方法
        String s8 = "今天是:" + now;
        System.out.println(s8);    
    }
}
 

10.3.4字符串查找

在String类中提供了indexOf和lastIndexOf方法用于查找字符或字符串,返回值是查找的字符串或字符串所在位置,-1代表没有查到

int indexOf(int ch):从前往后搜索字符ch,返回第一次找到字符ch所在处的索引。

int indexOf(int ch, int fromIndex):从指定的索引开始从前往后搜索字符ch,返回第一次找到字符ch所在的索引。

int indexOf(String str):从前往后搜索字符串str,返回第一次找到字符串str所在的索引。

int indexOf(String str,int fromIndex):从指定的索引开始从前往后搜索字符串str,返回第一次找到字符ch所在的索引。

int lastIndexOf(int ch):从后往前搜索字符ch,返回第一次找到字符ch所在处的索引。

int lastIndexOf(int ch, int fromIndex):从指定的索引开始从后往前搜索字符ch,返回第一次找到字符ch所在的索引。

int lastIndexOf(String str):从后往前搜索字符串str,返回第一次找到字符串str所在的索引。

int lastIndexOf(String str,int fromIndex):从指定的索引开始从后往前搜索字符串str,返回第一次找到字符ch所在的索引。

字符串本质上是字符数组,因此他也有索引,索引从零开始。String的CharAt(int index)方法可以返回索引index所在位置的字符。

package ChapterTen;

public class Stringfind {
    public static void main(String[] args) {
        String sourceStr = "There is a string accessing example.";
        
        //获得字符串长度
        int len = sourceStr.length();
        //获得索引位置16的字符
        char ch = sourceStr.charAt(16);
        
        //查找字符和字符串
        int firstChar1 = sourceStr.indexOf('r');
        int lastChar1 = sourceStr.lastIndexOf('r');
        int firstStr1 = sourceStr.indexOf("ing");
        int lastStr1 = sourceStr.lastIndexOf("ing");
        int firstChar2 = sourceStr.indexOf('e',15);
        int lastChar2 = sourceStr.lastIndexOf('e',15);
        int firstStr2 = sourceStr.indexOf("ing",5);
        int lastStr2 = sourceStr.lastIndexOf("ing",5);
        
        System.out.println("原始字符串长度:" + sourceStr);
        System.out.println("字符串长度:" + len);
        System.out.println("索引16的字符" + ch);
        System.out.println("从前往后搜索r字符,第一次找到它的索引" + firstChar1);
        System.out.println("从后往前搜索r字符,第一次找到它的索引" + lastChar1);
        System.out.println("从前往后搜索ing字符串,第一次找到它的索引" + firstStr1);
        System.out.println("从后往前搜索ing字符串,第一次找到它的索引" + lastStr1);
        System.out.println("从索引为15位置开始,从前往后搜索e字符,第一次找到它的索引" + firstChar2);
        System.out.println("从索引为15位置开始,从后往前搜索e字符,第一次找到它的索引" + lastChar2);
        System.out.println("从索引为5位置开始,从前往后搜索ing字符串,第一次找到它的索引" + firstStr2);
        System.out.println("从索引为5位置开始,从后往前搜索ing字符串,第一次找到它的索引" + lastStr2);
    }
}

输出结果

原始字符串长度:There is a string accessing example.
字符串长度:36
索引16的字符g
从前往后搜索r字符,第一次找到它的索引3
从后往前搜索r字符,第一次找到它的索引13
从前往后搜索ing字符串,第一次找到它的索引14
从后往前搜索ing字符串,第一次找到它的索引24
从索引为15位置开始,从前往后搜索e字符,第一次找到它的索引21
从索引为15位置开始,从后往前搜索e字符,第一次找到它的索引4
从索引为5位置开始,从前往后搜索ing字符串,第一次找到它的索引14
从索引为5位置开始,从后往前搜索ing字符串,第一次找到它的索引-1

10.3.5字符串比较

1.比较相等

boolean equals(Object anObject):比较两个字符串中内容是否相等

boolean equalsIgnoreCase(String anotherString):类似equals方法,只是忽略大小写

2.比较大小

int compareTo(String anotherString):按字典顺序比较两个字符串,如果参数字符串等于此字符串,则返回值0;如果此字符串小于参数字符串,则返回一个小于0的值;如果此字符串大于参数字符串,则返回一个大于0的值。

int compareToIgnoreCase(String str):类似compareTo,只是忽略大小写

3.比较前缀和后缀

boolean ends With(String suffix):测试此字符串是否以指定的后缀结束。

boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始。

例子:

package ChapterTen;

public class Stringcompare {
        public static void main(String[] args) {
            String s1 = new String("Hello");
            String s2 = new String("Hello");
            //比较字符串是否是相同的引用
            System.out.println("s1 == s2:" + (s1 == s2));
            //比较字符串是否相等
            System.out.println("s1.equals(s2):" + s1.equals(s2));
            
            String s3 = "HELlo";
            //忽略大小写比较字符串内容是否都相等
            System.out.println("s1.equalsIgnoreCase(s3)" + (s1.equalsIgnoreCase(s3)));
            
            //比较大小
            String s4 = "java";
            String s5 = "Swift";
            //比较字符串大小 s4》s5
            System.out.println("s4.compareTo(s5):" + (s4.compareTo(s5)));
            //忽略大小比较字符串大小
            System.out.println("s4.compareToIgnoreCase(s5)" + (s4.compareToIgnoreCase(s5)));
            
            //判断文件夹中文件名
            String[] docFolder = {
                    "java.docx","JavaBean.docx","Objective-C.xlsx","Swift.docx"
            };
            int wordDocCount = 0;
            //查找文件夹中word文档个数
            for(String doc : docFolder) {
                //去掉前后空格
                doc = doc.trim();
                //比较后缀是否有.docx字符串
                if (doc.endsWith(".docx")) {
                    wordDocCount++;
                }
            }
            System.out.println("文件夹中word文档个数是:" + wordDocCount);
            
            int javaDocCount = 0;
            //查找文件夹中Java相关文档的个数
            for (String doc : docFolder) { 
                //去掉前后空格
                doc = doc.trim();
                //全部字符转成小写
                doc = doc.toLowerCase();
                //比较前缀是否有java字符串
                if(doc.startsWith("java")) {
                    javaDocCount++;
                }
            }
            System.out.println("文件夹中Java相关文档个数是:" + javaDocCount);
        }
}

10.3.6字符串截取

String substring(int beginIndex):从指定索引beginIndex开始截取一直到字符串结束的字符串。

String substring(int beginIndex, int endIndex):从指定索引beginIndex开始截取到endIndex-1处的字符,注意包括beginIndex的字符而不包括endIndex处的字符。

例子:

package ChapterTen;

public class Substring {
    public static void main(String[] args) {
        String sourceStr = "THere is a string accessing example.";
        //截取example.字符串
        String subStr1 = sourceStr.substring(28);
        //截取string字符串
        String subStr2 = sourceStr.substring(11,17);
        System.out.printf("subStr1 = %s%n", subStr1);
        System.out.printf("subStr2 = %s%n", subStr2);
        
        //使用split方法分隔字符串
        System.out.println("-----使用split-----");
        String[] array = sourceStr.split(" ");
        for(String str : array) {
            System.out.println(str);
        }
    }

}
10.4可变字符串

可变字符串在追加,删除,修改,插入和拼接等操作过程中不会产生新对象。

10.4.1 StringBuffer和StringBuilder

Java提供了两个可变字符串类StringBuffer和StringBuilder,中文翻译为“字符串缓冲区”。

StringBuffer是线程安全的,它的方法支持线程同步,线程同步会操作串行顺序执行,在单线程环境下会影响效率。StringBuilder是StringBuffer的单线程版本,它不是线程安全的,但是它的执行效率很高。

StringBuffer和StringBuilder的API具有完全相同的API,即构造方法和普通方法等内容一样

四个方法

StringBuilder():创建字符串内容是空的StringBuilder对象,初始容量默认为16个字符。

StringBuilder(CharSequence seq):指定CharSequence字符串创建StringBuilder对象。CharSequence接口类型,它的实现类有String,StringBuffer和StringBuilder等,所以参数seq可以是String,StringBuffer和StringBuilder等类型。

StringBuilder(int capacity):创建字符串内容是空的StringBuilder对象,初始容量由参数capacity指定。

StringBulider(String str):指定String字符串创建StringBuilder对象。

例子:

package ChapterTen;

public class StringBuffer {
    public static void main(String[] args) {
        //字符串长度length和字符串缓冲区容量capacity
        StringBuilder sbuilder = new StringBuilder;
        System.out.println("包含的字符串长度:" + sbuilder.length());
        System.out.println("字符串缓冲区容量:" + sbuilder.capacity());
        
        StringBuilder sbuilder2 = new StringBuilder("Hello");
        System.out.println("包含的字符串长度:" + sbuilder2.length());
        System.out.println("字符串缓冲区容量:" + sbuilder2.capacity());
        
        //字符串缓冲区初始容量为16,超过之后会扩容
        StringBuilder sbuilder3 = new StringBuilder();
        for(int i = 0; i < 17; i++){
            sbuilder3.append(8);
        }
        System.out.println("包含的字符串长度:" + sbuilder3.length());
        System.out.println("字符串缓冲区容量:" + sbuilder3.capacity());
    }

}
 

包含的字符串长度:0
字符串缓冲区容量:16
包含的字符串长度:5
字符串缓冲区容量:21
包含的字符串长度:17
字符串缓冲区容量:34

10.4.2字符串追加

字符串追加的方法是append,append有很多重载方法,可以追加任何类型的数据,它的返回值还是StringBuilder。

例子:

package ChapterTen;

public class Stringappend {
    public static void main(String[] args) {
        //添加字符串,字符
        StringBuilder sbuilder1 = new StringBuilder("Hello");
        sbuilder1.append("").append("World");
        sbuilder1.append(".");
        System.out.println(sbuilder1);
        
        StringBuilder sbuilder2 = new StringBuilder();
        Object obj = null;
        //添加布尔类型,转义符和空对象
        sbuilder2.append(false).append('\t').append(obj);
        System.out.println(sbuilder2);
        
        //添加数值
        StringBuilder sbuilder3 = new StringBuilder();
        for(int i = 0; i < 10; i++){
            sbuilder3.append(i);
        }
        System.out.println(sbuilder3);
    }
}
 

HelloWorld.
false    null
0123456789
10.4.3字符串插入,删除和替换

StringBuilder insert(int offset,String str):在字符串缓冲区中索引为offset的字符位置之前插入str,insert有很多重载方法,可以插入任何类型的数据。

StringBuffer delete(int start,int end):在字符串缓冲区中删除字符串,要删除的子字符串从指定索引start开始直到索引为end-1处的字符。start和end两个参数与substring(int beginIndex,int endIndex)方法中的两个参数含义一样。

StringBuffer replace(int begin, int end, String str):在字符串缓冲区中用str替换子字符串,子字符串从指定索引start直到索引为end-1的字符。start和end同delete(int start,int end)方法。

例子:

package ChapterTen;

public class StrInsertDeleteReplace {
    public static void main(String[] args) {
        //原始不可变字符串
        String str1 = "Java C";
        //从不可变的字符串创建可变字符串对象
        StringBuilder mstr = new StringBuilder(str1);
        
        //插入字符串
        mstr.insert(4, "C++");
        System.out.println(mstr);
        
        //具有追加效果的插入字符串
        mstr.insert(mstr.length()," Objective-C");
        System.out.println(mstr);
        
        //追加字符串
        mstr.append(" and Swift");
        System.out.println(mstr);
        
        //删除字符串
        mstr.delete(11, 23);
        System.out.println(mstr);
    }
}
 

JavaC++ C
JavaC++ C Objective-C
JavaC++ C Objective-C and Swift
JavaC++ C Ond Swift
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值