java基础
2022-03-28 18:55:13 4 举报
AI智能生成
登录查看完整内容
java基础
作者其他创作
大纲/内容
J2ME:mobile
J2SE:swing,桌面
J2EE:web
java分类
继承
封装
多态
面向对象三大特性
byte & Byte
char & Character
short & Short
int & Integer
long & Long
float & Float
double & Double
boolean & Boolean
基本数据类型 & 包装
String
一维
二维
数组
引用类型
类变量(static修饰)
全局/成员变量
非形参局部变量必须自己初始化
局部/临时变量
注:局部变量优先级最高,其它跟局部同名都以局部的为准,但可以用 this来调全局的
作用域
隐式转换:位数小的自动转为位数大的
强制转换
数据类型转换
public
protected
private
default
访问权限
变量 & 访问
+、-、*、/、%、++、--
算术
==、!=、>、<
关系
&&、| |、!
逻辑
&、|、^、~、<<、>>、>>>
位
=、+=、-=、/=、(%)=、<<=、>>=、&=、^=、|=
赋值
? : 、instanceof
条件
运算符
if-else
for & break & continue
while/do-while
switch-case
流程控制
位运算
运算
简介:隐藏信息和实现细节
简介:子类继承父类,使其拥有父类的实例域与方法
继承 & 接口
简介:子类重写父类的方法(需子类有权限访问)
规则:方法名、返回值、形参个数/类型/顺序都不能变,抛出异常也不能比父类大,但访问权限却不能比父类小
重写
简介:同个类相同方法名但参数列表不同
规则:跟返回值无关,形参个数/类型/顺序不同
重载
重写 & 重载
简介:同一个接口,使用不同的实例而执行不同操作
父类指向子类对象
关键思想
序列化:对象转成字节序列的过程
反序列化:字节序列转成对象的过程
概念
Serializable & SerializableID
ObjectOutputStream & ObjectInputStream
Transient:阻止序列化该字段
注:序列化不保存静态变量
序列化 & 反序列化 Serializable
实现 Cloneable接口并覆盖 clone()方法,对象o1.clone()
只克隆第一层
浅拷贝
手动复制所有层
序列化实现
fastjson转换
深拷贝
程度
克隆 Clone
1、比较的对象实现Comparable接口,重写 compareTo(T o) 方法 ,这是对象自己调用别人进行比较
两种实现
比较/排序
自反
对称
传递
一致
重写 equals规则
相等
依托 Object
NullPointException
ArrayIndexOutOfBoundsException
RuntimeException
IOException
SQLException
ClassNotFoundException
......
CheckedException
Exception
Error
throwable
代码中捕获
try & catch & finally
代码中手动丢出异常
throw
用在方法上,声明将抛出异常
throws
处理
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException (下标越界异常)
NullPointerException (空指针异常)
常见异常
异常
1、子类不可抛出比父类更大的异常(比如父类抛 RuntimeException, 子类不能抛 Exception)
2、子类不能抛出比父类更多不同分类的异常(比如 RuntimeException 和 IOException就属于两大类),但似乎 RuntimeException不受限于这个,就是父类抛 IOException,子类还是可以抛 RuntimeException及下级的,不过父类抛 RuntimeException ,则子类容不得 IOException 及以下的
注:
异常 & 日志 & 断言 & 调试
构造器
静态代码块:类中static修饰
构造代码块:类中
普通代码块:方法中
代码块
1、执行父类的静态代码块,并初始化父类静态成员变量
2、执行子类的静态代码块,并初始化子类静态成员变量
3、执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
4、执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量
注:静态代码块/变量>构造代码块>构造函数>普通成员变量,越顶层父类越快初始化
初始化顺序
枚举类 Enum
静态内部类
成员内部类
局部内部类(方法中)
类型
非静态内部类可以访问外部所有成员变量(包括private)
外部访问内部则需要通过内部类对象(静态属性除外)
局部内部类访问外部的局部变量,则变量得是 final
特点
内部类
@Target:注解修饰的范围,从包到方法到参数
@Retention:保留时间,SOURCE、CLASS、RUNTIME
@Documented
@Inherited:表示注解对被标注的类的子类起效
元注解
@Override
@Deprecated
@SuppressWarnings
标准注解
自定义注解
<target>.getAnnotation(Class<T> annotationClass) :返回指定类型的注解,基于反射中的句柄(如 field.getAnnotation(Excel.class))
<target>.getDeclaredAnnotations() :返回元素上的所有注解
<target>.isAnnotationPresent(Class<? extends Annotation> annotationClass):判断是否存在注解
反射获取注解
注解
泛型类
泛型方法
位置
<E>
<T>
<? extends T>:表示它是 T的子类
<? super T>:表示它是 T的父类
<?>
??????泛型
结构 & 特殊类 & 注解
基本
该变量值不可变
变量
该方法不可被重写
方法
不可被继承
类
final
作用域是类级别的,内存只有一份
同变量,且在方法中不可使用非静态的变量和方法;另外不能用 this和super(因为不是对象的)
注:内部类的方法则不行
static
不能被new,只能被继承
不需要实现即不需要方法体,等着被重写
注:抽象方法需要在抽象类中,但抽象类可以有普通方法;与 final & static & private 都不能共用
abstract
interface
构造方法才能 super() 父类的构造方法,且必须放第一行
构造方法
super.XX() 父类的普通方法/变量
其它方法/变量
super
构造方法才能 this() 构造方法,且必须放第一行
this.XX() 其它方法/变量(父类和自己)
this
String(java7)
switch
volatile
synchronized
toString()
重写equals()方法必须重写hashCode()
equal()
hashCode()
clone()
getClass()
Object
package & import
关键字
子主题
实践
FileInputStream
FileOutputStream
字节
FileReader
FileWriter
字符
File
InputStream
OutputStream
普通
BufferedInputStream
BufferedOutputStream
缓冲
字节流
Reader
Writer
BufferedReader
BufferedWriter
字符流
InputStreamReader
OutputStreamWriter
转换流
ObjectInputStream
ObjectOutputStream
对象流
PrintWriter
PrintStream
打印流
注:缓冲、转换、对象流、打印流 其实都得基于字节/字符流 之上
IO流
IO
底层用数组,有序、可重复
查快,增删慢
线程不安全
ArrayList
底层用双向链表,有序、可重复
查慢,增删快
LinkedList
线程安全,效率低
Vector
List
底层用hash表,其实是 HashMap,无序、不可重复
存取都快
HashSet
底层用二叉树/红黑树,按比较器规则排序、不可重复
排序存储
TreeSet
链表,按插入顺序排序
LinkedHashSet
Set
Queue
Collection
底层是 hash表,key不可重复
key、value都可为null
HashMap
底层 hash表,key不可重复
线程安全,效率低,因为方法都有 synchronized
key、value都不可为null
Hashtable
底层二叉树,key可重复
TreeMap
Map
CopyOnWriteArrayList
CopyOnWriteArraySet
LinkedBlockingQueue
ArrayBlockingQueue
BlockingQueue
ConcurrentLinkedQueue
ConcurrentHashMap
concurrent
备
集合
简介:在运行期获取类的所有构造器、属性和方法,并能对其进行操作
a.getClass()
<ClassName>.class
Class.forName(\"<ClassPath>\")
<clazz>.newInstance():实例化对象
注:它是构造函数、字段、方法获取的句柄
获取Class
getConstructors():获取 public的构造器列表
getDeclaredConstructors():获取所有的构造器列表
getConstructor(Class<?>... parameterTypes):获取 public的指定构造器,传入参数类型如 String.class
getDeclaredConstructor(Class<?>... parameterTypes):获取指定构造器(不限制public),传入参数类型如 String.class
<constructor>.newInstance(Object... initargs ):根据某一构造器实例化对象
构造函数
getFields():获取 public的字段列表
getDeclaredFields():获取所有的字段列表
getField(String name):获取 public的指定字段,传入字段名称如 age
getDeclaredField(String name):获取指定字段(不限制public),传入字段名称如 age
字段
getMethods():获取 public的方法列表
getDeclaredMethods():获取所有的方法列表
new Object()
class.newInstance() / constructor.newInstance()
object.clone()
Serializable 对象(ObjectInputStream)
创建对象多种方式
反射
看 并发编程 栏目
多线程 & 并发
Socket
ServerSocket
TCP
DatagramSocket
DataGramPacket
UDP
网络编程
正则表达式
静态/动态代理
切面
API & SPI
一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,@FunctionalInterface
函数式接口
(parameters) ->{ statements; }需满足函数式接口才可以
Lambda 表达式
filter 方法用于通过设置的条件过滤出元素
.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
limit 方法用于获取指定数量的流,'forEach' 来迭代流中的每个数据
new Random().ints().limit(10).forEach(System.out::println);
map 方法用于映射每个元素到对应的结果
.stream().map( i -> i*i).distinct().collect(Collectors.toList());
sorted 方法用于对流进行排序
new Random().ints().limit(10).sorted().forEach(System.out::println);
Stream API
方法引用
接口默认方法
LocalDate date1 = currentTime.toLocalDate();
LocalDateTime currentTime = LocalDateTime.now();
ZonedDateTime date1 = ZonedDateTime.parse(\"2015-12-03T10:15:30+05:30[Asia/Shanghai]\");
新日期时间 API
Optional.ofNullable(value):允许传递为 null 参数
Optional.of(value):如果传递的参数是 null,抛出异常 NullPointerException
.isPresent():判断值是否存在
.orElse(value):如果值存在,返回它,否则返回默认值
.get():获取值,值需要存在
Optional 类
Java 8 新特性
Java 9 新特性
进阶
Number & Math
String & StringBuffer & StringBuilder
Date & Calendar
System & Scanner
Arrays & Collections
SimpleDateFormat
常用类
集合都是怎么实现的,比如 hashmap?
对象和类?
抽象类有
接口没有
抽象类可有普通方法和抽象方法
接口只能是抽象方法(java8已经可以有default方法)
成员方法
抽象类可有普通变量和final变量
接口都是 final变量
成员变量
抽象类适合所有子类都要做的场景
接口适合部分子类要完成
使用场景
abstract & interface?
值传递 & 引用传递?
finally语句在return执行之后,return返回之前执行;try语句中有System.exit(),finally不会执行
finally & return?
进制转换?
final、finally、finalize?
Object 默认 hashcode是根据内存地址计算,不会相同,但是如果自己重写则可能相同
对象相等 hashcode一样;hashcode一样,对象不一定相等(java定的规则)
散列表同时运用了数组和链表,重写hashcode方法为了将数据存入Java集合类时进行比较,集合先根据 hashcode方法判断,如果不同就认为不等,若相同再判断 equals,不同则认为不等(1、先判断 hashcode是为了效率快。2、如果只重写 equals不重写 hashcode,则可能出现内容相同但判断了 hashcode不同,结果都能放到 hashset里面,就不符合 set的规则)
https://blog.csdn.net/javazejian/article/details/51348320
重写 equals()方法时,为什么必须重写 hashcode()?
hashcode 就应遇而生了,java 就采用了 hash 表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的 hashcode 地址上是否有值,那么就用equals 比较,如果没有则直接插入,这样就大大减少了 equals 的使用次数,执行效率就大大提高了
Set如何实现不重复?
每次都要经过 ClassLoader,并且它在反序列中是热加载
java序列化为什么慢?
关键问题
java基础
0 条评论
回复 删除
下一页