API (Application Programming Interface) 应用程序编程接口,Java中的API,就是JDK提供的各种功能的Java类。
常用的包
- java.lang包:是Java最核心的包,JVM(Java虚拟机)启动时自动加载lang包的所有类和接口,无需import。如:System类、String类、Object类、Class类…
- java.util包:是Java工具包,包括很多工具类和集合。如:Scanner类、Random类…
- java.io包:是输入输出包,包括读写各种设备。
- java.net包:是网络编程的包,包括各种网络编程。
- java.sql包:是操作数据库的所有类和接口。
1. Object类与其常用方法
1.1 Object类
- java.lang.Object类在Java类继承结构中位于顶端(根类),任何类都是该类的直接或间接子类。
- Object定义了“对象”的基本行为,被子类默认继承。
1.2 equals() 和 hashCode()
- boolean equals()方法用于非空对象的“相等”逻辑,默认比较两个对象的地址,返回布尔值。
- equals()方法要求:自反性/对称性/传递性/一致性/非空性。
- Java类可以根据需要重写继承自Object的equals()方法。
注意:当equals()方法被重写时,必须重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
1.3 toString()
- String toString():用于获取调用对象的字符串形式,返回”包名.类名@hashCode值的16进制”。
- Java类可以根据需要重写toString方法返回更有意义的信息。
- Java在使用System.out.println()打印对象时或者
+
连接字符串时,默认调用toString()方法。
2. 包装类
2.1 包装类
- 由于某些特殊场合(集合)中要求所有数据内容都必须是对象,而对于基本数据类型的变量来说不满足该要求,为了使得该变量也能够使用就需要对变量打包处理变成对象,此时就需要借助包装类。
- Java语言8种基本类型分别对应了8中“包装类”,每一种包装类都封装了一个对应的基本类型成员变量,还提供了一些针对该数据类型的实用方法。
基本类型 |
对应包装类 |
byte |
java.lang.Byte |
short |
java.lang.Short |
int |
java.lang.Integer |
long |
java.lang.Long |
float |
java.lang.Float |
double |
java.lang.Double |
boolean |
java.lang.Boolean |
char |
java.lang.Character |
- 八个包装类都在同一个包下(java.lang包),不需要import导包直接使用
- 八个包装类中有六个是与数字相关,都默认继承父类Number
- 八个包装类都实现了Serializable, Comparable
- 八个包装类都有带自己对应类型参数的构造方法,其中有七个(除了Character)还有构造方法重载,带String类型
- 八个包装类都提供了各自对应的拆包方法,如intValue,floatValue,将包装类对象拆成基本类型
2.2 Integer类
- java.lang.Integer类是int类型的包装类,该类型对象中包含一个int类型的成员变量。该类由final关键字修饰表示不能被继承。
- Integer类重写了**equals()**方法(重写后比较的是数值)、hashCode()以及toString()方法。
Integer类的常用方法 |
|
Integer(int i) |
根据参数指定整数来构造对象 |
Integer(String s) |
根据参数指定的字符串来构造对象 |
int intValue() |
获取调用对象中整数值并返回 |
static Integer valueOf(int i) |
根据参数指定整数值得到Integer类型对象 |
static int parseInt(String s) |
将字符串类型转换为int类型并返回 |
2.3 装箱和拆箱
1 2 3 4 5 6
| int i = 100; Integer it = Integer.valueOf(i); int ia = it.intValue();
Integer i = 100; int ia = i;
|
- 笔试考点:
- 在Integer类部提供了自动装箱池技术,将**-128~127间的整数已经装箱完毕**,当使用该范围整数时直接取池中的对象即可,从而提高效率。
- Integer类加载的时候,自己有一个静态的空间立即加载Integer类型的数组,存储256个Integer对象(-128 ~ 127),当使用该范围整数时,直接取静态区中找对应的对象;如果我们用的对象范围会帮我们创建一个新的Integer对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Integer it1 = 128; Integer it2 = 128; Integer it3 = new Integer(128); Integer it4 = new Integer(128); System.out.println(it1.equals(it2)); System.out.println(it1 == it2); System.out.println(it3.equals(it4)); System.out.println(it3 == it4);
Integer it5 = 127; Integer it6 = 127; Integer it7 = new Integer(127); Integer it8 = new Integer(127); System.out.println(it5.equals(it6)); System.out.println(it5 == it6); System.out.println(it7.equals(it8)); System.out.println(it7 == it8);
|
3. 数学处理类
- java.lang.Math构造方法是私有的,我们不能直接调用创建对象;由于Math中提供的属性及方法都是static 不需要创建对象。
常用的方法 |
返回值类型 |
|
Math.abs() |
|
返回给定数字的绝对值(参数 int long float double) |
Math.ceil() |
double |
向上取整 |
Math.floor() |
double |
向下取整 |
Math.rint() |
double |
临近的整数 如果两边距离一样 则返回偶数 |
Math.round() |
int |
四舍五入的整数 |
Math.max(a,b)/min(a,b) |
|
(参数int long float double) |
Math.pow(a,b) |
double |
a的b次方 (参数double 返回值double) |
Math.sqrt(double a) |
|
获取给定参数的平方根 |
Math.random() |
double |
随机产生一个[0.0–1.0) |
- 0-9之间的随机整数:int value = (int)**(Math.random()10*);
- Math.random()计算小数的时候精确程度可能有些损失
3.1 Random类
- java.util.Random,在java.util包中的类,需要import导入,没有任何继承关系 默认继承Object类
常用的方法 |
Random r = new Random(); |
r.nextInt(); |
随机产生 int取值范围的整数 有正有负(-2^31 ~2^31-1 即正负21亿 之间) |
r.nextInt(int bound); |
随机产生一个[0–bound)整数;注意bound必须为正数,否则会出现如下的运行时异常:IllegalArgumentException |
r.nextFloat() |
随机产生一个 [0.0—1.0) |
r.nextBoolean() |
随机产生一个boolean值 true false |
3.2 UUID类
- java.util.UUID,在java.util包中的类,需要import导入,没有任何继承关系 默认继承Object类
- 只有有参构造方法,我们通常不会创建对象
- UUID uuid = UUID.randomUUID();//通常用于数据库表格主键 primary key
- 产生一个32位的随机元素 每一个位置是一个16进制的数字
3.3 BigDecimal
- java.math.BigDecimal类处理大浮点数,需要import导入,继承自Number
- Java浮点数据类型(float和double)在运算时会有舍入误差,如果希望得到精确运算结果,可以使用java.math.BigDecimal类。
- 提供的构造方法全部都是带参数的
- 通常利用带String参数的构造方法创建这个类的对象:BigDecimal bi = new BigDecimal(“1.23”);
BigDecimal类的常用方法 |
|
BigDecimal(String val) |
根据参数指定的字符串来构造对象 |
BigDecimal setScale(int newScale, RoundingMode roundingMode) |
两个参数前面是保留小数点之后的位数,后面参数是设置的模式(向上取整或向下等) |
BigDecimal add(BigDecimal augend) |
用于实现加法运算 |
BigDecimal subtract(BigDecimal subtrahend) |
用于实现减法运算 |
BigDecimal multiply(BigDecimal multiplicand) |
用于实现乘法运算 |
BigDecimal divide(BigDecimal divisor) |
用于实现除法运算,也可传入更多参数设置保留小数点位数和取值模式 |
1 2 3 4 5 6
| BigDecimal d3 = new BigDecimal("3.0"); BigDecimal d4 = new BigDecimal("2.9"); System.out.println(d3.add(d4)); System.out.println(d3.subtract(d4)); System.out.println(d3.multiply(d4)); System.out.println(d3.divide(d4, 8, BigDecimal.ROUND_HALF_UP));
|
对于divide方法,通常需要制定精度和舍入模式,否则当遇到无限小数时,除法会一直进行下去直至抛出异常。
3.4 BigInteger
- java.math.BigInteger类处理大整数,需要import导入,继承自Number
- java提供的整数类型(int\long)的存储范围有限,当需要进行很大整数运算时可以使用java.math.BigInteger类,理论上其储值范围只受内存容量限制。
- 如何创建对象,提供的构造方法全部都是带参数的
- 通常利用带String参数的构造方法创建这个类的对象:BigInteger bi = new BigInteger(“123”);
- 和BigDecimal类似,BigInteger也提供add()、substract()、multiply()、divide()等方法。
- 所属的包 java.text,import导入才能使用
- 通过带String参数的构造方法创建一个格式化对象(0:未满会补齐,#:未满不补)
1 2 3 4 5 6 7 8 9 10 11 12
| DecimalFormat df = new DecimalFormat("000.000"); System.out.println(df.format(12.45)); System.out.println(df.format(12345.6789));
DecimalFormat df2 = new DecimalFormat("###.###"); System.out.println(df2.format(12.45)); System.out.println(df2.format(12345.6789));
DecimalFormat df3 = new DecimalFormat("000.###"); System.out.println(df3.format(12.45)); System.out.println(df3.format(12345.6789));
|
4. Scanner类和System类
4.1 Scanner类
- 所属的包java.util包 需要import导包
- 通过一个带输入流的构造方法创建对象
- 常用方法 nextInt() nextFloat() next() nextLine()
4.1 System类
- 所属的包java.lang包 不需要导入
- 不需要创建对象 通过类名就可以访问
- 有三个属性及若干的方法
- 三个属性out in err
- 方法:gc() exit(0); currentTimeMillis()获取系统当前时间毫秒;
5. 日期类
5.1 Date类
- java.util.Date类表示特定的瞬间,精确到毫秒。
- 通常使用无参数的构造方法,或者带long构造方法
- Date类中常用的方法
- before(); after();
- setTime() getTime();—–>long
- compareTo(); //-1 1 0
- Date类大多数用于进行时间分量计算的方法已经被Calender取代。
1 2 3 4
| Date date = new Date(); long time = date.getTime(); date.setTime(time + 24\*60\*60\*1000);
|
- java.text.SimpleDateFormat类主要用于实现日期和文本类型之间的转换。是DateFormat(抽象类)的子类
- 其构造方法 SimpleDateFormat(String pattern)
1 2 3 4 5 6 7 8
| Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); String dateStr = sdf.format(date);
String str = "2013-01-06"; SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); Date date2 = sdf2.parse(str);
|
常用格式字符串 |
含义 |
示例 |
y |
年 |
yyyy年——2013年;yy——13年 |
M |
月 |
MM月——01月;M月——1月 |
d |
日 |
dd日——01日;d日——1日 |
H |
小时(24) |
HH:mm:ss—12:46:33 |
h |
小时(12) |
hh(a):mm:ss—12(下午):47:48 |
m |
分钟 |
– |
s |
秒 |
– |
5.3 Calendar类
- java.util.Calendar类是一个抽象类,主要用于取代Date类中过时的方法来描述年月日时分秒信息。
- 有构造方法,用protected修饰的,通常访问不到,通常会调用默认的getInstance();
- 通常使用Calendar的静态方法getInstance获得Calendar对象;getInstance方法将根据系统地域信息返回不同的Calendar类的实现
1 2 3
| Calendar c1 = Calendar.getInstance(); c1.set(2008,9-1,20,8,8,8); System.out.println(c1.getTime());
|
常用方法
TimeZone
- java.util包
- 可以通过calendar对象.getTimeZone()获取 或 TimeZone.getDefault();
- 常用方法
- tz.getID() —-> Asia/Shanghai
- tz.getDisplayName() —-> 中国标准时间
6. String类
6.1 基本概念
- String类 —> 引用类型 —> java.lang包
- 没有任何继承关系,实现三个接口Serializable, CharSequence, Comparable
- java.lang.String类用于描述字符串数据,java程序中所有的字符串字面值都可以使用String类的实例(对象)加以描述,如”abc”等,任何一个字符对应2字节定长编码。
- String类由final关键字修饰表示该类不能被继承,该类描述的字符串内容是常量,一旦创建无法更改,因此可以被共享。对字符串重新赋值不是改变其内容,而是改变引用的指向。
1 2 3 4 5 6 7 8 9 10
| String str1 = "abc"; String str2 = new String(); String str3 = new String("abc"); byte[] bArr = {97, 98, 99, 100, 101}; String str4 = new String(bArr); char[] cArr = {'h', 'e', 'l', 'l', 'o'}; String str5 = new String(cArr); String str6 = String(char[], index, count); String str7 = String(byte[], index, length);
|
6.2 字符串常量池
- 由于String类型对象描述的字符串内容是个常量,若多个相同的内容单独存储会造成时间和空间的浪费。
- 出于性能考虑,Java虚拟机(JVM)将字符串字面量对象缓存在常量池中;对于重复出现的字符串直接量,JVM会首先在缓存池中查找,如果存在即返回该对象。
1 2 3 4 5 6 7 8 9 10
| String str1 = "Hello"; String str2 = "Hello"; String str3 = new String("Hello"); System.out.println(str1.equals(str2)); System.out.println(str1==str2); System.out.println(str1.equals(str3)); System.out.println(str1==str3); String s1 = "hello"; String s2 = new String("world");
|
6.3 String类常用方法
- 第一梯队(重写): equals hashCode compareTo toString
- 第二梯队(常用):charAt(),codePointAt(),indexOf(),lastIndexOf(),substring(),split(),replace(),length(),concat(),contains(), trim(),getBytes(), toCharArray(),matches()。
- 第三梯队(一般):toUpperCase(),toLowerCase(),startsWith(),endsWith(),isEmpty()。
- 重写了equals(obj),hashCode(),toString()方法,compareTo(str)方法实现自Comparable接口
- boolean = equals(Object obj);
- 继承自Object类中的方法,重写后改变了规则,比较字符串中的字面值(==与equals()区别);
- int = hashCode();
- 继承自Object类中的方法,重写了:31*h+和…
- int = compareTo();
- 实现自Comparable接口,实现方法:结果按照字典排布(unicode编码)顺序,按照两个字符串的长度较小的那个(次数)来进行循环,若每次的字符不一致 则直接返回code之差,若比较之后都一致 则直接返回长度之差
- String = toString()
- Object类中返回类名@hashCode(16进制形式)
- String类重写后返回的是String对象的字面值
忽略大小写比较:equalsIgnoreCase(), compareToIgnoreCase();
String类的成员方法 |
|
char charAt(int index) |
返回字符串指定位置 |
int codePointAt(int index) |
“abc”0–>97,返回给定index对应位置的那个char所对应的code码 |
String concat(String) |
将给定的字符串拼接在当前字符串之后 |
int length() |
返回字符串序列的长度 |
注意:区别数组的length是属性,String的length()是方法,集合是size()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| String str6 = new String("hello"); System.out.println("下标为0的字符是:"+str6.charAt(0)); System.out.println("字符串长度是:"+str6.length());
String str = new String("123456"); int ia = Integer.parseInt(str); System.out.println("转换出来结果是:"+ ia); int res = 0; for(int i=0; i<str.length(); i++){ res = res*10 + (str.charAt(i)-'0'); } System.out.println("转换出来结果是:"+ res);
|
String类的常用基本方法 |
|
boolean contains(CharSequence s) |
判断当前字符串是否包含参数指定的内容 |
String toLowerCase() |
返回小写形式 |
String toUpperCase() |
返回大写形式 |
String trim() |
返回去掉前后空格的字符串 |
boolean startsWith(String prefix) |
判断是否以参数字符开头 |
boolean endsWith(String suffix) |
判断是否以参数字符结尾 |
boolean equals(Object anObject) |
比较字符串内容是否相等,String类已重写 |
boolean equalsIgnoreCase(String anotherString) |
同上,并且忽略大小写 |
int indexOf(String str) |
返回第一次出现str位置,找不到返回-1 |
int indexOf(String str, int fromIndex) |
同上,从fromIndex开始检索 |
String substring(int beginIndex, int endIndex) |
截取字符串,beginIndex开始,endIndex结束 |
String substring(int beginIndex) |
截取字符串,beginIndex开始到结尾 |
6.4 正则相关方法
- 正则表达式本质就是一个字符串,用于对用户输入数据的格式进行验证。
正则相关方法 |
|
boolean matches(String regex) |
用于判断是否匹配正则表达式规则。 |
String[] split(String regx) |
以正则为分割符,将字符串拆分成字符串数组 |
String replaceAll(String regex, String replacement) |
正则替换 |
7. StringBuilder类/StringBuffer类
7.1 基本概念
- java.lang.StringBuilder类和java.lang.StringBuffer类描述的字符串内容是个可以改变的字符串序列。
- StringBuffer和StringBuilder继承AbstractStringBuilder间接继承 Object,实现接口Serializable,CharSequence,Appendable
- StringBuffer/StringBuilder没有compareTo方法
- StringBuffer/StringBuilder含有一个String没有的方法 append();拼接
7.2 特性
可变字符串,char[] value; 动态扩容
7.3 对象的构建
1 2 3 4 5 6
| StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder(20); StringBuilder builder = new StringBuilder("abc");
|
7.4 StringBuilder中常用的方法
- 最主要的方法 append() 频繁的拼接字符串的时候使用此方法 提高性能
- ensureCapacity(int minimumCapacity) 确保底层数组容量够用
- capacity();//字符串底层char[]的容量
- length();//字符串有效元素个数(长度)
- setLength();//设置字符串的有效元素个数
- char = charAt(int index);
- int = codePointAt(int index);
- String = substring(int start [,int end]);//注意需要接受返回值 看见截取出来的新字符串效果
- StringBuilder = delete(int start [,int end]);//StringBuilder类中独有的方法String类没有,将start到end之间的字符串删掉 不用接受返回值就看到效果啦
- StringBuilder = deleteCharAt(int index);//String类中没有的方法,将给定index位置的某一个字符删除掉啦
- int = indexOf(String str [,int fromIndex]);
- int = lastIndexOf(String str [,int fromIndex]);//找寻给定的str在字符串中第一次出现的索引位置 带重载 则从某一个位置开始找
- insert(int index,value);//将给定的value插入在index位置之上
- replace(int start,int end,String str);//将start和end之间的部分替换成str, builder.replace(2,5,”zzt”);
- setCharAt(int index,char value);//将index位置的字符改成给定的value
- toString();//将StringBuilder对象 构建成一个string对象 返回
- trimToSize();//将数组中无用的容量去掉 变成length长度的数组
7.5 总结
- StringBuilder类不一定需要,是为了避免String频繁拼接修改字符串信息的时候才用的,底层数组是可变的,提高了性能;
- 常用方法
- 与String类不同的独有方法:append(),insert(),delete(),deleteCharAt(),reverse();
- 与String类相同的方法:length(),charAt(),codePointAt(),indexOf(),lastIndexOf(),substring(),replace();名字相同 用法不一致
- 不是很常用的方法:ensureCapacity(),capacity(),setLength(),trimToSize(),setCharAt();
- String家族笔试中经常容易考察的知识点
- String所属的包 继承关系 实现接口
- java.lang 继承Object 接口Serializable,CharSequence,Comparable
- String构建方式
- String对象内存结构
- 字符串常量区 new堆内存对象
- == equals()区别
- “a”+”b”+”c”
- String不可变特性
- String中的常用方法
- String和StringBuilder区别 | String和StringBuffer区别
- String不可变字符串
- JDK1.0
- 有一个接口Comparable
- 不可变体现在长度及内容
- 有一些方法StringBuilder没有 concat compareTo toUpperCase
- StringBuilder可变字符串
- JDK1.5
- 有一个接口Appendable
- 可变字符串 没有final修饰 底层可以进行数组扩容
- 有一些方法String没有 append() insert() delete() reverse()
- StringBuffer和StringBuilder的不同
- 它们方法基本相同
- StringBuffer早期版本1.0,早期版本,线程同步,安全性比较高,执行效率相对较低
- StringBuilder后来的版本1.5,后期版本,线程非同步,安全性比较低,执行效率相对较高
8. Optional类
- 可能包含或不包含非空值的容器对象。 如果一个值存在, isPresent()将返回true和get()将返回值。
- 获取字符串长度:
- 方式1:if(null==str){return 0;}else{return str.length();}
- 方式2:return Optional.ofNullable(str).map(String::length).orElse(0);
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| String str1 = "zhangsan"; String str2 = null; int str1Length = Optional.ofNullable(str1).map(String::length).orElse(0); int str2Length = Optional.ofNullable(str2).map(String::length).orElse(0); System.out.println(str1Length + str2Length);
Optional<String> op1 = Optional.ofNullable(str1);
Optional<Integer> op2 = op1.map(String::length);
int len = op2.orElse(0); System.out.println(len);
|
原文链接: http://chaooo.github.io/2017/04/12/java-api.html
版权声明: 转载请注明出处.