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 | |
| \B | |
| X? | X最多出现1次 |
| X+ | X至少出现一次 |
| X* | X可以出现任意次 |
| X | X可以出现n次 |
| X | X出现至少n次,最多m次 |
| X | X至少出现n次。 |
| ? | 非贪婪模式进行匹配,只能用于+,{m,n},{m,} ,* 后面 |
| | | 或。 |
| () | 分组操作 |
| \n | 有分组的情况下,对分组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("---------------\n");
for (String values : strs) {
System.out.println(values);
}
System.out.println("----------------");
Pattern pa = Pattern.compile("a.a");
}
}

浙公网安备 33010602011771号