持续创作,加速成长!这是我参与「掘金日新计划 · 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,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<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(7,10));//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 【将非字符串转换成字符串】
valueOf1)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在多线程环境下运行是不安全的