Java_字符串

Posted zoukun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_字符串相关的知识,希望对你有一定的参考价值。

字符串创建

  1. String 应用变量名 = ‘字符串内容’’;
  2. 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类

  • 用于需要频繁的对字符串进行修改的
  1. 创建:

StringBuffer sb = new StringBuffer(参数);

  1. 构造方法
StringBuffer() 默认初始容量为16
StringBuffer(int capacity) 指定容量
StringBuffer(String str) str长度加上16的初始容量
  1. 常用方法
append(String str) 追加
insert(int offset,String str) 插入
delete(int start,int end)
reverse() 倒置

StringBuilder 类

  • 与StringBuffer相似,效率比StringBuffer高一些。
  1. 构造方法

    • 与StringBuffer相似
  2. 常用方法

    • 与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
  1. 静态方法
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 规范等价
  1. 常用方法
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 类

  1. 匹配
  • Matcher,Pattern 类一般用于复杂的匹配,替换。
  • String 中的matchs方法只能进行整体匹配,正则表达式错误会抛出异常。

    public boolean mathes( String regex)

  1. 替换
  • 利用正则进行字符串部分替换

    public String replaceAll( String regex,Stringf replacement )
    public String replaceFirst( String regex,String replacement )

  1. 拆解
  • 将字符串拆解成多个子串

    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_字符串的主要内容,如果未能解决你的问题,请参考以下文章

通过 Java 正则表达式提取 semver 版本字符串的片段

VSCode创建自定义用户片段

比较 C# 中的字符串片段并从集合中删除项目

将字符串数据从Activity发送到片段[关闭]

Java 求解划分字母区间

这些 C++ 代码片段有啥作用?