字符串(String)详解以及StringBuffer和字符串编码、正则表达式

一.String

字符串有一下常见特点:

1. String是final类型的
- String是final类型的,代表String是不可继承的,任何一个类试图继承String类型都将发生错误。
2. String的创建方式
- 一种直接初始化,第二种是通过new关键字创建
3. String对象可以通过“+”串联
- String s = “abc”;
- String a =1+2+s;//结果是a=3abc
- String b = s+1+2+3;//结果是b=abc123
4. String类的本质是字符数组char[]
- String类的本质是字符数组,并且其值不可改变,如果值改变,则不再是原来的对象。
5. String池
- 无论是通过new关键字创建字符串还是直接初始化字符串,它们都在Java的堆中创建。在Java中有一个“字符数据池”的内存管理机制。例如:String str=”abc”,其中Java会先去“String池”搜索“abc”这个字符串,如果有,则将字符串赋值给str,如果没有则生成一个新的字符串“abc”赋值给str;而new创建字符串“abc”,则不从字符串池里面找寻sbc,而是直接生成一个新的字符串“abc”赋值给str。
- 由此可知直接赋值比new效率要高。
6. 字符串常用方法
字符串的常见构造方法
String()
初始化一个新创建的 String 对象,使其表示一个空字符序列。
String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
字符串的常见方法
char charAt(int index)
返回指定索引处的 char 值。
int compareTo(String anotherString)
按字典顺序比较两个字符串。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数。如果在之后,则比较结果为一个正整数,。如果相等就结果为0。compareTo只在equals(Object)返回true是才返回0。
String concat(String str)
将指定字符串连接到此字符串的结尾。
boolean contains(CharSequence s)
当且仅当此字符串包含指定的 char 值序列时,返回 true。
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
boolean equals(Object anObject)
将此字符串与指定的对象比较。
boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。
byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
byte[] getBytes(Charset charset)
使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
byte[] getBytes(String charsetName)
使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
int hashCode()
返回此字符串的哈希码。
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(String str, int fromIndex)
返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
boolean isEmpty()
当且仅当 length() 为 0 时返回 true。
int lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引。
int lastIndexOf(String str)
返回指定子字符串在此字符串中最右边出现处的索引。
int length()
返回此字符串的长度。
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。
String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
char[] toCharArray()
将此字符串转换为一个新的字符数组。
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。

![
String toString()
返回此对象本身(它已经是一个字符串!)。
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
String trim()
返回字符串的副本,忽略前导空白和尾部空白。

String字符串的简单使用例子

import java.util.Arrays;
public class J {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str = “abcde”;
String str2 = ” abcde “;
String str3 = new String(“abcde”);
//去掉两头的空格,不管多少个。这是防止用户输入账号的时候不小心输入了空格
String trim = str2.trim();
System.out.println(trim);//abcde
System.out.println(str==str3);//false,因为“==”是表示对象相等
System.out.println(str.equals(str3));//true,因为equals是表示内容是否相等
//转成char数组
char[] ch = str.toCharArray();
System.out.println(Arrays.toString(ch));//[a, b, c, d, e]
for (int i = 0; i < ch.length; i++) {
System.out.print(str.charAt(i)+”,”);//每次返回一个字符a,b,c,d,e,
}
System.out.println();
//转成byte数组
byte[] by = str.getBytes();
System.out.println(Arrays.toString(by));//[97, 98, 99, 100, 101]
//————————————————————–1字符串转换为char数组、byte数组
//全部转成大写
String a2 = str.toUpperCase();//a2=ABCDE
//全部转成小写
String a3 = a2.toLowerCase();//a3=abcde
//str是否包含在a3中
boolean f = str.contains(a3);//f=true
//str是以字符串e结尾的吗
boolean f2 = str.endsWith(“e”);//f2=true
//str是以字符串a开头的吗
boolean f3 = str.startsWith(“a”);//f3=true
//————————————————-2大小写转换,以及某字符串是否存在
String ss = “abcdefggg”;
//从第二个字符开始,一直到最后,也就是bcdefggg
String s = ss.substring(1);
//从第二个字符开始,一直到第四个字符,但是不包含第四个字符,也就是bc
String s2 = ss.substring(1, 3);
//返回第一个”e”的位置,也就是4 如果没有则返回-1
int i = ss.indexOf(“e”);
//返回最后一个”g”的位置,也就是8 如果没有则返回-1
int i2 = ss.lastIndexOf(“w”);
//————————————————–3字符串的截取
//把字符串按照正则表达式将字符串转换成字符串数组
String ss2 = “a,b,c,d,e,w,/a,+5”;
//现在代表ss2数组全部去掉,号;ss2.split(“,”,3)这个表示ss2下标0~3之间的去掉,号
String [] c = ss2.split(“,”);
for (int j = 0; j < c.length; j++) {//”abcdew/a+5”
System.out.print(c[j]);
}
//———————————————————4正则表达式将字符串转换成字符串数组
}
}

7.hashCode和equals方法
hashCode和equals方法都继承与Object。
Java 中正确使用 hashCode 和 equals 方法
StringBuffer类的使用

二. StringBuffer类和StringBuilder类的使用

(StringBuffer类和StringBuilder类的所有方法和用法都一致,只不过:
StringBuffer是线程安全的,速度慢点,适合多线程使用
StringBuilder是线程不安全的,速度快点,适合单线程使用
String是“字符串常量”,也就是不可改变的对象。)
- Java中的String是不可改变的,值一旦变了,就是变成新的对象,而创建对象的过程是比较消耗性能的,因此,就产生了 StringBuffer类, StringBuffer类可以很方便的修改字符串的内容,但是对象不会改变。
- String中的大部分方法在 StringBuffer中都可以使用。 StringBuffer是线程安全的,但它是final类型,也是不可以继承的。

1.StringBuffer的常见构造
StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq)
public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity)
构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
2.StringBuffer的常见构造方法
StringBuffer append(String str)
将指定的字符串追加到此字符序列。
StringBuffer append(StringBuffer sb)
将指定的 StringBuffer 追加到此序列中。
StringBuffer delete(int start, int end)
移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index)
移除此序列指定位置的 char。
StringBuffer insert(int offset, String str)
将字符串插入此字符序列中。
int length()
返回长度(字符数)。
StringBuffer reverse()
将此字符序列用其反转形式取代。
void setLength(int newLength)
设置字符序列的长度。
String toString()
返回此序列中数据的字符串表示形式。

三. 字符串的编码

-1.当前流行的字符编码有很多,如:US-ASCII、ISO-8859-1、UTF-8、GBK、GBK2312等,其中GBK、GB2312是专门处理中文编码的
-2.String的getBytes方法用于按指定编码获取字符串的字节数组。
-3.String的“String(bytes[] bs,String charset)”构造方法用于把字节数组按指定的格式组合成一个字符串对象。
更改字符串编码的步骤
String的getBytes方法对字符串进行解码,得到字符串的字节数组
根据字节数组和新的字符编码构造一个新的String对象,得到的就是按照新的字符编码生成的字符串。

四、正则表达式

API文档中常用符号
字符类
[abc]表示:a、b 或 c(简单类)
[^abc]表示:任何字符,除了 a、b 或 c(否定)
[1-5]表示:1,2,3,4,5
[a-f]表示:a-f之间
[0-9a-fA-f]表示:一个16进制字符
[a-zA-Z]表示:a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]]表示:a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]表示:d、e 或 f(交集)
[a-z&&[^bc]]表示:a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]]表示:a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
.表示:任何字符(与行结束符可能匹配也可能不匹配)
\d表示:数字:[0-9]
.表示:任意字符
\D表示:非数字: [^0-9]
\s表示:空白字符:[ \t\n\b\f\r\p](\f -> 匹配一个换页)(\n -> 匹配一个换行符)(\r -> 匹配一个回车符))(\t -> 匹配一个制表符)(\v -> 匹配一个垂直制表符)
\S表示:非空白字符:[^\s]
\w表示:单词字符:[a-zA-Z_0-9]
\W表示:非单词字符:[^\w]
{m.n}数词
{1}表示:1个
{1,8}表示:至少出现1次,最多8次
{1,}表示1个或者1个以上
?表示:{0,1}
+表示:{1,}
*表示:{0,}
开头,结尾
^表示:开头
$表示:结尾
边界匹配器
^表示:行的开头
$表示:行的结尾
\b表示:单词边界
\B表示:非单词边界
\A表示:输入的开头
\G表示:上一个匹配的结尾
\Z表示:输入的结尾,仅用于最后的结束符(如果有的话)
\z表示:输入的结尾
Greedy 数量词
X?表示:X,一次或一次也没有
X*表示:X,零次或多次
X+表示:X,一次或多次
X{n}表示:X,恰好 n 次
X{n,}表示:X,至少 n 次
X{n,m}表示:X,至少 n 次,但是不超过 m 次

常见的正则表达式
邮政编码:^\d{6}$$
用户名规则:^\w{8,10}$
电话号(+86 13912345678):^(+86|0086)?\s?\d{11}$
身份证号码:^\d{18}(\d{2}[0-9xX])?$
一个点的坐标:^\d+(,\s*|\s+)\d+$
答案规则:^\s*[a-dA-D]?((\s+|,\s*)[a-dA-D]){0,3}\s*$
日期:(2011-01-30):^\d{4}-\d{2}-\d{2}$
IP地址(192.168.0.2):^(\d{1,3}.){3}\d{1,3}$

代码段说明
1.StringBuffer删除 插入
2.比较String与StringBuilder的执行效率
3.将字符串”aaabbccccc”转换为”3a2b5c”的过程
4. 更改字符串编码的步骤
package com.song.lz.HashCode_Equals;

import java.util.HashSet;
import java.util.Set;

public class HashCode_Equals_Test {

public static void main(String[] args) {
    HashCode_Equals he = new HashCode_Equals(1, "张xx");
    HashCode_Equals he2 = new HashCode_Equals(1, "张xx");
    HashCode_Equals he3 = new HashCode_Equals(1, "王xx");

    System.out.println(he.equals(he2));
    Set<HashCode_Equals> s = new HashSet();
    s.add(he);
    s.add(he2);
    s.add(he3);
    System.out.println(he.hashCode());
    System.out.println(he2.hashCode());
    System.out.println(he3.hashCode());
    System.out.println(s.size());
}

}

“`

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值