JavaSE常用API之String相关

0x01 java.lang.String


String是不可变的,且在创建String的时候,JVM会在常量池中保存一份引用,当再次创建相同的String时,JVM会从常量池中寻找是否存在引用,存在则将引用给新的String,不存在则创建!常量池在JDK1.7之后放入到堆中了

  1. 构造方法
    • new String() 初始化一个空的字符串对象
    • new String(String original) 初始化一个新建的String对象,使其表示一个与参数相同的字符序列
    • new String(byte[] bytes) 使用默认字符集编码指定的byte数组 创建一个新的String对象
    • new String(byte[] bytes,Charset charset) 通过指定字符集的byte数组,创建一个新的String对象
    • String(byte[] bytes, int offset, int length, Charset charset) 通过指定的字符集的byte数组 从offset处开始创建到length处的String对象 长度为length

代码示例:

//创建一个空的字符串对象
String str = new String(); 

//创建一个指定字符序列的字符串对象
String s5 = new String("ABC");

//通过默认字符集的byte数组创建一个字符串对象
byte[] data = new byte[32];
String password = new String(data);

//通过指定字符集的byte数组,创建一个新的字符串对象
byte[] data = new byte[32];
String str = new String(data,"utf-8");

//通过指定的字符集的byte数组 从offset处开始创建到length处的String对象 长度为length
byte[] data = new byte[1024];
String str = new String(data, 0, 12,"utf-8");
  1. 方法
    注意:

    以下方法可直接使用,不用自建 。但使用下列方法的大前提是导入相关类且存在字符串引用,如:
    import java.util.Scanner; //导入类包
    String str = "AbCdEfghIjKlmnOpqRsTuvwXYz "; //创建字符串引用

    • int length() 返回此字符串的长度
    • char charAt(int index) 返回指定索引处的char值 ,返回的是个字符(char),不是字符串
    • int indexOf(String str) 返回字符串第一次匹配时的索引下标
    • int indexOf(String str,int fromIndex) 返回字符串第一次匹配时的索引下标,从从指定的索引下标开始
    • int lastIndexOf(String str) 返回字符串最后一次匹配的索引下标
    • boolean startsWith(String prefix) 判断此字符串是否是以指定字符前缀开始
    • boolean endWith(String suffix) 判断此字符串是否是以指定字符后缀结尾
    • char[] toCharArray() 将此字符串转换为一个新的字符数组
    • String toUpperCase() 将此字符串中所有的英文字母转换为大写后返回
    • String toLowerCase() 将此字符串中所有的英文字母转换为小写后返回
    • String substring(int beginIndex) 将此字符串从索引beginIndex开始截取,返回到字符串结尾的一个子字符串
    • String substring(int beginIndex,int endIndex) 将此字符串从索引beginIndex开始截取,返回到endIndexc处结尾的一个子字符串
    • String trim() 返回此字符串去除空字符之后的结果
    • String toString() 返回此字符串对象本身
    • boolean matches(String regex) 判断此字符串是否匹配给定正则表达式

    注意:

    默认从边界位置开始 完整的、全部的 匹配正则表达式,^和$ 不写也可,且方法内部:
    public boolean matches(String regex) {
    return Pattern.matches(regex, this);
    }
    调用了Pattern类的matches方法,不用再自行创建一个Pattern类 ,且String大部分与正则表达式 的 方法内部都有调用Pattern类的方法

    • String replaceAll(String regex,String replacement) 使用给定的字符序列替换此字符串所有匹配字面序列值
    • String split(String regex) 使用给定的正则表达式,匹配,拆分字符串
    • byte[] getBytes() 使用默认字符集将String编码为byte序列,将结果储存到一个新的byte[] 数组中
    • byte[] getBytes(Charset charset) 使用指定字符集将String编码为byte序列,将结果储存到一个新的byte[] 数组中
    • boolean equals(Object anObject) 判断对象和此字符串是否相等

代码示例:

public static void main(String[] args) {
    StringMethodDemo demo = new StringMethodDemo();
    System.out.println("-----------------常用String方法演示------------我是分割线------------------------------");
    demo.commonMethod();
    System.out.println("-------------------查找字符串出现------------我是分割线------------------------------");
    demo.findStr();
    System.out.println("--------------------url截取hsot---------我是分割线------------------------------");
    demo.subUrl();
    System.out.println("--------------------字符串遍历----------我是分割线------------------------------");
    demo.traversalString();
    System.out.println("--------------------字符串去除空格--------------我是分割线------------------------------");
    demo.trimStrSpace();
    System.out.println("--------------------检测文件-------我是分割线------------------------------");
    demo.checkFile();
}
public void commonMethod(){
    String str = "ancbaksakhfaka";
    //String.charAt(): 按照下标 返回指定索引处的 char 值。
    System.out.println("str的第14个字符为:"+str.charAt(13));
    //String.length(): 返回字符串的长度。
    System.out.println("str的长度为:"+str.length());
    //String.indexOf(): 返回字符串第一次出现的位置索引下标.
    int a = str.indexOf("k");
    System.out.println("k在str中第一次出现的索引下标为:"+a);
    //String.lastIndexOf(): 返回字符串最后一次出现的位置索引下标.
    a = str.lastIndexOf("a");
    System.out.println("a在str中最后一次出现的索引下标为:"+a);
    str= "deMo.docX";
    String UpFile = str.toUpperCase();
    System.out.println("转换为大写之后的字符串:"+UpFile);
    String LowerFile = str.toLowerCase();
    System.out.println("转换为小写之后的字符串:"+LowerFile);
    String file = "demo.docx";
    LowerFile = file.toLowerCase();
    System.out.println("比较和源字符串是否相同:"+ file == LowerFile);
}
public void traversalString(){
    /** 遍历字符串  */
    String str = "你好Java";
    for(int i=0;i<str.length();i++){
        System.out.print(str.charAt(i)+" ");
        System.out.println((int)str.charAt(i));
    }
}
public void subUrl(){
    /** url截取 host主机 和 文件名 */
    String url ="http://www.google.cn/cate/category.html";
    String host = url.substring(7,url.indexOf("/",7));
    String file_name = url.substring(url.lastIndexOf("/")+1);
    System.out.println(host);
    System.out.println(file_name);
    
}
public void trimStrSpace(){
    /** trim()  当且仅当 字符串的开始和末尾有空字符时去除  中间的空字符无法去除  */
    String chinese = "   今天的我很困 ,  没有办法我只能打瞌睡了   ";
    System.out.println(chinese.trim()+"\n");        
}
public void findStr(){
    String str = "啊啊啊啊啊啊啊啊";
    /** 查找指定开头的字符串 */
    boolean b = str.startsWith("啊");
    System.out.println(b);
    b = str.startsWith("今天");
    System.out.println(b);
    b = str.startsWith("");
    System.out.println(b);
}
/** 验证文件正确性*/
public void checkFile(){
    String file = "demo.docx";
    /** 判断 file是否以 .png 结尾 */
    if(file.endsWith(".png")){
        System.out.println("这是图片文件");
    }else{
        System.out.println("这不是图片文件");
    }
    
    file = "background.Png";
    /**将此字符串中所有的大写英文字母转换为小写 */
    if(file.toLowerCase().endsWith(".png")){
        System.out.println("图片!");
    }else {
        System.out.println("非图片!");
    }

    String url = "https://www.baidu.com/index.php";
    /** 判断 url 是否以 https://开头 */
    if(url.startsWith("https://")){
        System.out.println("安全加密通信");
    }else {
        System.out.println("非安全的通信");
    }
}
/**
 * boolean equals(Object anObject)  判断对象内容否正确
 */
public class checkUserInput {
    
    public static void main(String[] args) {
        //创建接收器
        Scanner scan = new Scanner(System.in);
        //预定义一个用户名和密码
        String username,pwd;
        do{
            //接收控制台输入的用户名
            System.out.println("请输入用户名");
            username = scan.nextLine();
            //接收控制台输入的密码
            System.out.println("请输入密码");
            pwd = scan.nextLine();
            //当用户名和密码不相同时 提示登录失败,相同时提示登录成功 
            if(!"熊大".equals(username) || !"123".equals(pwd))){
                System.out.println("登录失败!");
            }else{
                System.out.println("登录成功");
                //打桩
                System.out.println("用户名:"+username+" 密码 :"+pwd);
            }
        //当用户名和密码不相同时,循环输入,直到相同为止
        }while(!"熊大".equals(username) || !"123".equals(pwd));
        
        
    }
}

0x02 正则表达式相关知识:


正则表达式-1.png

正则表达式-2.png

正则表达式-3.png

正则表达式-4.png

正则表达式-5.png

正则表达式-6.png

正则表达式-7.png

正则表达式-8.png

正则表达式-9.png

有关正则表达式方法代码示例:
java.util.regex.Pattern

/**   
 * 正则匹配演示  
 * Pattern 正则表达式的编译表示形式
 * 指定为字符串的正则表达式必须首先编译为此类的实例。然后可将得到的模式用于创建Matcher对象,
 * 依照正则表达式。该对象可以与任意字符序列匹配。
 * 执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
 * 
 */
public class PatternDemo {

    public static void main(String[] args) {
        String regex = "hello[0-9]";
        String str = "hello1";
        test(regex,str);
    }
    
    public static void test(String regex,String str) {
        //创建一个正则表达式对象
        Pattern p = Pattern.compile(regex);
        //创建一个匹配器
        Matcher m = p.matcher(str);
        //判断匹配器是否匹配正则
        boolean b = m.matches();
        System.out.println(b);
        //输出匹配结果
        System.out.println(m.group());
    }
}

java.lang.String

public class StringMatchesDemo {
    /**
     * String 字符串支持正则表达式的相关方法之一:
     * boolean matches(String regex) 
     * 使用给定的正则表达式判断当前字符串是否符合格式要求
     * 
     * "hshshakssj@ss.cn"
     * [a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
     * 
     */
    public static void main(String[] args) {
        //定义一个 “正确的” email 
        String email = "hshshakssj@ss.cn";
        //定义一个错误的email
        String etc = "hahahah";
        //构建匹配正则表达式
        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        //判断 “正确的” email是否和正则表达式匹配 并使用一个boolean 变量存储
        boolean b = email.matches(regex);
        //判断email是否“正确”
        if(b){
            System.out.println(email+":匹配邮箱成功");
        }else {
            System.out.println(email+":匹配失败");
        }
        //判断错误的 email 是否和正则表达式匹配 并使用一个boolean 变量存储
        b = etc.matches(regex);
        //判断email是否“正确”
        if(b){
            System.out.println(etc+":匹配邮箱成功");
        }else {
            System.out.println(etc+":匹配失败");
        }
    }
}

    /**
     * String 字符串支持正则表达式的相关方法之二:
     * String repleaseAll(String regex,String str)
     * 将当前字符串中,满足正则表达式的部分替换为给定字符串
     *
     */
    public class StringRepleaseAllDemo {
        public static void main(String[] args) {
            String string = "abc123def456hik";
            /*
             * 将当前字符串中的数字部分替换为#NUMBER#
             */
            string = string.replaceAll("[0-9]+", "#NUMBER#");
            //string = string.replaceAll("[0-9]", "#NUMBER#");
            //string = string.replaceAll("[a-z]+", "#char#");
            System.out.println(string);

            //用户输入信息 “礼貌” 河蟹
            //创建一个接受器
            Scanner scan = new Scanner(System.in);
            //构建匹配正则表达式
            String regex = "(wqnmlgb|nc|dsb|djb|mmp|tmd|nmsl|bitch|hmp|nmj)";
            System.out.println("输入框:");
            //将控制台输入的接受的到数据转换为小写
            String message = scan.next().toLowerCase();
            //匹配到正则表达式的字符串 替换为 ***  【河蟹神兽重出江湖啦~~】
            message = message.replaceAll(regex, "***");
            //输出信息
            System.out.println(message);
            
        }
    }

    /**
     * String 字符串支持正则表达式的相关方法之三:
     * String[] split(String regex)
     * 将当前字符串按照满足正则表达式的部分进行拆分,并返回
     * 拆分后的每段内容
     */
    public class StringSplitDemo {
        public static void main(String[] args) {
            String string = "abc123def456hik";
            /*
             * 按照数字部分进行拆分,得到所有的字母部分
             */
            String[] arr = string.split("[0-9]+");
            //String[] arr = string.split("[0-9]"); 每个数字截一段
            System.out.println(arr.length);
            System.out.println(Arrays.toString(arr));
            
            /* 上传文件统一重命名 :上传时间+文件后缀*/
            //假定一个上传的图片对象
            String imageName = "123.jpg";
            //按照 . 处进行拆分 得到一个 图片名称 和图片后缀的 字符串数组
            String[] names = imageName.split("\\.");
            //获取格林威治时间 将其与拆分的图片后缀组合 重命名操作 将其赋给imageName
            imageName = System.currentTimeMillis()+ "." + names[1];
            //输出图片名称
            System.out.println(imageName);
            
            ////按照 . 处进行拆分 得到一个 图片名称 和图片后缀的 字符串数组
            names = imageName.split("\\.");
            //记录图片的名称即上传时间
            long time = Long.parseLong(names[0]);
            //转化时间戳
            Date date = new Date(time);
            //输出时间戳
            System.out.println(date);
        }
    }

注意:

在正则表达式中 “ . ”表示匹配任意一个字符,使用文件后缀匹配“ . ”时, 要被转义,并且“ \ ”也要被转义,否则会报错即 "\\."

0x03 java.lang.StringBuilder


  1. 构造方法
    • new StringBuilder() 创建一个不带任何字符的字符串生成器,其初始容量为16个字符
    • new StringBuilder(String str) 创建一个新的字符串生成器,并初始化为指定的字符串内容

代码示例:

//空的字符串引用
StringBuilder str = new StringBuilder();
//指定字符串引用
StringBuilder str = new StringBuilder("hello world");
  1. 方法

    注意:

    以下方法可以直接使用,不用自建,但其使用大前提为导入相关类且存在字符串引用

    • int capacity() 返回此字符序列的容量,此时容量相当于字符序列的长度(length)
    • StringBuilder insert(int offset,Object anObject) 将anObject插入到此字符串中指定的offse处
    • StringBuilder append()以及重载的append(Object anObject) 将anObject 追加到字符序列(字符串)的末尾

    注意:anObject 代表众多的对象和变量 (包括但不限于boolean、char、char[]、String)等

    • StringBuilder delete(int start,int end) 移除此字符序列的从start位置开始到end结束的字符

代码示例:

public class StringBuilderMethodDemo {
    /**
     * StringBuilder 常用  API方法  演示
     * 1. StringBuilder 是可变字符串,其内部的字符数组容量初始为16,
     * 2. 后续的操作,都可以对这个数组内容进行修改,
     * 3. 当容量不过的时候,会自动进行扩容,扩容规则1倍+2
     * 
     * String对象中也封装了char数组,但是其数组内容在创建之后不可改变
     * 
     * 用于检测StringBuilder内部字符数组的容量,大于等于数组长度
     * .capacity()
     * 
     * 添加字符 在当前字符串的末尾
     * .append()
     * 
     * 从开始逐个往后按照索引,在指定位置删除字符
     * .delete()
     * 
     * 开始逐个往后按照索引,在指定位置插入字符
     * .insert()
     */
    public static void main(String[] args) {
        StringBuilderMethodDemo str = new StringBuilderMethodDemo();
        str.test();
    }
    public void test(){
        //创建一个空的字符序列
        StringBuilder str = new StringBuilder();
        //capacity 容量,就是StringBuilder中char数组大小
        //capacity() 方法用于检测StringBuilder内部字符数组的容量
        //由于当长度超过数组容量的时候,会进行自动扩容,
        //所以这个数组的容量总会大于等于数组长度
        int size = str.capacity();
        System.out.println(size);
        //追加字符串
        str .append("采蘑菇的小")
            .append("姑娘今天上山")
            .append("去采蘑菇的时候")
            .append("碰到了")
            .append("熊大");
        System.out.println(str);
        //记录容量(长度)
        size = str.capacity();
        System.out.println(size);
        //删除指定位置的字符
        str .delete(1,3)
            //插入指定字符
            .insert(1,"老师");
        System.out.println(str);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355