JavaSE梳理

JavaSE梳理

一、数据结构
二、结构(流程控制语句)
三、运算
四、变量
五、API使用
一、数据结构
1.基本类型

声明变量的时候,不能超出数据类型表示范围

如果从大到小,强制转换
数据类型 小变量 = (数据类型)大变量
可能发生溢出

int 向byte、short、char转换的时候,在其范围内会隐式转换

隐式转换
小到大
数值型:
整数型 (默认值:0) byte、short、int、long(加后缀L)
小数型、浮点型 (默认值:0.0) float(加后缀F)、double
字符型 char(默认值:’\u0000’)
布尔型 boolean(默认值:false)

2.引用类型

1.类 class
2.接口
public interface IXxx{
全局常量;
抽象方法;//实现类重写 默认省略abstract
default方法//实现类对象调用
static方法//接口名调用
}

实现类语法:
public class XxxImpl implements IXxx{
重写全部抽象方法
}
3.抽象类
public abstract class AbstractXxx{
实例变量
类变量
构造方法
实例方法
类方法
抽象方法(强制子类根据业务重写)
}

一般业务基类用抽象类,其他扩展功能用接口
4.枚举
enum 简化全局常量
适用于一些取值比较固定的场景
例如“Vip、状态等

public enum Xxx{
字段1(…),
字段2(…),
字段3(…);

private final 实例变量;

private Xxx(...){}

}
5.数组 数据类型[]
1. 声明
1. 静态创建: 数据类型[] 数组名 = {值1,值2。。。}
2. 动态创建: 数据类型[] 数组名 = new 数据类型[长度];
3. 知道具体的值用静态,不知道静态的值用动态创建
2. 赋值
1. 静态创建的时候,直接赋值
2. 数组名[索引] = 值;
3. 取值 数组名[索引];
4. 遍历
for循环,操作具体元素。

增强for循环 不操作具体某一个元素用增强for
for(元素类型 变量 : 数组/集合){
变量
}

二、结构(流程控制语句)
1. 条件语句

从上到下开始匹配,一旦匹配上一个后,整个条件语句就结束了。

取值比较固定的情况用switch,如:VIP、状态、星期、、、

其他情况一律用if

1. 单条件
2. 双条件
3. 多条件 
if () {

}else if(){

}else
4. switch
支持的数据类型:
int/short/byte/ String、char
枚举

匹配从case优先匹配,从上到下匹配,如果匹配上了,找最近的break

如果case匹配不上,匹配default

适用于取值固定的场景

2. 循环语句

不知道循环次数用while

知道循环次数,且要操作某一个元素用for

如果只是遍历,用foreach

需要上来先做一次,用 do while
1. while 先判断在循环
2. do while 先干一次,再判断,再循环
预执行一次的: 打灰机。。。
3. for(){}
for(1.初始化条件;2. 条件判断; 4. 循环控制){
3. 循环体
}
执行流程:
第1次: 1 => 2 => 3 => 4
第2次: 2 => 3 => 4
第3次: 2 => 3 => 4

forfor
执行流程:
外层循环执行一次,内层执行了所有次外层行数,内层是行中列数,一般最多3层
4. foreach
for(元素数据类型 变量 : 数组/集合){
变量//获取每一次的元素
}

3. 循环控制语句
 1. break 结束当前层循环锚点,可以一次跳出多层循环,很少用
 2. continue 跳过当前次循环,继续下一次循环
 3. return 结束当前方法
三、运算
1.算术运算
+ 、- 、*、 / 、%不能模0,除后的余数,一般用来判断一个数的倍数
2. 赋值运算

+=、-=、*=、/=、%=
有强制转换功能,直到当前的数据类型能够装下为止,否则会一直以二进制的方式进位,可以屏蔽提升运算的数据类型。

3. 比较运算

、<、>=、<=、==:
1.比较基本类型,是比较的值是否相等
2.比较引用类型,是比较的堆中的地址是否相等
!=:
比较引用类型
if(变量/值 instanceof 引用数据类型){ 避免ClassCastException

}
一般用在多态中的父类向子类转换时候的判断

equals()

4. 逻辑运算

! : 非真即假,非假即真
&&:表示并且,有短路功能,逻辑运算效率高,没有位运算功能
&:表示并且,没有短路功能,逻辑运算效率低,有位运算功能
有假即假

5. 三目运算

x ? y : z;
x:布尔类型、布尔表达式
如果x是真,执行y,如果是假,执行z
如果想要接受结果值。y和z必须是相同的类型

6. 位运算(了解)

~n:取反
公式: -(n+1)
&、|
^ : 交换两个变量的值
位运算 >>>
m >> n : m /2^n
m<<n : m * 2^n

四、变量
1.局部变量

定义在方法中(形参){方法体}
代码块中
方法执行完毕结束
声明位置下方,局部范围 }结束

2.成员变量(字段)

直接定义在类中的,整个类中
1. 实例变量
非static修饰的成员变量 :实例变量
对象名.实例变量

生命周期:
从new 开始,失去引用的时候
2. 类变量
static修饰的成员变量,类名.类变量

五、API使用(常用类)
1. 数值相关类
1. 8个包装类
自动拆箱和自动装箱:必须是对应的类型
享元模式:
Byte/Short/Integer/Long
-128~127
2. 数学相关
	1. Math
	2. BigInteger
	3. BigDecimal
	一般用在金融相关行业。
	建议用String创建对象
	除法有可能溢出,用重载方法
	divide
2. 字符串相关类
  1. 字符串拼接效率最高
    StringBuilder > StringBuffer > +

  2. 转换为String类型效率最高
    toString() > String.valueOf() > +

  3. 安全
    StringBuffer

matches()
split()
replaceAll()
replaceFirst()

正则表达式是字符串匹配原则
Pattern
Matcher

使用场景:
如果是单线程和多线程没有线程安全要求,经常增删改插, 用StringBuilder。

如果是多线程有线程安全要求,经常增删改插, 用StringBuffer

如果不经常操作字符串用 String节省空间
1. String
2. StringBuffer
3. StringBuilder
StringBuffer和StringBuilder默认16,扩容*2+2

3. 日期相关类
1. Date 特定某一刻时间
	1 LocalDate
	2. LocalDateTime
	3. ZonedDateTime:时区日期时间
	4. LocalTime:本地时间
2. Calendar日历
适用于操作时间,时间比较,时间段
通过静态方法获取对象,然后调用方法
	get(Calendar.字段)
	set(Calendar.字段,值)
3. SimpleDateFormat 
将字符串和Date相互转换
format
parse
4. 工具类
1. System
	1. arraycopy(....)
	2. currentTimeMillis() 测试程序运行时间
2. 获取随机数  验证码
	1.ThreadLocalRandom
	nextInt()
	nextBoolean()
	2.UUID 用在数据库主键
5. 异常类
1. try - catch -finally
	1. 尽量细化异常处理,不同的异常处理方式不同。
	2. 子类异常必须在父类异常上面。

	打印到控制台
	保存到一个日志文件 Scanner(自己看看)log4j
	获取异常信息
2. throws 
	throws在()后 {}前,顺序无所谓

	在方法中
	throw new 异常对象();
3. 自定义异常
	XxxException extends Exception{

	序列化号(自动生成)
	有String参和无参构造
	}
6. 线程
1. 创建线程2中方式
	1. 继续Thread类。重写run方法
	2. 实现Runnable接口,重写run方法,并且将Runnable子类对象作为参数,传入Thread对象
2. 线程同步
1. 同步对象必须是被共享的
	一般有:
		当前类.class
		this
2. 同步范围:最小原则
	1. 同步代码块
	synchronized(同步对象){

	}
	2. 同步方法
	方法如果是static是,同步当前类的字节码文件
	非static就是同步this
	synchronized
	3. ReentrantLock
	try{
	lock.lock();
	}finally{
	lock.unlock();
	释放锁
	}
3. 线程池
4 死锁
5. 线程通信
7. 数据结构
  1. List 有序可重复集合
    遍历:
    1.foreach
    2.单向迭代器
    iterator()
    hashNext
    next
    3.双向迭代器:
    listIterator()
    hashNext()
    next()
    hashprevious()
    previous()
    4.for 和get()、size()
    在用迭代器遍历集合元素的时候,需要不要用集合自己的方法增删改查元素,只能用迭代器自己的方法
    1.ArrayList 基于Object数组,适用于查改
    2.LinkedList基于双向链表,适用于增删插
    3.Vector 线程安全的ArrayList
    2.Set
    无序不可重复

    建议用HashSet,效率高
    有排序需求,用TreeSet

    有存入和取出顺序要求用LinkedHashSet

遍历:
1. foreach

2. 单向迭代器
iterator()
	hashNext
	next
		HashSet
		基于HashMap,基于HashCode()

判断重复机制:
1. 先判断hashCode
2. 再判断equals
TreeSet
基于TreeMap,基于红黑树(特殊的二叉树,平衡机制。左旋、右旋,左小右大,遍历树,一般用递归和循环)
判断重复机制:
1.自然排序:元素实现Comparable接口,
重写compareTo
2. 定制排序:创建TreeSet对象,传入一个比较器实现类对象,重写 compare
返回值正数 升序
返回值负数 降序
返回值0 重复元素
LinkedHashSet 是一个有序HashSet,可以保证存入和取出顺序。
如果是保存重复的元素用List下
如果增删插多,用LinkedList
如果查改多,用ArrayList
如果要线程安全,用Vector
如果是不能重复的元素用Set下,
一般建议用HashSet
有排序需求用TreeSet
如果有顺序要求,且不许重复,用LinkedHashSet
3. Map
1.HashMap
基于HashCode,底层是键值对数组+单向链表+红黑树。
如果key的hash值和equals都相等,意味着是相同的key,覆盖。当hashCode值%长度相等的时候,就发生了哈希碰撞,继续equals比较。如果equals不相等,会形成链表,当链表 >=8个就,优化为红黑树
put
当>=6 重新退为单向链表

通过合理的扩容
每一次扩容都会重新计算hashCode值,计算下标

默认是16个长度,0.75加载因子
扩容机制:长度*1.5

基于数组、链表、红黑树
2. TreeMap
判断key是否重复:
跟HashSet相同
3. Hashtable 线程安全 的HashMap
Properties 建议用当前线程的类加载器获取,避免JavaWeb获取不到流的情况
1.通过当前类字节码文件
当前类.class.getResourceAsStream("/路径
")
2.通过当前类类加载器
ClassLoader classLoader = 当前类.class.getClassLoader();

classLoader.getResourceAsStream("路径
")
3.通过线程的类加载器
ClassLoader classLoader = Thread.currentThread()…getContextClassLoader();

classLoader.getResourceAsStream("路径
")
5. LinkedHashMap 可以保证存入和取出顺序的
6. ConcurrentHashMap 线程安全,且效率高Hashtable
4. 泛型
1. 泛型类 类名后<数据类型>
2. 泛型方法 方法上返回值前加上<数据类型>
3. 上限和下限 super 下限,最小取到
extend上限,最大取到
4. 嵌套

8. 流

1.File文件、文件夹类
获取下一级子文件夹、子文件
1. list()
2. listFiles()
3. list(FilenameFilter filter)
4. listFiles(FilenameFilter filter)
5. listFiles(FileFilter filter)
递归
就是在方法内部调用自己的方法
1. 必须有出口(条件判断)
2. 数值带入,找规律
3. 将已知条件写出来,在条件判断中,用已知条件表示未知(递归调用)
2. IO
JDK7关闭流新方式
try(
创建流
){
可能有异常的代码
}catch(){

}

工具类、工具方法,封装
1. 字节流 适用于所有非文本相关的文件读取和写出
1. OutputStream FileOutputStream
2. InputStream FileInputStream
2. 字符流 只适用于所有文本数据相关的读取和写出
必须在flush()或者close()方法后,才能真正的将数据写到硬盘文件

乱码:
字符和字节相互转换出现
1. 统一字符集的字符流处理文本文件
2. 处理文本数据用字符流
Reader FileReader
Writer FileWriter
3. 转换流 适用于将给定的字节流,包装为一个字符流,更好的处理文本文件
可以设置字符集
InputStreamReader
OutputStreamWriter
4. 缓冲流
5. 随机文件访问类RandomAccessFile seek()
getPoiter()
setLength()


6. 对象流 将对象保存到硬盘 序列化
将硬盘中的对象还原到内存中 反序列化
Serializable

对象必须是实现该Serializable接口的
Retrent

9. 反射 私有化成员执行要破坏封装

静态成员执行,传入的null
1. 获取字节码
1. 获取字段
1. 给字段赋值
2.字段取值
2.获取构造方法 创建对象
3.获取普通方法 执行方法

10 . 注解

1.四大元注解
1.@Target
2.@Retention
3.@Documented
4.@Inherited
2. 自定义注解
3. 在注解中声明 属性
语法:、
数据类型 属性名() [default 值]
1.支持的数据类型
1.String
2. 8个基本类型
3. 枚举类
4. 数组
3. 使用注解 如果属性名是value可以省略,即,可以直接写值
1.@注解名(属性名=值)
2.@注解名(属性名={值1,值2…})

11. jdk8新特性

1.lambda
2…lambda中方法引用
3.Stream流方法

12. 测试封装工具

1.单元测试 @Test
2.jar导入、导出

13. 设计模式

1.单例模式
1. 饿汉模式
2. 懒汉模式
3.枚举
2.简单工厂模式
3. 适配器模式
4. 装饰者模式
5.观察者模式
6.工厂模式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值