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

Surpass Day16——Java Array工具类、String类、StringBuffer,第1张

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

目录

1、Array工具类

1.1 排序:

1.2 二分法查找:

2、String类

2.1 String字符串的存储原理

2.2 String类常用的构造方法

2.3 String常用的方法

2.3.1 【取出某个元素】

2.3.2 【字符串比较】

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

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

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

2.3.6 【比较是否相等】

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

2.3.8 【转换成字节数组

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

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

2.3.11 【判断是否为空】

2.3.12 【判断字符串长度】

2.3.13 【替换】

2.3.14 【拆分字符串】

2.3.15 【截取字符串】

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

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

2.3.18 【转换成小写】

2.3.19 【转换成大写】

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

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

3、StringBuffer

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

3.2 优化程序引入StringBuffer

3.3 如何优化StringBuffer的性能

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

3.5 StringBuffer和StringBuilder的区别


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,2,4);

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 

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 

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(7,10));//www

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

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

char[] toCharArray()

char[] chars = "我是中国人".toCharArray();
for(int i = 0;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在多线程环境下运行是不安全的

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5703192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存