常用API
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" 此时 不仅equals是true 使用 s1 == s2也是true,因为他们指向同一个字符串对象 即地址也相同
1.2 基本使用
第一部分 创建1个对象 ,因为他们都指向常量池
String一旦创建不能更改的意思并不是这个s1变量不能更改,而是变量指向的对象中的数据不能更改
第二部分 如果使用了new的方式,就会创建堆内存,该字符串对象就会保存在堆内存
1.3 不要频繁拼接
字符串创建之后不能更改,如果频繁拼接的话,效率很低,并且垃圾回收可能也会出现问题
1.4 构造方法
byte[] bytes = { 97, 98, 99, 100, 101, 102 };String s4 = new String(bytes, 4, 2);
//字节数组 截取 从下标为4(包含)开始 2个数
char[] chars = { 'a', 'b', 'c', 'd' };String s6 = new String(chars,1,2);
//字符数组 截取 从下标为1(包含)开始 2个数
1.5 学习API
1)char charAt (int index) : 返回该字符串中,指定位置的字符
2)boolean endsWith(String suffix) : 判断该字符串是否以指定字符串结尾
System.out.println("Hello.java".endsWith(".java"));
boolean startsWith(String prefix) : 判断该字符串是否以指定字符串开始
System.out.println("Hello.java".startsWith(".java "));
3)boolean equalsIgnoreCase(String str) : 不区分大小写比较两个字符串是否相等
System.out.println("abc".equalsIgnoreCase("aBc"));
4)byte[] getBytes() : 把字符串转换为字节数组并返回
byte[] bytes = "abc".getBytes();
5)char[] toCharArray() : 把字符串转换为字符数组并返回
6)int indexOf(String str) : 获取该字符串中指定字符串的起始索引,找不到返回-1
System.out.println("askdhqwbe".indexOf("kd")); // 2
System.out.println("askdhqwbe".indexOf("kda")); // -1
7)int indexOf(String str,int index) :
从指定位置开始查找(包含),获取该字符串中指定字符串的起始索引,找不到返回-1
System.out.println("askdhaqwbe".indexOf("a", 6)); // -1
8)dex lastIndexOf(String str) : 同上,最后一次出现的索引 找不到返回-1
System.out.println("askdhaqwbe".lastIndexOf("a")); // 5
9)int length() : 返回该字符串的长度
System.out.println("abc".length());
10)String replaceAll(String regex . String replacement);替换指定字符,支持正则表达式
String replace (String str . String replacement); 不支持正则表达式
支持正则表达式,但是没有写正则表达式 是没有区别的
. 在正则表达式中 代表任意字符 可以使用 \ 转义
System.out.println("qwe.rty.yui.uio".replaceAll("\\.", ","));
11)String[] split(String regex) : 分割字符串,返回字符串数组,支持正则表达式,注意 .需要转义
String s2 = "2022.1.14";
String[] arr = s2.split("\\.");
12)String substring(int begin);获取该字符串中,以某个下标起始的子字符串(包含)
System.out.println("abcdef".substring(2));// cdef
13)String substring(int begin, int end) :
// 获取该字符串中,以某个下标起始(包含)到某个下标结束的子字符串(不包含)
14)String trim() : 去除字符串两边的空格
System.out.println(" a d sadasd ".trim());}
15)String toUpperCase() : 转大写
String toLowerCase() : 转小写
System.out.println("asd".toUpperCase());
16)static String valueOf(Object obj) : 调用该对象的toString方法,如果为null,则不再调用toString而是返回字符串null
1.6 注意
String a="a";String b="b";string str="ab";String c="a"+"b";String d=a+"b";String e=a+b;
true:str=="a"+"b",str==c, 各种a+b的equals; false:str==d,str==e
final String a = "a"; final String b = "b"; String c = a+b; String d = "ab"; 此时c==d是true
final修饰String时 该变量是常量,被看做"a"和"b" "a"+"b"="ab"
String xx="a"+"b"+"c"只创建一个对象;
2 Stringbuffer和StringBuilder
Stringbuffer和StringBuilder都是字符缓冲区,可以做拼接操作
StringBuffer,StringBuilder和String区别:
String:底层是char数组,定长,一旦创建,不可更改,不适合拼接操作
Stringbuffer和StringBuilder:底层是char数组,变长,预先在内存中申请一块空间,用来保存字符如果预留空间不够了,会进行自动扩容,默认容量为 16,扩大容量 (当前容量+1)*2 16->34->70
StringBuffer和StringBuilder区别:
StringBuffer 线程安全,在多线程环境下,不会出现问题
StringBuilder 非线程安全,在多线程环境下,可能会出现问题
append 就是添加数据,做拼接操作 可以链式调用
sb.append(arr[i]).append(",");
sb.reverse();反转
System.out.println(sb.length());获取已有元素个数
System.out.println(sb.capacity());当前容量(数组长度)
String str = sb.toString();toString可以把StringBuilder转换为String类型
3 包装类
3.1 概念
装箱就是自动将基本数据类型转换为包装器类型
拆箱就是自动将包装器类型转换为基本数据类型
3.2 使用
byte b1 = 12;Byte b2 = new Byte(b1);封装为包装类
3.3 Integer
3.3.1 基本使用
Integer i1 = new Integer(123);
Integer i2 = new Integer("1231");传递字符串也可以,但是必须是纯数字
3.3.2 相互转换
int ---> Integer
Integer i1 = new Integer(123);
i1 = Integer.valueOf(123);
Integer --> int
int i2 = i1.intValue();
String --> integer
Integer i3 = new Integer("123");
i3 = Integer.valueOf("123");
Integer --> String
String string = i3.toString();
int --> String
String string1 = 123+"";
String --> int
*重要 static int parseInt(String str) : 把纯数字的字符串转换为int类型
int i4 = Integer.parseInt("123");
double d1 = Double.parseDouble("2.4");
3.3.3 常用方法
把数字以二进制的字符串形式,并返回
String s1 = Integer.toBinaryString(10);
八进制
s1 = Integer.toOctalString(10);
十六进制
s1 = Integer.toHexString(10);
System.out.println(s1);
3.3.4 自动装箱和自动拆箱
java1.5新特性 自动装箱和自动拆箱
装箱 : 基本类型 到 包装类类型
拆箱 : 包装类类型 到 基本类型
八种包装类 都覆写了 toString 和 equals()方法
3.3.5 深入整型常量池
简单来说,常量池就是提前准备好一些对象,当我们要保存数据的时候,发现已经创建好了,就直接拿走,不需要重新创建
整型常量池的范围在-128~127
如果不在范围内 就直接new对象
总结 :
当我们 通过 new Integer(xx) 创建对象的时候, 不管值是多少,. == 永远是false
当我们使用 Integer i1 = xxx; 这种方式的时候,编译之后 会转换为Integer.valueOf() ; 这种方式会经过整型常量池
假如 xxx这个值 在 -128 到127之间 则 不需要new对象,而是使用常量池中已创建好的对象
否则 不再范围内, 则还是等于 new Integer(xxx) 这种方式
注意 Integer类型之间的比较 还是要用 equals 进行比较才最好
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 常用方法
标准输出 -- > 打印到控制台
System.out.println(123);
表示错误, 以红色字体 展示到控制台
System.err.println(123);
in 表示标准输入,接收控制台输入的信息
new Scanner(System.in);
获取时间原点到当前时间的毫秒数(1970.1.1 8:0:0)
long startTime = System.currentTimeMillis();
System.out.println("正在执行");
long endTime = System.currentTimeMillis();
System.out.println("耗时 : "+(endTime-startTime));
退出JVM虚拟机,0表示正常关闭,1 表示异常关闭 , 一般用于图形界面 关闭窗口
System.exit(0);这之后的运行不到
5 Date
Date d1 = new Date();获取当前系统时间
Date d2 = new Date(1000);传入毫秒数,获取时间原点到指定毫秒数的世界
System.out.println(d1.getTime());获取指定时间的毫秒数
System.out.println(d1.toString());把时间转换为 字符串类型
创建时间格式化对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
格式化,返回字符串
String string = sdf.format(d1);System.out.println(string);
时间格式的字符串 转换为Date对象
String strDate = "2022/01/14 16:21:36";
格式化对象的时间格式 要和字符串的格式 一致
年 y 月 M 日 d 时 H 分 m 秒 s 毫秒 S
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
转换 返回Date对象
Date date = sdf.parse(strDate);
System.out.println(date);
获取当前日历
Calendar c = Calendar.getInstance();
获取当前是本周第几天 , 周日是第一天
System.out.println(c.get(Calendar.DAY_OF_WEEK));
System.out.println(c.get(Calendar.YEAR)); 年
System.out.println(c.get(Calendar.MONTH)+1);月 , 0 是1月 , 11是12月, 所以 结果 +1 才是正确的
System.out.println(c.get(Calendar.DAY_OF_MONTH));日 获取今天是当前月中第几天
System.out.println(c.get(Calendar.HOUR));时 12小时制
System.out.println(c.get(Calendar.HOUR_OF_DAY));24小时制
System.out.println(c.get(Calendar.MINUTE));分
System.out.println(c.get(Calendar.SECOND));秒
创建随机数生成器
Random r = new Random();
在int范围内 随机生成一个数字
int i = r.nextInt();
System.out.println(i);
传入10 说明要在 0~9之间生成
i = r.nextInt(10);
System.out.println(i);
生成 10~22
nextInt(最大值 - 最小值 + 1) + 最小值
int result = r.nextInt(22 - 10 + 1) + 10;
System.out.println(result);