Java提升
集合
1.集合基础
1.导包
2.创建
- ArrayList<String> array = new ArrayList<String>();
3.两种添加方法
- array.add("hello");
- array.add(1, "java");
3.常用方法
- boolean remove(Object o) 删除指定的元素,返回删除是否成功
- E remove(int index) 删除指定索引处的元素,返回被删除的元素
- set(int index, E element) 修改指定索引处的元素,返回被修改的元素
- int size() 返回集合的元素个数
异常
Throwable类
Error类 Exception类
RuntimeException类(运行时异常) 其他Exception
三种处理异常的方式:
1.try catch finally
直接处理
try{
可能出现异常的语句
} 【catch(异常类型 异常名){
处理异常
}】【 finally{
此中代码不管有没有处理异常都会执行
}】
1.try catch 2.try catch fianlly 3.try finally(开发过程中较重要)
jdk1.7后
try(定义流对象){}catch(){}
jdk1.9后
定义流对象
try(输入流对象;输出流对象){}catch(){}
仍然需要throw
2.throws
2.throws
想上抛出异常,由上一级进行处理
3.throw
有一些异常jvm不会主动抛出,属于逻辑异常例如:分数应该在0到100之间,这是需要主动抛出所以需要throw
当抛出的是运行时异常时,可以不写throws,否则必须要throws
if(){
throw new 类型();
}
异常处理流程
assert关键字
jdk1.4后,确定代码执行到某行后一定是期待的结果(但只是个建议)
Debug
1.查看程序执行流畅,调试程序
lang包
Math
java.lang下的包是不需要导的
abs(int a)
ceil(double a) 大于等于double值的最小整数
floor(double a) 小于等于 最大
round(float a) 加0.5向下取整
max(int a,int b)
min()
pow(double a ,double b) a的b次幂
Random
1.导入包:
import java.util.Random;
2.初始化:
Random r = new Random();
3.使用:
int number = r.nextInt(10);随机生成0到10中的整数,包括0,不包括10;
如果要生成 1到100:
int number = r.nextInt(100) + 1;
System
System.exit(0);退出jvm
toString()(建议重写);equals(); 可以快捷重写ctrl+shift+s;
数组拷贝:public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
获取当前日期时间数值:public static long currentTimeMillis();(实现操作耗时的统计)
进行垃圾回收:public static void gc();并不是重新定义的方法,而是使用Rantime里的gc(Runtime.getRuntime().gc())
util包
Arrays
sort(数组名); //排序
基本类型包装类
用处:更多方法来操作该数据
常用的操作之一:用于基本数据类型与字符串之间的转换
Number(abstract)
非抽象:
public byte byteValue() 从包装类中获取byte数据
public short byteValue()从包装类中获取short数据
抽象:
方法名 | 说明 | |
---|---|---|
public abstract int intValue() | 普通 | 从包装类中获取int |
public abstract long longValue() | 普通 | 从包装类中获取long |
public abstract float floatValue() | 普通 | 从包装类中获取float |
public abstract double doubleValue() | 普通 | 从包装类中获取double |
Integer
- Integer i = Integer.valueOf(100);
- Integer i = Integer.valueOf("100");
- int和String的相互转换:
- int-----String
- public static String valueOf(int i)
- String-----int
- public static int parseInt(String s)
自动装箱和拆箱
装箱:把基本数据类型转换为对应的包装类类型
拆箱:把包装类类型转换为对应的基本数据类型
//装箱
Integer i = Ingter.valueOf(100);
Integer ii = 100;
//拆箱后装箱
ii += 200;
ii = ii.intValue()+200;
syso(ii);
if(ii != null){} 在开发中对于引用类型,如果做操作,最好先做是否为null的判断
大数据类
BigInteger
public BigInteger(String val);
System.out.println("加法操作:" + bigA.add(bigB));
System.outprintln("减法操作:" + bigA.subtract(bigB));
System.out.println("乘法操作:" + bigA.multiply(bigB));
System.out.println("乘法操作:" + bigA.divide(bigB));
求余:public BigInteger[] divideAndRemaininder(BigInteger val)
返回值第一个为商,第二个为余数
BigDecimal
public BigIDecimal(String val);
和BigInteger很类似
除法(可进位):(roundingMode是一个枚举类)
public BigDecimal divide(BIgDecimal divisor, int scale, RoundingMode roundingMode)
时间日期
Date
代表了一个特定的时间,精确到毫秒
方法名 | 说明 |
---|---|
public Date() | 分配一个Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 |
public Date(long date) | 分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 |
public long getTime() | h获取的日期对象从1970年1月1日00:00:00到现在的毫秒值 |
public void setTime(long time) | s设置时间,给的是毫秒值 |
SimpleDateFormat
是一个具体的类,用以区域设置敏感的方式格式化和解析日期。我们重点学习日期格式化和解析。
方法名 | 说明 |
---|---|
public SimpleDateFormat() | 构造,使用默认模式和日期格式 |
public SimpleDateFormat(String pattern) | g构造一个SimpleDateFormat使用给定的模式和默认的日期格式 |
public final String format(Date date) | 将日期格式化成日期/时间字符串 |
public Date parse(String source) | 从给定字符串的开始解析文本已生成日期 |
y年,M月,d日 HH:mm:ss
Calendar
为某一时刻和一组日历字段之间的转换提供了一种方法,并为操作日历字段提供了一些方法
Calendar提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化:Calendarr rightNow = Calendar.getInstance();
MONTH的值从0开始
方法名 | 说明 |
---|---|
public int get(int field) | 返回给定日历字段的值 |
public abstract void add(int field, int amount) | 根据日历的规则,将指定的时间量添加或减给定的日历字段 |
public final void set(int year, int month, int date) | s设置当前日历的年月日 |
答案:局部变量不能被static修饰,只能被final修饰
Annotation注解
从jdk1.5之后提出的一个新的开发技术结构,利用annotation可以有效的减少程序配置的代码,可以进行结构化的定义
@Override 准确的覆写
@Deprecated 过期声明
@SuppressWarning 警告压制
Object类
可以解决参数的统一问题
可以接收数组
toString();
equals();
public boolean equals(Object obj) {
if(!(obj instanceof Person)){
return false;
}
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
Person per = (Person) obj;
return this.name.equals(per.name) && this.age == per.age;
}
泛型
为了解决ClassCastException问题,慢慢解决向下转型不安全问题
Object会存在安全隐患,因为Object涵盖的范围太广,运行时不会报错
泛型:类的属性和方法的参数与返回值的类型可以由对象实例化的时候动态决定。
默认的泛型:如果不设置泛型类型会自动定义为Object
注意:
泛型之中只允许设置引用类型,如果现在要操作基本类型必须使用包装类
从jdk1.7后Point<Interger> point = new Point<>(); 后面可以省略
泛型类
泛型类在创建对象的时候没有指定泛型类型,则按照Object类型操作
泛型类不支持基本数据类型
同意泛型类,根据不同的数据类型创建的对象,本质上是同一类型,而逻辑上我们认为不同的。
派生子类
子类也是泛型类,子类和父类的泛型类型要一致
class ChildGeneric<T> extends Generic<T>
子类不是泛型类,父类要明确泛型的数据类型
class CildGeneric extends Generic<String>
类型通配符
- 类型通配符一般是使用"?"代替具体的类型实参
- 所以,类型通配符是类型实参,而不是类型形参
这是一个重要的概念,学习系统类库是会有大量的通配符使用,为了解决引用传递的问题(用通配符可以避免方法改变里面的数据,而允许获取)
? extends 类(Number):设置泛型的上限,及?只能是Number或其子类
? super 类(String) :设置泛型的下限,及?只能是String或其父类
泛型接口
两种处理1.实现类继续使用泛型2.实现类指定接口的类型
泛型方法
泛型方法不一定非要出现在泛型类中
public static <T> T add(T arg){
}
传统的工厂类可能出现工厂类太多
的问题,故使用泛型改进。
及工厂类的方法设置为泛型方法
包project
实际开发之中,所有的类都在包里
包名称要使用小写字母的方式定义
包.* 只会加载需要的,不需要的不回加载(但两个相同的包中可能有相同的类)
静态导入
import java.uitl.MyMath.*;
方法直接定义在主类中一样
UML图形
UML是统一的建模语言,类关系描述
工具:powerDesgner
类图
往往抽象类使用斜体描述在加一个abstract
属性:访问权限 属性名称 :属性类型。 public (+)、protected(#) 、private(-)
时序图
会有一个流程化的描述
用例图
程序的执行分配
单例设计模式
主要是一种控制对象实例化产生的个数
class Singleton{
private Singleton() {
System.out.println("test");
}
private static final Singleton SIN = new Singleton();
public static Singleton getSin() {
return SIN;
}
}
在很多情况下,某些类是不需要重复产生对象的,例如windows的回收站,全部磁盘都共享一个回收站,回收站只有一个。
多例设计模式
class Color{
private String title;
private Color(String color) {
title = color;
}
private static final Color RED = new Color("红色");
private static final Color GREEN = new Color("绿色");
private static final Color BLUE = new Color("蓝色");
public static Color getInstance(String color) {
switch(color) {
case "red":
return RED;
case "green":
return GREEN;
case "blue":
return BLUE;
default:
return null;
}
}
public void getinfo() {
System.out.println(title);
}
枚举enum
用于定义有限个数对象的一种结构(多例设计),枚举属于多例设计,其更加简单,且可以检测的错误多
可以与Switch结合
enum Color1 {
RED,BLUE,YELLOW,GREEN;
}
public class enumDemo {
public static void main(String[] args) {
Color1 c = Color1.RED;
System.out.println(c);
for(Color1 cc: Color1.values()) {
System.out.println(cc);
}
}
}
Enum类
enum本质是一个类继承自Enum类
面试题:
请解释enum与Enum的区别?
enum:是从JDK1.5之后提供的一个关键字,用于定义枚举类
Enum:是一个抽象类,所有使用enum关键字定义的类就默认继承了此类。
枚举结构
基本和类形同,不过可以定义抽象方法,之后在实现(没什么意义)
使用枚举来都确定对象的范围例如性别(男,女)
能看懂就可以