常用API和基础算法

微笑、不失礼 提交于 2019-12-06 03:27:52

和数学相关

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]开始存储
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!