【写在前面】
1. 基本概念
1.1 Java修饰符
-
权限控制符
同包 同包 同包 非同包 非同包 同类 子类 非同类 子类 非同类 public √ √ √ √ √ private √ × × × × protected √ √ √ √ × default √ √ √ × × -
a. public
- 作用对象:类、方法、变量
- 作用范围:公共类,所有的类都可以访问
-
b. private
-
作用对象:类、方法、变量
-
作用范围:私有类,只能被自己类使用
-
-
c. protected
- 作用对象:类、方法、变量
- 作用范围:保护类,只能被自己类、子类和同一包下的其他类使用
-
d. default
- 作用对象:类、方法、变量
- 作用范围:默认类,同包类都可以访问
-
-
状态修饰符
-
a. static
- 作用对象:类、方法、变量
- 作用范围:创建独立于具体对象的域变量或者方法
-
b. final
-
作用对象:类、方法、变量
-
作用范围:通常配合static创建类常量
- 类:不能被继承
- 方法:必须赋初值,只初始化一次
-
-
-
抽象修饰
-
abstract
-
作用对象:类、方法、变量
-
作用范围:
- 类:不能被实例化,方法未具体;因为不能实例化,必须要被继承才能使用;可以没有抽象方法,其余同普通的类
- 方法:只含方法名,不能有方法主体;没有定义,即没有花括号,直接跟封号;一旦类中包含抽象方法,必须声明为抽象类
-
-
1.2 重载与重写
- 重载:方法名相同,但是参数不同,简单理解就是有相同方法名,最好加上@Overload注释
- 重写:只能修改父类方法名的方法内容,参数和返回需要保持一致。final的方法不能被重写,static不能被重写但是能被再次声明。重写的方法能抛出任何非强制性异常,无论被重写的方法是否抛出异常,但重写不能抛出新的强制异常。构造方法不能被重写
1.3 成员变量修饰符
- public 公共访问控制符,可被任何对象访问
- private 私有访问控制符,只允许自己的类方法访问,其他(包括子类)的方法都不能访问
- protected 保护访问控制符 可以被自己的类和子类访问,子类中可以覆盖此变量
- friendly 在同一个包中可以被访问,其他包中的类不能访问
- final 最终修饰符 指定此变量的值不能变
- static静态修饰符 指定被所有对象共享,即所有实例都可以使用该变量,变量属于这个类
- transient 过度修饰符 指定该变量是系统保留hai,暂无特别作用的临时性变量
- volatile 易失修饰符 指定该变量可以同时被几个线程控制和修改
1.4 方法修饰符
- public
- private 只有自己能访问
- protected 只有它的类和子类能访问
- final 不能被重载
- static 不需要实例化就可以激活
- synchronize 同步修饰符 多线程中,用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁
- native,本地修饰符,指定此方法的方法体是用于其他语言在程序外部编写的。
1.5 接口和抽象类
接口:所有方法都是抽象的,会被隐性的指定为public static final。类可以实现多个接口,实现时必须实现所有方法。变量默认是final,成员函数默认都是public,不可以被实例化。
抽象类:是为继承而实现的,所以修饰符是public或者protected。可以同时包涵抽象和非抽象方法。类只能继承一个抽象类。实现的类为抽象类时可以不实现所有的方法,否则必须实现抽象方法。可以在不提供接口方法实现情况下实现接口。可以包含final变量,成员函数可以是private,proteted,public。不可以被实例化,但是如果包含main可以被调用。其他同普通的类
1.6 java对象POJO和JavaBean
POJO:简单来讲,就是普通的java对象,主要指没有对象模型,或者框架对象。一般都是有private变量作为对象属性,每个参数都有get和set方法,没有继承、实现的java对象,例子如下:
public class User {
private String userName;
private Integer uid;
public String getUserName() {
return orderId;
}
public void setUserName(String userName) {
this.orderId = orderId;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}}
JavaBean:可重用组件,符合一定的规范,这些规范使得该对象能被其他人或者框架使用,规范如下:
- 属性必须为private
- 类必须有个缺省构造函数,即有个无参数的构造器
- 类属性由getter和setter访问
- 类可序列化。实现serializable接口
ps:序列化指的是将一个对象信息转化为一个可存储、传输格式的过程,反序列化则是相反过程。因此,实现了serializable接口的类就是支持序列化和反序列化的。
引申:为什么要实现序列化?什么时候该实现序列化呢?
- 为什么要实现序列化?
- 实现序列化可以实现持久化,比如当一个程序中断但是我希望在下次开启时继续使用里面的一些参数,此事利用序列化和反序列化就可以达到目的。
- 什么时候该实现序列化呢?
- 当想把状态存到文件或者数据库的时候
- 需要网络套接字传输对象的时候
- 需要RMI传输对象的时候(RMI是让客户端java虚拟机对象“像本地调用一样”调用有服务器java虚拟机对象方法,暂时不多细究)
例子如下:
public class UserInfo implements java.io.Serializable{
//实现serializable接口。
private static final long serialVersionUID = 1L;
private String name;
private int age;
//无参构造器
public UserInfo() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//javabean当中可以有其它的方法
public void userInfoPrint(){
System.out.println("");
} }
两者区别:
- 相同:两者的数据获取方式是一致的。
- 不同:POJO更倾向于简单对象的实现,不包含业务逻辑,只作为一个数据的载体。JavaBean常会封装一些简单的业务逻辑,可以有属性获取之外的其他的方法。
2.集合Collection
2.1集合collection总览
精简后:
再次精简:
colletion继承自Iterable,有iterator的方法。iterable是个借接口,它有iterator 方法,返回的是iterable对象。Iterator 也是个接口,只有三个方法,
- hasnext()
- next)
- remove()
但是Collection没有对应的实现方法,于是找到ArrayList,在ArrayList中以内部类的方式实现。Iterrator实际就是在遍历集合,所以遍历都可以使用Iterator。
2.2各类介绍
-
List集合的特点就是:有序(存储顺序和取出顺序一致),可重复
-
a. ArrayList:底层数据结构是数组。线程不安全。数组无论插入还是删除都要移动后面的元素,如果较长的数组不适合用这个。本质就是一个扩容的数组,所以可动态增长。追求非同步的时候用来代替Vector。想同步时,可以使用Collections的方法:List list = Collections.synchronizedList(new ArrayList(...));
- i. ArrayList是基于动态数组实现的,在增删时候,需要数组的拷贝复制。
- ii. ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍
- iii. 删除元素时不会减少容量,若希望减少容量则调用trimToSize()
- iv. 它不是线程安全的。它能存放null值。
-
b. LinkedList:底层数据结构是链表(双向链表)。线程不安全。解决了数组移动的问题,在存放位置上存储对象引用,但链表的将每个对象放在独立节点中,而且是双向链接(对上一个和下一个的引用),更新时只是更新了引用前后位置的链接。
- i. LinkedList实现了Deque接口,操作LinkedList像操作队列和栈一样
-
c. Vector:底层数据结构是数组。线程安全。现在已少用,被ArrayList替代
- i. Vector所有方法都是同步,有性能损失。
- ii. Vector初始length是10 超过length时 以100%比率增长,相比于ArrayList
-
d. 总的来说:查询多用ArrayList,增删多用LinkedList。
-
ArrayList增删慢不是绝对font>的(在数量大的情况下,已测试):
- 如果增加元素一直是使用add()(增加到末尾)的话,那是ArrayList要快
- 一直删除末尾的元素也是ArrayList要快【不用复制移动位置】
- 至于如果删除的是中间的位置的话(随机访问的话,LinkedList还是要遍历数组,遍历过程还是慢),看情况,如果在前端插入,LinkedList快!
-
但一般来说:增删多还是用LinkedList,因为上面的情况是极端的~
-
-
-
Set集合的特点是:无序,元素不可重复
-
a. HashSet集合:底层数据结构是哈希表(是一个元素为链表的数组)
-
b. TreeSet集合
- i. A:底层数据结构是红黑树(是一个自平衡的二叉树)
- ii. B:保证元素的排序方式
-
c. LinkedHashSet集合:底层数据结构由哈希表和链表组成。
-
-
Set集合的特点是:元素不可重复
ArrayList:可以动态增长和缩减的索引系列
LinkedList:可以在任何位置进行搞笑的插入和删除操作的有序序列
ArrayQueque:
3.集合Map
3.1各类介绍
常用的类:
Todo
Map常用的方法:
-
添加:
- void map.put(key,value)添加元素,如果键是第一次存储,就直接存储元素,否则替换
-
删除:
- void clear():移除所有的键值队
- void remove(object key):根据键来移除元素
-
判断:
- boolean containsKey(object key):判断集合是否包含指定的键
- boolean containsValue(object value):判断是否包含指定的值
- boolean isEmpty():判断集合是否为空
-
获取:
- Set<Map.Entry<Key, value> entrySet():返回的是键值对象的集合
- voud get(object key):根据键值获取值
- Set
ketSet():获取集合所有的键的集合 - Collection
values():获取集合中所有值得集合
-
长度
- int size():返回集合中键值对的对数
3.集合Map
3.2 HashMap
-
介绍:
- a. HashMap可以存储null;
- b. 除了允许为null和同步之外,和hashtable没什么区别
- c. 不保证有序
- d. 初始量太高或者装载因子太低都对遍历不好
- f. 当初始量*装载因子
4.Session和Cookie
4.1Cookie
Cookie的流程:浏览器访问服务器,如果服务器需要记录用户信息,就使用responce向浏览器发送一个cookie,浏览器就会把cookie保存起来。再次请求的时候会把cookie一起交给服务器。
cookieAPI
- cookie类用于创建预估cookie对象
- response接口中定义了一个addCookie方法,它用于在其响应头中增加getCookie方法,它用于获取客户端提交的cookie
- request接口定义了getCookie的方法,它用于获取客户端提交的Cookie
常用Cookie方法
- public Cookie(String name,String value)
- setValue,getValue
- setMaxAge,getMaxAge
- setPath,getPath
- setDomain,getDomain
- getName
5.异常
5.1为什么有些方法要求抛出异常有些不需要?
会提示抛出异常错误是因为有些方法的类抛出了异常,所以要求使用时必须处理
6. IO流
6.1 IO流概念
IO流可简单理解为文件读取和输入所进行的数据传输。
根据数据类型分类,以字节流为优先,因为所有文件都是字节流保存或传输,且字符只在内存形成:
-
字节流
- a. 以字节为单位
- b. 处理所有的数据类型
- c. 不用缓冲区
-
字符流
- a. 以字符为单位
- b. 只处理字符数据类型
- c. 需要缓冲区
根据流向类型分类:
- 输入流:只读操作
- 输出流:只写操作
6.2 IO流
to be done