String系列简介

11 篇文章 0 订阅

一、概述

查看Java源码可以发现String类是final类型,也就是说String是不可以被继承的。字符串是一种特殊的对象,一旦被初始化就不可以被改变,程序中"abc"这种形式其实就是在内存中创建了一个字符串对象,可以使用String s = "abc";的方式创建一个字符串对象。也可以是用String s = new String("abc");的方式创建一个字符串对象,但是两者之间的不同之处在于前者在内存中只创建了一个对象,而后者在内存创建了两个对象,通常使用前者来创建字符串对象。还有一点值得说明的是String s = new String();字符串的默认构造函数其实是创建了一个空的字符串,也就是说和String s = "";效果等同。
下面通过一个简单的例子,说明一下String对象在内存的存储情况。

String s1 = "abc";
String s2 = new String("abc");
String s3 = "abc";
System.out.print((s1==s2)+"/"+(s1==s3));

上面的程序段的输出结果是:

false/true

程序在执行创建s1时,会在内存中建立一块区域存放"abc",并将s1指向这块区域的地址;在创建s2时,会在内存中创建两个区域,但是"abc"区域已经存在,不会再次创建了;在创建s3时,“abc”已经在内存中存在,也不会再次创建。javaString对象其实使用的是设计模式中的享元模式,对相同的字符串内容进行共享。

二、String的常见功能

获取功能

1、int length() 获取字符串的长度。
2、char charAt(int index)获取字符index下标位置的字符。
3、int indexOf(int ch)获取字符串中第一次出现ch的位置,没有找到返回-1。
4、int indexOf(int ch, int fromIndex)从fromIndex位置开始获取ch的位置(这时的位置还是从头开始算的),没有找到返回-1。
5、int indexOf(String str)获取字符串中第一次出现str的位置,没有找到返回-1。
6、int lastIndexOf(int ch)获取最后一次出现ch的位置,没有找到返回-1。
7、int lastIndexOf(int ch, int fromIndex)从fromIndex位置开始获取ch最后一次出现的位置(这时的位置还是从头开始算的),没有找到返回-1。
8、int lastIndexOf(String str)获取字符串中最后一次出现str的位置,没有找到返回-1。

判断

1、boolean contains(CharSequence chs)判断chs(可以是字符串)是否在字符串中出现过。
2、boolean isEmpty()是否为空,和length() == 0等效。
3、boolean startsWith(String str)是否以str开头。
4、boolean endsWith(String str)是否以str结尾。
5、boolean equals(String str)是否和str内容相同。
6、boolean equalsIgnoreCase(String str)忽略大小写判断是否内容相同。

转换

1、new String(char[] chs)构造函数,将char数组chs装换为字符串。
2、new String(char[] chs, int offset, int count)构造函数,将char数组chs中从下标offset开始的count个字符转换为字符串。
3、static String copyValueOf(char[] chs)功能是根据char数组chs返回转换后的字符串。
4、static String copyValueOf(char[] chs, int offset, int count)功能是根据char数组chs中从下标offset开始的count个字符转换为字符串。
5、static String valueOf(char[] chs)copyValueOf(char[] chs)功能一样。
6、static String valueOf(int v)/static String valueOf(long v)/...将其他类型变量转换为字符串类型。
7、char[] toCharArray()是字符串转换为字符数组。
8、byte[] getBytes()将字符串转换为字节数组。

其他常用函数

1、String replace(char oldChar, char newChar)oldChar替换为newChar然后返回替换过的字符串。
2、String replace(CharSequence target, CharSequence replacement)target替换为replacement并返回替换过的字符串。
3、String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。
4、String substring(int begin)获取begin位置开始到末尾的字符串子串。
5、String substring(int begin, int end)获取[begin, end)端的字符串子串。
6、String toUpperCase()转换为大写字符串。
7、String toLowerCase()转换为小写字符串。
8、String trim()去除首尾多余空格。
9、int compareTo(String str)str比较,如果小于返回负数,如果等于返回0,如果大于返回正数。字符串的大小是按照字典序为准。

三、String应用示例

1、模拟trim()功能,功能很简单,就是去除首尾的连续空格即可,注意没有空格和全是空格以及空串的情况,示例代码如下:

public String myTrim(String str) {
    int start = 0, end = str.length()-1;
    while(start <= end && str.charAt(start) == ' ') start ++;
    while(start <= end && str.charAt(end) == ' ') end --;
    return str.substring(start, end+1);
}

2、将字符串反转,即将"abcde"变为"edcba",具体步骤是首先将字符串转为字符数组,然后将字符数组翻转,最后将字符数组构造出字符串。示例代码如下:

public String myReverse(String str) {
    char[] chs = str.toCharArray();
    for(int start=0, end=chs.length-1; start < end; start++, end--) {
        char temp = chs[start];
        chs[start] = chs[end];
        chs[end] = temp;
    }
    return new String(chs);
}

3、计算"abkkcdkkefkkskk"其中kk出现的次数?利用indexOf(String, int)方法,即可完成查找字串出现次数的功能。示例代码如下:

public int myCount(String str, String substr) {
    int count = 0, index = 0;
    while((index=str.indexOf(substr, index))!=-1) {
        index += substr.length();
        count ++;
    }
    return count;
}

4、取两个字符串的最长公共子串。

public String myMaxSubstring(String s1, String s2) {
    for(int i=0; i<s2.length(); i++) {
        for(int j=0,k=s2.length()-i; k!=s2.length()+1; j++,k++) {
            String temp = s2.substring(j, k);
            if(s1.contains(temp)) {
                return temp;
            }
        }
    }
    return "";
}

四、StringBuffer使用介绍

为解决String的不可改变的弊端,出现了StringBuffer类,StringBuffer的特点是:长度可变,可以操纵多个数据类型,如使用append功能添加整数型,浮点型,字符型,布尔型等数据,最终可使用toString()方法返回String类型。StringBuffer也是final类型的类。

添加功能

1、StringBuffer append(对象),这里可以添加一般类型的对象,如整数型、浮点型、布尔型等。最后返回StringBuffer本身,也就是this指针,这种方式称为方法调用链。
2、StringBuffer insert(int offset, 对象)可以在指定位置插入数据对象,该位置之后的数据顺延。

修改功能

1、StringBuffer replace(int start, int end, String str)[start, end)段替换为str
2、void setCharAt(int index, char ch)index位置的字符修改为ch
3、StringBuffer reverse()将字符串反转。

删除功能

1、StringBuffer delete(int start, int end)删除[start, end)段的字符内容。
2、StingBuffer deleteCharAt(int index, char ch)删除index位置的字符。
3、delete(0, str.length())可以用于清空缓冲区。

其他功能

1、void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)StringBuffer[srcBegin, srcEnd)段内容存放在dstdstBegin可是的位置内。

五、StringBuilder

StringBuilderStringBuffer有兼容的API。出现在JDK1.5版本中。与StringBuffer最大的不同之处在于StringBuilder是非线程同步,而StringBuffer是线程同步的。
所以在单线程中一般都是用StringBuilder,因为其速度快。多线程时也可以使用StringBuilder,但是需要加锁。

六、基本数据类型对象包装类

基本数据类型基本数据类型
byteBytefloatFloat
shortShortdoubleDouble
intIntegercharCharacter
longLongbooleanBoolean
基本数据类转字符串

基本数据类型转字符串有一下方式:

基本数据类型+"";  或者  String.valueOf();  或者  Integer.toString();等

字符串转为基本数据类型有如下示例:

Integer.parseInt("123"); // "123"转为123
Long.parseLong("111"); // "111"转为111的长整型
Boolean.parseBoolean("true"); // "true"转为true
Integer.parseInt("3c", 16); //按照16进制将"3c"转为整数,也就是60

Character没有parseCharacter方法。

七、基本数据类型对象包装类的新特性

JDK1.5版本出现的新特性,即对象可以和数值之间直接运算。如下:

Integer x = 4; // 直接将4赋值给整型对象x,称为自动装箱,等同new Integer(4)
x = x + 2; //直接运算,x + 2自动拆箱,然后再将和自动装箱,并赋值给x
x = new Integer(x.intValue() + 2); //x = x + 2的具体过程。

Integer会比int多一个值便是null。还有些如下特点:

Integer m = 128, n = 128;
Integer a = 127, b = 127;
System.out.println(m == n);
System.out.println(a == b);

结果如下,原因是当Integer的值的范围在byte类型范围内时,如果内存中已经存在了值,便不会再创建Integer对象,而是直接指向已存在的区域。

false
true
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值