一,数组相关的工具类
1.那些类
java.util.Arrays
java.util.Sysetem
2.Java.util.Arrays
数组拼接:
Arrays.toString(数组);//拼接返回字符串;支持对象数组。
排序:static void sort(int[] a) :将a数组按照从小到大进行排序
Arrays.sort(数组);//无返回值,按照升序排列;支持对象数组
二分查找:
Arrays.binarySearch(数组,查找对象);//数组必须有序;
找到后返回元素下标,找不到返回 -(插入点)-1;
复制:
Arrays.copyOf(被复制的数组名,长度);//返回一个新数组,
Arrays.copyOfRange(数组名,3,8);//复制3到8的下标范围[3,8)
比较数组是否一样(长度元素都一样):static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
Arrays.equals(数组1,数组2);static boolean equals(Object[] a,Object[] a2):比较两个数组的长度、元素是否完全相同
填充:
Arrays.fill(数组,数字) //返回填充好的数组。
二,Java.lang.System类
System.arraycopy
1,两个数组之间实现元素的复制。
2,
三,比较器在数组中排序或二分查找等起作用
自然比较器接口:java.lang.Comparable<T>,暂时<T>先不管,后面泛型部分再看。它包含一个抽象方法:
public abstract int compareTo(T t) //暂时把T看成Object
int result = s1.compareTo(s2);
抽象方法的结果是int类型,表示结果有3种:
-
正整数:表示当前对象(this) 大于 t对象
-
负整数:表示当前对象(this) 小于 t对象
-
零::表示当前对象(this) 等于 t对象
定制比较器接口:java.util.Comparator<T>,暂时<T>先不管,后面泛型部分再看。它包含一个抽象方法:
public abstract int compare(T t1, T t2) //暂时把T看成Object
抽象方法的结果是int类型,表示结果有3种:
-
正整数:表示t1 大于 t2对象
-
负整数:表示t1 小于 t2对象
-
零::表示t1 等于 t2对象
自然比较器接口,简称自然比较接口,它通常是要比较大小的类的对象==默认==选择的比较接口。例如:String,包装类等都默认选择了它。换句话说,都实现了这个接口。
当我们某个类型的对象的默认比较规则,不符合我新的需求时,就必须重新编写定制比较器。这个新的比较器类就必须实现Comparator接口。
四,字符串相关
1,那些类
java.lang.String类:最重要的一个字符串类型,绝大部分情况下,都是用它
java.lang.StringBuffer类:字符串缓冲类
java.lang.StringBuilder类:字符串缓冲类
因为String类的对象是被设计为不可变的。这样设计的优点:当我们需要使用内容完全相同的字符串时,可以==共享==同一个字符串对象。但是这也导致了另一个缺点,如果程序中涉及到字符串的大量的拼接等修改操作,每一次修改,就会产生新的对象,就会导致有大量的垃圾对象产生。为了解决这个问题,Java在核心类库中提供了StringBuffer类和StringBuilder类。换句话说,这两个类的对象,是可变的,可以在原有的对象基础上修改字符串的内容。
面试题:String类、StringBuffer类和StringBuilder类的区别?
String类的对象是不可变的,StringBuffer类和StringBuilder类的对象是可变的。
StringBuffer类是线程安全的,StringBuilder类是线程不安全的,效率更高。
java.lang.String类
基础方法
(1)int length():返回字符串的长度
(2)String trim():去掉字符串前后空白符
(3)boolean isEmpty():是否为空字符串,不包含任何字符
(4)boolean isBlank():是否为空字符串,除了空白字符,不包含任何其他字符
(5)boolean equals(Object obj):当前字符串对象是否与另一个字符串对象完全相等,区分大小写
(6)boolean equalsIgnoreCase(String obj):当前字符串对象是否与另一个字符串相等,不区分大小写
(7)int compareTo(String str):比较当前字符串与另一个字符串的大小,区分大小写
(8)int compareToIgnoreCase(String str):比较当前字符串与另一个字符串的大小,不区分大小写
(9)char charAt(int index):返回当前字符串[index]位置的字符
(10)char[] toCharArray():返回当前字符串中所有字符组成的char[]
(11)用char[]构建字符串对象
-
String(char[] value):返回指定数组中表示该字符序列的 String。
-
String(char[] value, int offset, int count):返回指定数组中表示该字符序列的 String。
-
static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
-
static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String
-
static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
-
static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
(三)系列3:转大小写
(12)String toUpperCase():把当前字符串中的字符转为大写
(13)String toLowerCase():把当前字符串中的字符转为小写
(四)系列4:判断字符串是否以xx开头或结尾
(14)boolean startsWith(子串):判断当前字符串是否已xx开头
(15)boolean endsWith(子串):判断当前字符串是否已xx结尾
(五)系列5:查找
(16)boolean contains(子串):判断当前字符串中是否包含 某个子串
(17)int indexOf(子串):返回子串在当前字符串中的起始下标,从左往右查找,第一次出现的下标。
(18)int lastIndexOf(子串):返回子串在当前字符串中的起始下标,从右往左查找,第一次出现的下标。
(六)系列6:字符串的截取
(19)String substring(int start):截取[start, 最后]
(20)String substring(int from, int to):截取[from, to)范围的子串
(七)系列7:和编码、解码有关
什么是编码、解码?
编码是指把文本形式的字符串转为字节形式的二进制。
解码是指把字节形式的二进制转换为文本形式的字符串。
人:只能看懂文本形式的字符串。
计算机:只能看懂字节形式的二进制,底层操作(文件存储、网络传输)等都是基于二进制。
(21)byte[] getBytes():以平台默认的编码方式处理字符串
byte[] getBytes(字符编码方式):以指定的编码方式处理字符串
(22)new String(byte[] ) 或 new String(byte[], int, int):解码,按照平台默认的字符编码进行解码
new String(byte[],字符编码方式 ) 或 new String(byte[], int, int,字符编码方式):解码,按照指定的编码方式进行解码
(八)系列8:字符串的替换
(23)String replace(xx,xx):不支持正则
(24)String replaceFirst(正则,value):替换第一个匹配部分
(25)String replaceAll(正则, value):替换所有匹配部分
(九)系列9:拆分
(26)String[] split(正则):按照某种规则进行拆分
(十)系列10:正则判断
所谓的正则,就是指一个文本的规则。
例如:用户注册时,要求密码:必须包含数字、字母、特殊符合,而且要求必须由大写字母、小写。
例如:手机号码有规则:11位数字,以131,132,,,开头
(27)boolean matches(正则表达式):判断当前字符串是否匹配某个正则表达式。==(正则表达式详细见附录)==
3、String类及String对象的特点
(1)String类本身是final修饰的,不可被继承
(2)String类的对象是不可变
为什么String类的对象不可变?或 String什么样设计,保证了String对象不可变?
-
String类底层(或内部)使用char[](JDK9之前)或byte[](JDK9之后)来存储,这个value数组是private final修饰的。
-
private,意味着String的外面是无法直接操作这个value数组
-
final,意味着value数组是不能重新new的,长度不可变
-
-
String类中所有涉及到修改字符串内容的方法,当字符串内容==需要==修改时,都会返回新的字符串对象
(3)因为字符串对象不可变,所以Java中设计了字符串常量池用来==共享==字符串常量对象
4、字符串常量池
字符串常量池是一个StringTable哈希表。
哈希表是一个由数组+链表(旧版数组+链表,新版更复杂,数组+链表+红黑树,先不讨论新的)组成的数据结构。
5、字符串的拼接
字符串的拼接的方式:
-
+:拼接两个字符串对象
-
"" + ""的结果,不一定会产生新对象,如果常量池中已经有一份该对象,直接共享原来的。如果常量池中没有该结果,把该结果放到常量池中。
-
变量 + "",它们也会产生新对象
-
"" + 变量,它们也会产生新对象
-
变量 + 变量,它们也会产生新对象
-
-
String concat(String str):把当前字符串与另一个字符串拼接起来,构成一个新字符串对象