Surpass Day——Java Array工具类、String类、StringBuffer

149 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情


1、Array工具类

数组工具类:Java.utill.Arrays

1.1 排序:

Arrays.sout(数组名)

1.2 二分法查找:

int index = Arrays.binarySearch(数组名,查找的数)

返回值是元素的下标,若不存在则为-1


2、String类

2.1 String字符串的存储原理

关于Java JDK中内置的一个类:java.alng.String

1)String表示字符串类型,属于引用数据类型,不属于基本数据类型

2)在java中随随便便用双引号括起来的都是String对象

3)java中规定,双引号括起来的字符串是不可变的

4)JDK当中双引号括起来的字符串存储在方法区的"字符串常量池"当中的【字符串使用过于频繁,提高效率】

5)String类当中已经重写了equals()方法,直接调用即可

public class Text{
    public static void main(String[] args){
        //下面程序一共创建了三个对象,字符串常量池当中"xyz"
        堆内存当中两个对象,因为new两次
        String x = new String("xyz");
        String y = new String("xyz");
        System.out.println(x == y);//false
        
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);//true
        
        //所以直接直接赋值和创建对象的字符串比较结果是不同的,所以要通过equals()方法进行比较
        System.out.println("hello".quals(s1));//建议采用这种方法,避免了空指针异常
        System.out.println(s1.equals("hello"));//存在空指针异常的风险
        
        //i保存的是100
        int i = 100;
        //s保存的是字符串对象在字符串常量池当中的内存地址
        String s = "abc";
    }
}

 ​编辑

2.2 String类常用的构造方法

1)String s = new String(" ");

2)String s = " " ; (最常用的方法)

3)String(byte数组); 【将byte数组全部转换为字符串】

byte[] bytes = {97,98,99};//97是a,98是b,99是c
String s2 = new String(bytes);

s2的输出结果为"abc";

4)String(byte数组,起始下标,长度); 【将byte数组一部分转换为字符串】

byte[] bytes = {97,98,99};//97是a,98是b,99是c
String s3 = new String(bytes,1,2);

s3的输出结果为"bc";

5)String(char数组); 【将char数组全部转换成字符串】

Char[] chars = {'我''是''中''国''人'};
String s4 = new String(chars);

s4的输出结果为"我是中国人"

6)String(char数组,起始下标,长度); 【将char数组一部分转换为字符串】

Char[] chars = {'我''是''中''国''人'};
String s5 = new String(chars,24);

s5的输出结果为"中国人"

2.3 String常用的方法

2.3.1 【取出某个元素】

char charAt(int index)

char c = "中国人".charAt(1);
System.out.println(c);//国

2.3.2 【字符串比较】

int compareTo(String anotherString)

逐位比较: 前后一致(0)、前小后大(-1)、前大后小(1)

int result = "abc".compareTo("abc");
System.out.println(result);//0

2.3.3 【判断是否包含子字符串】

boolean contains(CharSequence s)

System.out.println("HelloWorld.java".contains(".java"));//true

2.3.4 【判断是否以子字符串开始】

boolean endWith(String suffix)

System.out.println("text.java".endWith("text"));//true

2.3.5 【判断是否以子字符串结尾】

boolean startWith(String suffix)

System.out.println("HelloWorld.java".startWith(".java"));//true

2.3.6 【比较是否相等】

boolean equals(Object anObject)

equals()方法只能看出是否相等,

compareTo()方法可以看出谁大谁小

2.3.7 【判断两个字符串是否相等,忽略大小写】

boolean equalsIgnoreCase(String anotherString)

System.out.println("ABC".equalsIgnoreCase(".Abc"));//ture

2.3.8 【转换成字节数组】

byte [] getBytes()

byte[] bytes = "abcdef".getBytes();
for(int i=0;i<bytes.length;i++){
    System.out.println(bytes[i]);//
}

2.3.9 【子字符串在当前字符串第一次出现处的索引(下标)】

int indexOf(String str)

System.out.println("oraclejavac++htmlc#phpython".indexOf("java"));//6

2.3.10 【子字符串在当前字符串最后一次出现处的索引(下标)】

int lastIndexOf(String str)

System.out.println("oraclejavac++htmlc#phpjavapython".indexOf("java"));//

2.3.11 【判断是否为空】

boolean isEmpty()

底层调用的是length()方法

String s = "";
System.out.println(s.isEmpty);//ture

2.3.12 【判断字符串长度】

int length()

判断数组长度是length属性,判断字符串长度是length()方法

System.out.println("abc".length());

2.3.13 【替换】

String replace(CharSequence target,CharSequence replacement)

String的父接口就是:CharSequence

String newString = "http://www.baidu.com".replace("http://","heetps://");
System.out.println(newString);//"https://www.baidu.com"

2.3.14 【拆分字符串】

String[ ] split(String regex)

String[] ymd = "1980-10-11".split("-");//以"-"分隔符进行拆分
for(int i=0;i<ymd.length;i++){
    System.out.println(ymd[i]);
}//1980 10  11

2.3.15 【截取字符串】

String substring(int beginIndex)

参数是起始下标

System.out.println("http://www.baidu.com".substring(7));//www.baidu.com

2.3.16 【截取字符串(有终止下标)】

String substring(int beginIndex,int endIndex);

System.out.println("http://www.baidu.com".substring(710));//www

左闭右开,起始下标【包含】,终止下标【不包含】

2.3.17 【将字符串转换成char数组】

char[] toCharArray()

char[] chars = "我是中国人".toCharArray();
for(int i = 0;i<chars.length;i++){
    System.out.println(chars[i]);
}//我    是   中   国   人

2.3.18 【转换成小写】

String toLowerCase()

System.out.println("ASDFG".toLowerCase());//asdfg

2.3.19 【转换成大写】

String toUpperCase()

System.out.println("asdfg".toLowerCase());//ASDFG

2.3.20 【去除字符串前后空白】

String trim()

System.out.println("          asd   wd    ".trim());//asd   wd

2.3.21 【将非字符串转换成字符串】

valueOf

1)String中唯一的静态方法,不需要new对象

System.out.println(String.valueOf(100));//100(字符串)

2)参数是一个对象的时候,会调用该对象的toString()方法,但没有重写,输出的是对象的内存地址

System.out.println(String.valOf(new Customer());//是对象的内存地址

System.out.println()这方法在输出的时候都是先转成字符串再输出


3、StringBuffer

3.1 在字符串拼接时的资源浪费

若采用下列代码,贼会占有大量的内存区空间,造成内存空间的浪费

String s = "abc";
s += "hello";

就以上两行代码,就导致在方法区字符串内存池当中创建了三个对象:

"abc","hello","abchello"

3.2 优化程序引入StringBuffer

public class String1 {
    public static void main(String1[] args) {
        //创建一个初始化容量为16个byte[]数组(字符串缓冲区对象)
        StringBuffer stringBuffer = new StringBUffer();
        //拼接字符串,以后拼接字符串统一调用append()方法
        stringBuffer.append("a");
        stringBuffer.append("b");
        stringBuffer.append("d");
        stringBuffer.append(3.14);
        //append方法底层在进行追加的时候,如果byte数组满了,会自动扩容
        stringBuffer.append(100L);
        System.out.println(stringBuffer.toString());
        //System.out.println(stringBuffer);
    }
}

3.3 如何优化StringBuffer的性能

1)在创建StringBuffer的时候尽可能给定一个初始化容量

2)最好减少底层数组的扩容次数。预估计一下,给一个合适的较大的初始化容量,提高程序的执行效率

StringBuffer sb = new StringBUffer(100);

3.4 优化大量字符串的拼接的程序

建议使用JDK自带的:java.lang.StringBuffer和java.lang.StringBuilder

3.5 StringBuffer和StringBuilder的区别

StringBuffer方法都有:sychronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的

StringBuilder方法都没有:sychronized关键字修饰。表示StringBuilder在多线程环境下运行是不安全的