和数学相关
java.lang.Math类
- abs(x):求绝对值
- sqrt(x):求平方根
- pow(x,y):求x的y次方
- ceil(x):向上取整
- floor(x):向下取整
- round(x):四舍五入
- random():得到[0,1)范围的随机值
- max(x,y):求x,y的最大值
- min(x,y):求x,y的最小值
- PI:圆周率
java.math包
- BigInteger:不可变,任意精度的整数
- BigDecimal:不可变,任意精度的小数
- 它们要new对象来表示数据,要通过add,subtract,multiply,divide等方法来进行算术运算
java.util.Random
1 Random r = new Random(); 2 3 double d = r.nextDouble();//[0,1) 4 int i = r.nextInt();//int范围内 5 int j = r.nextInt(x);//[0,x)范围内的整数
日期时间相关
java.util.Date
- new Date():获取系统日期时间
- new Date(long 毫秒):根据毫秒值来获取日期时间
- long getTime():获取该日期时间对应的毫秒值,距离1970-1-1 0:0:0
java.util.Calender
(1)创建子类对象:GregorianCalender
(2)获取指定时区的日历对象:
- getInstance()
- getInstance(TimeZone 时区)或getInstance(Locale 语言环境)
- getInstance(TimeZone, Locale)
(3)get(字段名)
例如:int year = get(Calender.YEAR)
java.text.DateFormat 日期时间格式化
使用它的子类:SimpleDateFormat
y:年
M:月
d:日
D:一年中的第几天
H:24小时制的时
h:12小时制的时
m:分
s:秒
S:毫秒
E:星期
java.time包
1、本地化日期/时间:LocalDate,LocalTime,LocalDateTime
now():获取当前的日期或时间
of(x,x,x):获取指定的日期或时间
withXxx(),plusXxx(),MinusXxx():修改日期和时间,修改后要重新接收新对象
isLeepYear(): 判断是否是闰年
…
2、阶段日期或时间:间隔日期Period和持续时间Duration
between(x,y):两个日期或时间
3、格式化:DateTimeFormatter
使用预定义的模式:ISO_LOCAL_DATE
使用自定义模式:例如yyyy-MM-dd HH:mm:ss
使用FormatStyle枚举常量:LONG,MEDIUM,SHORT
系统相关类
java.lang.System类:系统工具类
static long currentTimeMillis():获取系统时间的毫秒值
static void exit(x):退出JVM
static void arraycopy(原数组,原数组的起始下标,目标数组,目标数组的起始下标,一共复制几个元素)
static void gc():通知垃圾回收器工作
static String getProperty(系统属性名)
java.lang.Runtime类:JVM运行环境
static Runtime getRuntime()
long totalMemory()
long freeMemory()
void gc()
数组相关的算法
反转
1 //方式一:借一个数组 2 int[] arr = {1,2,3,4,5}; 3 4 //(1)先创建一个新数组,长度和原来的数组一样 5 int newArr = new int[arr.length]; 6 //(2)把原数组的元素,倒置放到新数组中 7 for(int i=0; i<arr.length; i++){ 8 newArr[i] = arr[arr.length-1-i]; 9 } 10 //(3)指向新数组 11 arr = newArr;
1 //方式二:首尾交换 2 int[] arr = {1,2,3,4,5}; 3 4 int start = 0; 5 int end = arr.length; 6 //反转[start, end) 7 //交换次数:(end-start)/2 8 for(int i=0; i< (end-start)/2; i++){//循环次数代表交换的次数 9 int temp = arr[start+i]; 10 arr[start+i] = arr[end-1-i]; 11 arr[end-1-i] = temp; 12 }
1 //方式二:首尾交换 2 int[] arr = {1,2,3,4,5}; 3 4 int start = 0; 5 int end = arr.length; 6 //反转[start, end) 7 for(int left=start, right=end-1; left<=right; left++,right--){//left代表左边元素的下标,right代表右边元素的下标 8 int temp = arr[left]; 9 arr[left] = arr[right]; 10 arr[right] = temp; 11 }
扩容
步骤:
(1)先创建一个新数组
- 可能在原数组基础上+一定长度
- 可能原数组长度翻倍
(2)把旧数组的数据赋值到新数组中
(3)放入新增元素
(4)指向新数组
1 int[] arr = {1,2,3,4,5}; 2 3 //(1)先创建一个新数组 4 int[] newArr = new int[arr.length+1]; 5 6 //(2)复制元素 7 for(int i=0; i<arr.length; i++){//这里i<arr.length,比较越界 8 newArr[i] = arr[i]; 9 } 10 11 //(3)指向新数组 12 arr = newArr; 13 14 //(4)把新元素放入 15 arr[arr.length-1] = 新值;
插入
步骤:
(1)判断数组是否需要扩容
如果需要,先扩容
(2)把[index]位置和它后面的元素往右移动
(3)在[index]位置放入新元素
1 int[] arr = {....}; 2 3 //1、先扩容 4 //(1)先创建一个新数组 5 int[] newArr = new int[arr.length+1]; 6 7 //(2)复制元素 8 for(int i=0; i<arr.length; i++){//这里i<arr.length,比较越界 9 newArr[i] = arr[i]; 10 } 11 12 //(3)指向新数组 13 arr = newArr; 14 15 //2、移动元素 16 System.arraycopy(arr, index, arr, index+1, 移动元素的个数); 17 18 //3、在[index]位置放入新元素 19 arr[index] = 新值;
删除
步骤:
(1)把[index+1]位置和它后面的元素往左移动
(2)把当前数组的最后一个元素还原
1 int[] arr = {....}; 2 3 //移动元素 4 System.arraycopy(arr, index+1, arr, index, 移动元素的个数); 5 6 arr[最后元素的下标] = 0;//引用数据类型的数组,就是为null
二分查找
1 int[] arr = {....};//前提是有序的 2 3 int left = 0; 4 int right = arr.length-1; 5 int mid = (left + right)/2; 6 int index = -1; 7 int value = ?; 8 9 while(left<=right){ 10 if(arr[mid] == value){ 11 index = mid; 12 break; 13 }else if(arr[mid] > value){ //如果数组是从小到大,往左移动 14 //修改右边界 15 right = mid -1 ; 16 }else{ 17 //修改左边界 18 left = mid +1; 19 } 20 //因为left或right变了,mid也得重新计算 21 mid = (left + right)/2; 22 } 23 24 if(index==-1){ 25 //没有 26 }
选择排序
1 int[] arr = {....}; 2 3 //轮数 = arr.length-1 4 for(int i=0; i<arr.length-1; i++){ 5 //(1)找出本轮最小值 6 int minIndex = i; 7 for(int j=i+1; j<arr.length-1; j++){ 8 if(arr[minIndex] > arr[j]){ 9 minIndex = j; 10 } 11 } 12 13 //(2)如果本轮最小值不在它应该在的位置 14 if(minIndex != i){ 15 int temp = arr[minIndex]; 16 arr[minIndex] = arr[i]; 17 arr[i] = temp; 18 } 19 }
数组工具类java.util.Arrays
序号 | 方法签名 | 方法功能简介 |
1 | static int binarySearch(数据类型[] a, 数据类型 key) | 使用二分查找法在a数组中查找key的下标 |
2 | static 数据类型[] copyOf(数据类型[] original, int newLength) | 根据original复制一个新数组长度为newLength |
3 | static 数据类型[] copyOfRange(数据类型[] original, int from, int to) | 根据original的[from,to)部分复制一个新数组 |
4 | static boolean equals(数据类型[] a1, 数据类型[] a2) | 比较两个数组内容是否一致 |
5 | static void fill(数据类型[] a, 数据类型val) | 用val的值填充a数组 |
6 | static void sort(数据类型[] a) | 将a数组按照自然排序规则实现升序排列 |
7 | static void sort(数据类型[] a, Comparator c) | 将a数组按照c指定的定制比较规则实现升序排列 |
8 | static String toString(数据类型[] a) | 将数组的元素拼接为一个字符串返回 |
String类
String类的特点
1、Sting类是final修饰的,不能被继承
2、String类的底层使用数组存储
JDK1.9之前:char[] value
JDK1.9之后:byte[] value
3、Stirng类的对象不可变
(1)字符串常量池中存储字符串常量,可以共享
(2)每次修改都会产生新对象,频繁修改的话效率不高
如果涉及到大量的字符串修改操作,建议使用StringBuffer或StringBuilder
如何实现不可变的?
(1)类本身不能继承,没有子类会重写
(2)底层存储的value数组都是final修饰
(3)底层存储的value数组私有化
(4)对外提供的所有修改字符串的方法,都返回一个新字符串对象
4、在java程序代码中任意使用””引起来的部分都是字符串的对象
String对象的创建
1、字面常量值
1 String str = "hello";
2、使用构造器
1 String str = new String(); 2 String str = new String("hello"); 3 char[] arr = {...}; 4 String str = new String(arr); 5 byte[] arr = {...}; 6 String str = new String(arr); 7 //....
3、静态方法
1 String str = String.copyValueOf(xx); 2 String str = String.valueOf(xx);
4、xx.toString()
1 Student stu = new Student(xx); 2 String str = stu.toString(); 3 4 StringBuffer s = new StringBuffer(xx); 5 String str = s.toString();
5、和字符串的拼接+
1 int a = 10; 2 String str = a + "";
String对象的个数
1 String str = "hello";//1个
1 String str = new String("atguigu");//2个
1 String s1 = "hello";//1个 2 String s2 = "world";//1个 3 String s3 = s1 + s2 + "java";//"java"1个,s1 + s2拼接结果1个,最后结果1个
String对象的拼接
1、+
(1)常量池中的字符串常量 + 常量池中的字符串常量 :结果是在常量池中
(2)变量 + xx:结果都在堆
(3)指向堆中的字符串常量 + xx:结果都在堆
(4)xx拼接结果.intern():结果都在常量池
2、concat:拼接的结果都是新的字符串,都在堆中
String对象的比较
1、==:比较地址
2、equals(xx):比较字符串内容,严格区分大小写
3、equalsIgnoreCase(xx):比较字符串内容,不区分大小写
4、compareTo(xx):比较字符串的大小,按照字符编码值比较,严格区分大小写
5、compareToIgnoreCase(xx):比较字符串的大小,按照字符编码值比较,不区分大小写
6、java.text.Collator:文本校对器比较大小,按照指定语言环境的自然语言顺序比较大小(字典排序)
空字符串与空字符串的判断
1 if(str !=null && str.isEmpty()) 2 if(str !=null && str.length()==0) 3 if(str !=null && str.equals("")) 4 if("".equals(str))
String类的常用API
序号 | 方法签名 | 方法功能简介 |
1 | String() | 创建空字符串 |
2 | String(String original) | 根据original创建一个新字符串 |
3 | static String valueOf(xx value) | 根据value内容创建一个字符串 |
4 | String intern() | 将字符串的内容存入常量池 |
5 | String concat() | 字符串拼接 |
6 | boolean equals(Object obj) | 判断当前字符串与指定字符串内容是否已在,严格区分大小写 |
7 | boolean equalsIgnoreCase(String obj) | 判断当前字符串与指定字符串内容是否已在,不区分大小写 |
8 | int compareTo(String str) | 比较当前字符串与指定字符串的大小,严格区分大小写 |
9 | int compareToIgnoreCase(String str) | 比较当前字符串与指定字符串的大小,不区分大小写 |
10 | boolean isEmpty() | 判断当前字符串是否为空 |
11 | int length() | 返回当前字符串的长度 |
12 | String toLowerCase() | 将当前字符串转为小写 |
13 | String toUpperCase() | 将当前字符串转为大写 |
14 | String trim() | 去掉当前字符串前后空白符 |
15 | boolean contains(xx) | 判断当前字符串中是否包含xx |
16 | int indexOf(xx) | 在当前字符串中查找xx第一次出现的下标 |
17 | int lastIndexOf(xx) | 在当前字符串中查找xx最后一次出现的下标 |
18 | String substring(int beginIndex) | 从当前字符串的[beginIndex, 最后]截取一个子串 |
19 | String substring(int beginIndex, int endIndex) | 从当前字符串的[beginIndex, endIndex)截取一个子串 |
20 | char charAt(index) | 返回当前字符串[index]位置字符 |
21 | char[] toCharArray() | 将当前字符串的内容用一个字符数组返回 |
22 | String(char[] value) | 用value字符数组的元素构建一个新字符串 |
23 | String(char[] value,int offset, int count) | 用value字符数组的[offset]开始的count个字符构建一个新字符串 |
24 | static String copyValueOf(char[] data) | 用data字符数组的元素构建一个新字符串 |
25 | static String copyValueOf(char[] data, int offset, int count) | 用data字符数组的[offset]开始的count个字符构建一个新字符串 |
26 | static String valueOf(char[] data) | 用data字符数组的元素构建一个新字符串 |
27 | static String valueOf(char[] data, int offset, int count) | 用data字符数组的[offset]开始的count个字符构建一个新字符串 |
28 | byte[] getBytes() | 将当前字符串按照平台默认字符编码方式编码为字节序列 |
29 | byte[] getBytes(字符编码方式) | 将当前字符串按照指定字符编码方式编码为字节序列 |
30 | String(byte[] bytes) | 将bytes字节序列按照平台默认字符编码方式解码为字符串 |
31 | String(byte[] bytes,String charsetName) | 将bytes字节序列按照指定字符编码方式解码为字符串 |
32 | boolean startsWith(xx) | 判断当前字符串是否以xx开头 |
33 | boolean endsWith(xx) | 判断当前字符串是否以xx结尾 |
34 | boolean matchs(xx) | 判断当前字符串是否满足xx正则 |
35 | String replace(xx,yy) | 将当前字符串中所有xx替换为yy |
36 | String replaceFirst(xx,value) | 将当前字符串中第一个满足xx正则的字符替换为value |
37 | String repalceAll(xx, value) | 将当前字符串中所有满足xx正则的字符替换为value |
38 | String[] split(xx) | 将当前字符串按照xx正则拆分为多个字符串 |
39 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将当前字符串的[srtBegin,srcEnd)部分字符复制到dst字符数组中,dst数组从[dstBegin]开始存储 |
StringBuffer和StringBuilder
String类与StringBuffer和StringBuilder区别
String类的对象是不可变字符序列,StringBuffer和StringBuilder的对象是可变字符序列
StringBuffer:老点,线程安全的,因为它的方法有synchronized修饰
StringBuilder:JDK1.5之后引入的,线程不安全,单线程情况下推荐使用
StringBuffer和StringBuilder的API
序号 | 方法签名 | 方法区功能简介 |
1 | StringBuffer() | 创建一个空的可变字符序列,默认长度16 |
2 | StringBuffer(String str) | 用字符串str内容创建一个可变字符序列 |
3 | StringBuffer append(数据类型 b) | 在当前字符序列后面追加b |
4 | StringBufferinsert(int index, 数据类型 s) | 在当前字符序列[index]插入s |
5 | StringBuffer delete(int start, int end) | 删除当前字符序列[start,end)部分字符 |
6 | StringBuffer deleteCharAt(int index) | 删除当前字符序列[index]位置字符 |
7 | void setLength(int newLength) | 修改当前字符序列的长度为newLength |
8 | void setCharAt(int index, char ch) | 替换当前字符序列[index]位置字符为ch |
9 | StringBuffer reverse() | 将当前字符序列内容反转 |
10 | StringBuffer replace(int start, int end, String str) | 替换当前字符序列[start,end)部分字符为str |
11 | int indexOf(String str) | 在当前字符序列中开始查找str第一次出现的下标 |
12 | int indexOf(String str, int fromIndex) | 在当前字符序列[fromIndex]开始查找str第一次出现的下标 |
13 | int lastIndexOf(String str) | 在当前字符序列中开始查找str最后一次出现的下标 |
14 | int lastIndexOf(String str, int fromIndex) | 在当前字符序列[fromIndex]开始查找str最后一次出现的下标 |
15 | String substring(int start) | 截取当前字符序列[start,最后]部分构成一个字符串 |
16 | String substring(int start, int end) | 截取当前字符序列[start,end)部分构成一个字符串 |
17 | String toString() | 将当前可变字符序列的内容用String字符串形式表示 |
18 | void trimToSize() | 如果缓冲区大于保存当前字符序列所需的存储空间,则将重新调整其大小,以便更好地利用存储空间 |
19 | int length() | 返回当前字符序列的长度 |
20 | char charAt(int index) | 返回当前字符序列[index]位置字符 |
21 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将当前字符串的[srtBegin,srcEnd)部分字符复制到dst字符数组中,dst数组从[dstBegin]开始存储 |