1. String
1.1 概述
java.lang.String :是字符串类 底层就是一个final修饰的char数组,所以String很多特性就是数组的特性,比如一旦确定,长度 不能更改
1 字符串一旦创建,这个字符串对象不能再更改
2 为了提升字符串的访问和存储效率,java虚拟机采用了一种缓存机制,把字符串都保存在了字符串常量池中
3 在程序执行过程中,假如要用到一个字符串a String s1 = "a"; 先去字符串常量池中检索,是否有a,如过没有就创建一份
假如 有了 String s2 = "a"; 就不再创建,把已有的这个a 返回
所以 导致 String s1 = "a" String s2 = "a" 此时 s1 == s2 他也是true,因为他们指向同一个字符串对象 就是a
1.2 基本使用
// 第一部分 创建1个对象,因为他们都指向常量池
String s1 = "a";
String s2 = "a";
// 比较值 true
System.out.println(s1.equals(s2));
// 比较地址 true
System.out.println(s1 == s2);
// String 一旦创建不能更改的意思,并不是这个s1变量不能更改,二十 变量指向的对象中的数据不能更改
s1 = "b";
// 第二部分,如果使用new的方式,那么会创建堆内存对象,该字符串对象会保存在堆内存中
String s3 = new String("a");
String s4 = new String("a");
// 因为s3和s4不指向常量池,二十分别指向了堆内存,所以地址不同,为false
System.out.println(s3 == s4);
// 但是String中覆写了equals方法.比较值,所以是true
System.out.println(s3.equals(s4));
1.3 不要频繁拼接
因为字符串创建之后不能更改,如果频繁拼接的话,效率很低,并且垃圾回收可能也会出现问题
1.4 构造方法
// 1 字面量
String s1 = "asda";
// 2
String s2 = new String("xxx");
// 3 字节数组
byte[] bytes = {97,98,99,100,101,102};
String s3 = new String(bytes);
//abcdef
System.out.println(s3);
// 字节数组,只截取一部分,4表示起始下标(包含),2表示个数
String s4 = new String(bytes,4,2):
// ef
System.out.println(s4);
// 5 字符数组
char[] chars = {'a','b','c','d'};
String s5 = new String(chars);
System.out.println(s5);
// 6 字符数组,只截取一部分,1表示起始下标(包含),2表示个数
String s6 = newsString(char,1,2);
System.out.println(s6):
1.5 常用方法
学习API:
1 功能是什么
2 入参和出参是什么
3 怎么用
// 1 charAt(int index): 返回该字符串中,指定位置的字符
String s1 = "qweqweqwe";
char c1 = s1.charAt(2):
// e
System.out.println(c1);
// 2 boolean endsWith(String suffix) : 判断该字符串是否以指定字符串结尾
// boolean startWith(String prefix) : 同上,判断开始
System.out.println("Hello.java".endWith(".java"));
// 注意空格 , 有空格就匹配不上了
System.out.println("Hello.java".endsWith(".java"));
// 3 boolean equalsIgnoreCas(String str): 不区分大小写比较两个字符串是否相等
System.out.println("abc".equalsIgnoreCase("aBc"));
// 4 byte[] getBytes(): 把字符串转换为字节数组并返回
byte[] bytes = "abc".getBytes();
for(int i = 0;i<bytes.length;i++){
System.out.println(bytes[i]);
}
// 5 char[] toCharArray(); 把字符串转换为字符数组并返回
char[] chars = "abc".toCharArray();
for(int i = 0;i<char.length;i++){
System.out.println(char[i]);
}
// 6 int indexOf(String str): 获取该字符串中指定字符串的起始索引,找不到返回-1
System.out.println("dasdsa".indexOf("sd"));// 2
System.out.println("asdasdas".indexOf("kda")); //-1
// 7 int indexOf(Sting str,int index);
// 从指定位置开始查找(包含),获取该字符串中指定字符串的起始索引,找不到返回-1
System.out.println("askasdasd".indexOf("a",5));// -1
// 8 index lastIndexOf(String str): 同上,最后一次出现的索引 找不到返回-1
System.out.println("asdasd".lastindexOf("a"));// 3
// 9 int length(): 返回该字符串的长度
System.out.println("abc".length());
// 10 String replaceAll(String regex . String replacement);
// 替换指定字符,支持正则表达式
// String replace (String str . String replacement); 不支持正则表达式
// 用 1 把 a 替换了并返回新的字符串
// 支持正则表达式,但是没有写正则表达式 是没有区别的
System.out.println("hucgasdqweasd".replaceAll("a", "1"));
System.out.println("dhiasdhias",replace("a","1"));
// 因为 . 在正则表达式中,代表任意字符
System.out.println("qwe.tre.nfoia.dasnm".replaceAll(".","."));
// 可以使用 \ 转义
System.out.println("qwe.try.yui.uio".replaceAll("\\",","));
System.out.println("qwe.try.yui.uio".replace(".",","));
// 11 String[] split(String regex): 分割字符串,返回字符串数组,支持正则表达式,注意.....
// 点,需要转义
String s2 = "2022.1.14";
String[] arr = s2.split("\\.");
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
// 12 String substring(int begin); 获取该字符串中,以某下标起始的子字符串(包含)
System.out.println("abcdef".substring(2));// cdef
// 13 String substring(int begin , int end );
// 获取 该字符串中,以某个下标起始(包含)到某个下标结束的子字符串(不包含)
System.out.println("abcdef",substring(2,4));// cd
// 14 String trim(): 去除字符串两边的空格
System.out.println(" a dsadas ");
System.out.println(" a d asdas .trim()");
// 15 String toUpperCase(): 转大写
// String toLowerCase(); 转小写
System.out.println("asd".toUpperCase());
// 16 static String valueOf(Object obj);
// 调用该对象的toString 方法 , 如果为null, 则不再调用 toString 而是返回字符串null
String_05 s = null;
// 打印一个引用类型的时候,会自动调用 String 的valueOf 所有 会自动调用toString方法
System.out.println(s);
1.6 注意
// 1
String a = "a";
String b = "b";
String str = "ab";
// 字面量相加 在编译阶段,就把+去掉了
String d = "a" + "d";
//true
System.out.println(d == str);
//true
System.out.println(d.equals(str));
//变量相加,因为变量的值是可变的,运算之前没有办法确定变量的值,
//所以没有办法优化,只能转换为new的方式,重新创建并拼接字串符
String c = a + b ;
String e = a + "b";
//false
System.out.println(c==str);
//true
System.out.println(c.equals(str));
// 上面相加 因为变量的值 无法确定 , 如果声明为常量,则可以优化
String str1 = "ab";
final String a1 = "a";
final String b1 = "b";
String c1 = a1 + b1;
System.out.println(c1 == str1);
// 创建几个对象? 1个
String xx = "a"+"b"+"c"+"d";
2 StringBuffer和StringBuilder
2.1 概述
2.2 基本使用
2.3 常用方法
3. 包装类
3.1 概述
1. 装箱就是自动将基本数据类型转换为包装器类型
2. 拆箱就是自动将包装器类型转换为基本数据类型
3.2 使用
3.3 Integer
3.3.1 基本使用
3.3.2
3.3.3 常用方法
3.3.4 自动装箱和自动拆箱
3.3.5 深入整型常量池
// 判断当前这个数值 是否在 -128~127之间
如果不再范围内 就直接new对象
3.3.6 总结
4. System
4.1 概述
System类提供的public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
此方法适于计算时间差。
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实 例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便 的进行调用。
成员变量
System类内部包含in、out和err三个成员变量,分别代表标准输入流
(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
成员方法
native long currentTimeMillis():
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时
间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
void exit(int status):
该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表
异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。
4.2 常用方法
5. Date
5.1 概述
获取时间和时间操作
5.2 构造方法
5.3 常用方法
5.4 格式化
5.5 Calendar
6. Random
6.1 概述
随机数 从 0 开始
6.2 使用