JavaSE第五章(API_常用类)
1.Java API
API: 概述应用程序编程接口
API文档:是对Java预先定义的类或接口功能和函数功能的说明文档
目的是提供给开发人员进行使用帮助说明
2.基本数据类型包装类
1.基本数据类型:
byte short int long float double char boolean
基本数据类型 没有面向对象的使用方法,所以java为每种基本累心定义了一个类,来表示基本数据类型,这个类叫做包装类(int 是基本类型 Integer是引用类型)(继承number类)
Integer 为例:
类型为Integer的对象包含一个单一字段,其类型为int
功能包含最大值最小值还有比较方法 构造方法等其他方法
构造方法:
Integer i1=new Integer("数字");
Integer i2=new Integer(10);
比较方法:
compareTo()//
equals()//比较内容
max()
min()
转换方法:(装箱拆箱)
toBinaryString(数字)//转二进制
toHexString(数字)//转16进制
toOctalString(数字)//转8进制
intValue()//把包装的基本类型取出来
parseInt(" ")//将一个String类型转为int类型
toString()//将int包装类型转为String类型
valueOf()//传入基本类型返回引用类型 也可以将String类型返回引用类型
自动装箱:(超出-128~127范围就会new新的对象)
如 int a=10;
装箱:Integer a1=new Integer(a)或=Integeer.valueOf(a)
自动装箱:Integer a1=a;//默认自动调用valueOf()方法 自动将基本类型转为引用类型
自动拆箱:将引用类型的转成基本类型 默认自动intValue()方法
3.Object类
Object类是所有Java类的祖先(根基类)。每个类都使用 Object 作为超类(父类)。所有对象(包括数组)都实现这个类的方法。 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
public class Person { ...
}
等价于:
public class Person extends Object {
...
}
Object类提供的方法:
1.toString方法:
Object类中定义有public String toString()方法,其返回值是 String
类型
可以根据需要在用户自定义类型中重写toString()方法。
2.equals方法:
== 用于基本类型比较 比较的值是否相等 == 用于引用类型比较 比较的是引用地址(对象地址)是否相等
字符串类中重写了Object类中的equals() 实现是比较两个字符串中每一个字母是否相等所以一般默认为equals() 方比较的是对象中内容是否相等
Object类中定义有: public boolean equals(Object obj)方法 提供定义对象是否“相等”的逻辑。
equals方法的定义:x.equals(y)
当x和y是同一个对象的引用(同一类对象且内容相同 不一定是相同对象)时返回true否则false
4.Arrays类(java.util.Arrays类)
用于操作数组工具类
1.equals方法:(数组比较)
比较两个非同一数组是否相等
声明:public static boolean equals(type[]a,type[]a2)
如果两个相等,则返回true,否则返回false
2.sort方法:数组排序
·作用于数组的所有元素 public static void sort(type[] a)
·作用于数组指定范围内的元素 public static void sort(type[] a, int fromIndex(包括), int toIndex(不包括))
按数字升序进行排序
·(不是很理解)自定义对象排序: 自定义类实现Comparable接口 重写compareTo方法(自定义对象都要实现Comparable接口,这个接口中有个public int compareTo(Object o())方法 必须得实现 不然要定义为抽象类)
compareTo方法重写:
例如:public int compareTo(Object o()){
return this.age-o.age;
}
定义的规则就是按年龄来排序 从小到大 返回int类型
大于0 前面大于后面 前后交换
等于0 不变
小于0 前面小于后面 前后交换
总结:等于0 不变 ,大于或小于都交换
如果比较的是String类型的 需要用Integer.parseInt(String str) 将字符型转为int型
Integer.parseInt(String str) 就这个就可以 无需方法体
3.binarySearch:使用二分法搜索指定数组
声明:
·public static int binarySearch(type[] a, type key)
·public static int binarySearch(long[] a,int fromIndex包括,int
toIndex不包括,long key)
如果key在数组中,则返回搜索值的索引;否则返回-1
二分法算法实现:
public static void main(String[] args){ int[] arr={2,3,5,4,8,5,9}; Arrays.sort(arr);//二分法查找之前要先给数组排好序 System.out.println(Array.toString(arr));//输出数组排序后的结果 System.out.println(BinarySearch(arr,5)) public static String BinarySearch(int[] arr,int value){ int low=0; int high=arr.length-1; while(low<higth){ int mid=(low+higth)/2; if(value==arr[mid]){ return "您输入的下标为"+mid; } if(value>arr[mid])low=mid+1; if(value<arr[mid])low=mid-1; } } return "该数不在当前数组中" }
4.toString()方法:
返回指定数组内容的字符串表示形式
声明:public static String toString(type[] a)
5.Arrays.copyof(原数组名,新长度) 动态数组扩容 拷贝
int b=Arrays.copyof(a,20);
返回一个新数组,并将原数组复制到新数组
5.String类/StringBuffer类/StringBuilder类
1.String类
-
String类概述:
String(final修饰)修饰不可变 一旦变了就是new了个新的对象
字符串是由多个字符组成的一串数据(字符序列)的字符串常量,java中所有字符串都是String类的实例
2.两种创建方法:
String s = "abc";
先在栈中创建一个对String类的对象引用变量s,然后去字符串常量池中查找有没有"abc", 如果没有则在常量池中添加”abc”, s引用变量指向常量池中的”abc”,如果常量池中有,则直接指向改地址即可,不用重新创建.
String s = new String("abc");
在堆中创建新对象,值存储在堆内存的对象中
3.构造方法:
·public String() //无参构造
String s=new String();
·public String(String str) //String类型的构造方法
String s=new String("ABC");
//·public String(byte[] bytes)
//·public String(char[] value)
4.判断功能:
· boolean equals(Object obj) // 判断字符串内容是否相等
如 s1.equals(s2)
· boolean equalsIgnoreCase(String str) //判断字符串内容是否相等 忽视大小写
如验证码不区分大小写
· boolean contains(String str) //是否包含指定的子串 如s1.contains("c") s1中是否包含"c"字符串
· boolean isEmpty() //判断为"" 即空
· boolean startsWith(String prefix) //判断是否以指定字符串开头
s.startsWith("a")//字符串是否以a结尾
· boolean endsWith(String suffix)//判断是否以指定字符串结尾
如System.out.println(s1.endsWith("bc"));
· compareTo(String str)//比较字符串大小 System.out.println(s3.compareTo(s4)); 相同返回0 不同返回之差
5.获取功能:
int length()//获取字符串长度
char charAt(int index)//索引 获取指定位置的字符串
int indexOf(String str)//从前往后找 只找首次出现的位置 返回位置
int indexOf(String str,int fromIndex)// 从指定位置开始
s.LastindexOf("a");
s.LastindexOf("a");从后往前找 但是位置标识还是0 1 2 3 4 5.....
String substring(int start)//从指定位置开始截取 到后面整段
String substring(int start,int end)//在指定范围内截取
6.转换功能:
·byte[] getBytes()//编码 把字符转换成字节 默认编码UTF-8
String s="asb";
byte[] a=s.getByte("UTF-8");
String b=new String(a,"UTF-8");//解码 将字节转换成字符串
·char[] a=s.toCharArray()//把字符串转换成char数组
System.out.println(Arrays.toString(a));//以数组的形式输出
·static String valueOf(char[] chs)
String s=new String(a);
String s1=String.valueOf(a);
两个一样的 都是将char数组转换成字符串
·String toLowerCase()//转小写
String a="zhajhsHJ";
System.out.println(a.toUpperCase());
·String toUpperCase()//转大写
·String concat(String str)
·String [] split(分割符) 返回的是数组 根据正则表达式拆分为数组
如 String s="nsdjjdkk&hjj&hhj";
String[] arrays=s.split("&");[nsdjjdkk&hjj&hhj]
正则表达式(规则表达式):验证格式 匹配模式
1.Pattern类 (基本不用)
Pattern p=Pattern.compile("a")//定义一个规则
Matcher m=p.matcher("ab");//输入的内容
boolean b=m.matches()//匹配
2.String类
String s="abc";
boolean b=s.matches("a*b");
记符号:
1.数字类\d 相当于[0-9] 范围可自定
\w 可以匹配大小写 数字 下划线
.也是特殊字符 如邮箱的时候用到 用 \ \ .表示
? 一次或没有
*多次或没有
+一次或多次
{n}恰好n次
{n,}至少n次
{n,m}至少n次 最多m次
^不是 非[ ^ 0-9] 不是0到9
2.字符类
[abc]出现a或b或c
[a-z]小写字母
[A-z]大小写字母 相当于[a-zA-Z]
7.替代功能:
replace:
String s="asdjns";
System.out.println(s.replace("a","C"));//把a换成A
replaceAll:
System.out.println(s.replaceAll("规则 正则表达式 如 \ \d","要替换成的字符 如C"));//把数字替换成C
replaceFirst
System.out.println(s.replaceAll("规则 正则表达式 如 \d","要替换成的字符 如C"));//把第一个数字替换成C
String trim 去除字符串两端空格
2.StringBuffer类(缓冲区 可变)
当向StringBuffer中添加内容时,是将内容添加到底层的数组中,数组没有被final修饰
当数组装满时,会创建一个新数组,将新数组的地址给基层数组,StringBuffer对象是不会改变
添加功能
append(" ") //附加 在末尾
insert(在哪个位置插入,“插入的字符串”) //插入
删除功能
deleteCharAt(要删除的位置)
public StringBuffer delete(int start,int end) //包含开始不包涵结束 删除一段
替换功能
public StringBuffer replace(int start,int end,String str)
反转功能
public StringBuffer reverse()//逆序
截取功能
public String substring(int start) //返回一个新的字符串
public String substring(int start,int end)
截取功能和前面几个功能的不同
返回值类型是String类型,本身没有发生改变
3.StringBuilder类(缓冲区 可变 多线程不安全)
StringBuilder类功能和StringBuffer功能完全一致, StringBuffer是线程安全的
StringBuffer 有synchronized关键字 加锁了 得排队 一个一个访问 安全
多线程访问同一个东西 才会出现安全问题
6.Math类/Random类/System类
1.Math类
abs 绝对值
sqrt 平方根
pow(double a, double b) a的b次幂
max(double a, double b)
min(double a, double b)
random() 返回 0.0 到 1.0 的随机数
2.Random类:
用于生产随机数( 导包java.util.Random)
package com.ffyc.javaapi.math; import java.util.Arrays; import java.util.Random; public class RandomDemo { public static void main(String[] args) { Random r = new Random(); //int a=r.nextInt(4); //System.out.println(r.nextInt());//在int的范围内随机取出 //System.out.println(r.nextInt(4));//0--<4 在指定的区间内随机取出 //System.out.println(r.nextBoolean()); byte[] b = new byte[5];//随机取出 数组.length个随机数 r.nextBytes(b); System.out.println(Arrays.toString(b)); } }
构造方法:public Random()
成员方法 :public int nextInt()
public int nextInt(int n)
3.System类
(系统的东西平时用不得 了解)
成员方法:
public static void exit(int status)
public static long currentTimeMillis()
7.Date类/Calendar类/SimpleDateFormat类
1.Date类(基本不用了 被代替)
package com.ffyc.javaapi.date; import java.util.Date; public class DateDemo { public static void main(String[] args) { long l = System.currentTimeMillis(); Date date = new Date();//创建一个日期对象,里面包含了程序运行时的那一刻的时间,提供方法方便操作 System.out.println(date.getTime());//1637485760505 System.out.println(date.getYear()+1900);// 称为过期方法,不建议使用,有新方法代替 System.out.println(date.getMonth()+1);//0,1,2,3,4, Date date1 = new Date(1637483235781L); System.out.println(date1); } }
2.Calendar类(用这个)
1.Calendeer类是一个抽象类,创建对象过程对于程序员来说是透明的,只需要使用getInstance方法创建即可
Calendar c=Calendar.getInstance();
c.get(Calendar.YEAR);
package com.ffyc.javaapi.date; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class CalendarDemo { public static void main(String[] args) { /* Calendar 是一个抽象类,抽象类不能创建对象, 怎么表示一个时间? Calendar.getInstance(); 获得是一个子类对象,GregorianCalendar 公历 */ //Calendar c = Calendar.getInstance(); Calendar c = new GregorianCalendar();//获得日历对象 实现是子类 System.out.println(c); int date = c.get(Calendar.DAY_OF_MONTH); System.out.println(date); int dayofYear = c.get(Calendar.DAY_OF_YEAR); System.out.println(dayofYear); System.out.println(c.get(Calendar.WEEK_OF_YEAR)); System.out.println(c.get(Calendar.WEEK_OF_MONTH)); System.out.println(c.get(Calendar.DAY_OF_WEEK));//0 Date d = c.getTime(); long t = c.getTimeInMillis(); } }
3.SimpleDateFormat类(日期格式化类)
-
构造方法
SimpleDateFormat(格式); // yyyy-MM-dd
2.日期转字符串
Date now=new Date();
myFmt.format(now);
-
字符串转日期
myFmt.parse(“2018-02-10”);
字符串日期格式与 指定格式必须一致 例如:String s = “2018-03-15”;
new SimpleDateFormat(“yyyy-MM-dd”)
4.格式
package com.ffyc.javaapi.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { /* 时间--long类型 时间--对象类型 SimpleDateFormat 将字符串日期 转为 Date(对象) 在网页中输入生日(字符串) 提交给java --->date对象 将Date(对象) 转为 字符串 java中日期Date对象 ----> 网页--->字符串 */ public static void main(String[] args) { /*String birthday = "2000-10-10"; *//* 日期格式化 yyyy-MM-dd 参考API *//* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = sdf.parse(birthday); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); }*/ //日期转字符串 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS E"); String s = sdf.format(date); System.out.println(s); } }
8.BigInteger/BigDecimal
1.BigInteger类
在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性。我们都知道 Integer 是 Int 的包装类,int 的最大值为 2^31-1。若希望描述更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了BigInteger 类。 BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息BigInteger类位于java.math包中
构造方法
BigInteger(String val) /BigInteger(byte[] val) ...
基本运算方法
add(),subtract(),multiply(),divide()
package com.ffyc.javaapi.math; import java.math.BigInteger; public class BigIntegerDemo { public static void main(String[] args) { /* BigInteger 大整数 long 8 9223372036854775807 */ // long n = 9223372036854775808L; BigInteger b = new BigInteger("922337203685477580711111111111111111111111111111"); BigInteger b1 = new BigInteger("22222222222222222222222222222222222222222222222"); BigInteger b2 = b.add(b1); /*System.out.println(b); System.out.println(b1); System.out.println(b2);*/ System.out.println(b.multiply(b2)); System.out.println(b.divide(b2)); } }
2.BigDecimal类
● 在计算机中不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。
● 根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值.
double a = 1.0-0.9;
double b = 0.8-0.7;
System.out.println(a==b); // 结果?
• 但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算
都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是
一种怎么样的体验?
• Java在java.math包中提供的API类BigDecimal
• 构造方法
BigDecimal(String val)
package com.ffyc.javaapi.math; import java.math.BigDecimal; public class BigDecimalDemo { /* BigDecimal 大浮点 */ public static void main(String[] args) { //System.out.println(12-11.9);//0.09999999999999964 BigDecimal b1 = new BigDecimal("12"); BigDecimal b2 = new BigDecimal("11.9"); System.out.println(b1.subtract(b2)); BigDecimal b3 = new BigDecimal("10"); BigDecimal b4 = new BigDecimal("3"); // 精度 舍入模式 System.out.println(b3.divide(b4,3,BigDecimal.ROUND_CEILING)); } }