Java_字符串
Posted zoukun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_字符串相关的知识,希望对你有一定的参考价值。
字符串创建
- String 应用变量名 = ‘字符串内容’’;
- String 引用变量名 = new(<参数序列> );
常用构造器
String(byte[] bytes) | 将字节数组bytes按照默认的编码方式构造一个字符串对象 |
String(byte[] bytes,int offset,int length) | 从offset索引开始... |
String(byte[] bytes,String charserName) | 按照指定的字符集...该构造器可能会抛出异常 |
String(byte[] bytes,int offset,int length,String charsetName) | ... |
String(char[] value) | ... |
String (char[] value ,int offset , int count) |
常见的相关函数
CharAt() | |
toCharArray() | 将字符串转为char[] |
concat(String s) | 字符串拼接 |
equals() | |
equalsIgnore() | |
length() | |
replace(char oldChar,char newChar) | 用newChar替换所有的oldChar |
substring(int begin) | 截取索引从begin开始的所有.. |
substring(int begin ,int end) | 截取索引从begin到end的子串 |
toLowerCase() | |
toUpperCase() | |
trim() |
public string intern(); //从普通堆中的对象找到字符串常量池中对应的对象
字符串详解
内存机制
1. JVM将内存分为两个部分【堆】【栈】,在堆中存放的是创建的对象,栈中存放的为方法调用过程中的局部变量或引用。
2.对于java字符串的处理,其又在堆中开辟了一块小的内存【字符串常量池】,用于存放特定的字符串对象。
对于: String str = "Java字符串";
创建过程:
1. 查看字符串常量池中是否有与该内容相同的字符串对象
2. 没有,则创建一个指定为该内容的字符串对象,并将str指向创建的对象;有则将str指向该字符串对象
new与字符串常量池
通过new创建的字符串有所不同:
对于:String str = new String("java_字符串");
创建过程:
1. 首先在堆中(非字符串常量池)创建一个包含指定内容的字符串对象,并将str指向该对象。
2. 在字符串常量池中查看是否有指定内容的字符串对象
3. 没有则创建一个包含指定内容的字符串对象,并将该对象与new出来的对象联系起来。
4. 有则直接将 new出来的字符串对象 和 字符串常量池中的内容相同的对象关联起来。
intern 方法
将字符串常量池中的与之匹配的字符串对象返回。
如果字符串对象本身就在字符串常量池中,则将自身返回。
public class string_fun {
public static void main(String[] args) {
String str1 = "java_字符串";
String str2 = new String(str1);
System.out.println( str1==str2 );
System.out.println( str1.equals(str2) );
System.out.println( str2.intern() );
System.out.println( str1.intern()==str2.intern() );
}
}
其他
- java中字符串对象是永远不变的。
- String类为final类型,不可以被继承。
- 字符串对象进行修改是会消耗较大内存代价
StringBuffer类
- 用于需要频繁的对字符串进行修改的
- 创建:
StringBuffer sb = new StringBuffer(参数);
- 构造方法
StringBuffer() | 默认初始容量为16 |
StringBuffer(int capacity) | 指定容量 |
StringBuffer(String str) | str长度加上16的初始容量 |
- 常用方法
append(String str) | 追加 |
insert(int offset,String str) | 插入 |
delete(int start,int end) | |
reverse() | 倒置 |
StringBuilder 类
- 与StringBuffer相似,效率比StringBuffer高一些。
构造方法
- 与StringBuffer相似
常用方法
- 与StringBuffer相似
正则表达式
基本语法
[xyz] | xyz中的任意一个 |
[^xyz] | xyz之外中的任意一个 |
d | 0~9中的任意一个字符,等价于[0-9] |
D | 0~9之外的任意一个字符,等价于[^0-9] |
s | 空白字符(制表符,空格...)中的任意一个 |
S | 非空白字符中的任意一个,等价于[^s] |
w | 字母,下划线,数字中的任意一个,等价于[0-9a-zA-Z] |
W | 非.. |
^ | |
$ | |
B | |
X? | X最多出现1次 |
X+ | X至少出现一次 |
X* | X可以出现任意次 |
X{n} | X可以出现n次 |
X{n,m} | X出现至少n次,最多m次 |
X{n,} | X至少出现n次。 |
? | 非贪婪模式进行匹配,只能用于+,{m,n},{m,} ,* 后面 |
| | 或。 |
() | 分组操作 |
有分组的情况下,对分组n的引用 | |
. | 任意一个字符 |
匹配模式
- 贪婪模式
- 按照最大限度的可能进行匹配
- 非贪婪模式
- 按照最小限度的可能进行匹配
正则的使用
Pattern 类
java中标准库中提供了java.util.regex.Pattern类。
Pattern的构造方法为private
- 静态方法
Pattern compile(String regex) | 将正则regex编译成Pattern对象返回 |
Pattern compile(String regex, int flags) | flags表示匹配标志,常量 |
flags | |
---|---|
CASE_INSENSITIVE | 对ASCII字符不区分大小写进行匹配 |
MULTILINE | 多行模式 |
DOTALL | dotall模式 |
UNICODE_CASE | 对Unicode字符不区分大小写进行匹配 |
CANON_EQ | 规范等价 |
- 常用方法
int flags() | 返回flags的值 |
Matcher matcher(CharSequence input) | |
String pattern() | |
String[] split(CharSequence input)) | |
String[] split(CharSequence input),int limit) | |
static String quote(String s) | |
Matcher 类
String 类
- 匹配
- Matcher,Pattern 类一般用于复杂的匹配,替换。
String 中的matchs方法只能进行整体匹配,正则表达式错误会抛出异常。
public boolean mathes( String regex)
- 替换
利用正则进行字符串部分替换
public String replaceAll( String regex,Stringf replacement )
public String replaceFirst( String regex,String replacement )
- 拆解
将字符串拆解成多个子串
public String[] split( String regex )
public String[] split( String regex , int limit )
- limit 为正 , 拆解成 limit - 1 份。
- limit 为负 , 尽可能多的拆解,结尾有空字符串
- limit 为0 , 尽可能多的拆解, 结尾无空字符串。
package test_02;
import java.util.regex.Pattern;
public class string_fun {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = "java_字符串_java";
String str2 = new String(str1);
System.out.println( str1==str2 );
System.out.println( str1.equals(str2) );
System.out.println( str2.intern() );
System.out.println( str1.intern()==str2.intern() );
System.out.println( str1.matches("java.{0,}") );
System.out.println( str1.replaceFirst("java","a") );
System.out.println( str1);
String[] strs = str1.split("a", 3);
System.out.print("---------------
");
for (String values : strs) {
System.out.println(values);
}
System.out.println("----------------");
Pattern pa = Pattern.compile("a.a");
}
}
以上是关于Java_字符串的主要内容,如果未能解决你的问题,请参考以下文章