java基础
封装性:权限修饰符。把该隐藏在的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
继承性:
多态性:父类的引用指向子类的对象。(方法:编译看左边,运行看右边。属性:编译运行左边)
重写:父子类之间,子类的方法将覆盖父类的方法。(特殊情况private修饰不构成重写,重写的修饰符不小于父类修饰符。返回值类型,父类void-----子类void,父类Object-------子类可以是Object的子类)
重载:本类,方法名必须相同,参数列表不同,访问修饰符可同可不同。在同一个类中允许一个以上同名方法,参数个数或者类型不同
异常:强转时:ClassCastException. 使用关键字instanceof判断.
#### String字符串
string:字符串,使用一对""引起来表示。
- String声明为final的,不可被继承
- String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
- String内部定义了final char[ ] value用于存储字符串数据
- String:代表不可变的字符序列。简称:不可变性。
#### 多线程:
关于同步方法的总结:
- 同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。
- 非静态的同步方法,同步监视器是: this
静态的同步方法,同步监视器是:当前类本身
#### 异常
1.编译时异常:
IOException
FileNotFoundExceptionl
classNotFoundException
2.运行时异常:
NullPointerException
ArrayIndexOutOfBoundsExceptioni
c1asscastException
NumberFormatExceptioni
InputMismatchExceptioni
ArithmeticException
自动装箱:基本数据类型---->包装类
自动拆箱:包装类----->基本数据类型
基本数据类型、包装类转换String -----------valueof()
String 转换基本数据类型、包装类----------parsexxx(parseInt)
静态代码块: 类的加载而执行只加载一次
非静态代码块:每创建一次对象加载一次
final修饰:可以修饰类,方法,变量,不能被继承
abstract抽象的:一旦类抽象了,不可实例化
#### 集合
- Collection接口:单列数据,定义了存取一组对象的方法的集合
- List:元素有序、可重复的集合:
- Set:元素无序、不可重复的集合
- Map接口:双列数据,保存具有映射关系“key-value对”的集合
##### 集合框架
/ ----colLection接口:单列集合,用来存储一个一个的对象
/ ----List接口:存储有序的、可重复的数据。 -->“动态”数组
/----ArrayList. 线程不安全,效率高。底层使用Object[] elementData数组存储
/----LinkedList. 频繁的插入、删除操作,此类比ArrayList高。底层使用双向链表存储
/----Vector 线程安全,效率低底层使用Object[] elementData数组存储
总结:常用方法
增: add(Object obj)
删: remove (int index) / remove(object obj)改: set(int index, object ele)
查: get(int index)
播: add(int index,object ele)长度: size()
遍历: Iterator迭代器方式
增强for循环
普通的循环
/----Set接口:存储无序的、不可重复的数据-->高中讲的"集合”
l ----HashSet: 主要实现类,线程不安全,可以存储null值, 底层数组+链表
l ----LinkedHashSet:HashSet子类,遍历内部数据时,可以按照添加的的顺序遍历
频繁遍历效率高HashSet
l ---- TreeSet:可以按照添加对象的指定属性,进行排序。
set:存储无序的、不可重复的数据以Hashset为例说明:
1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值
2.不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个.
添加元素的过程:以Hashset为例:
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功。--->情况1
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:
如果hash值不相同,则元素a添加成功。--->情况2
如果hash值相同,进而需要调用元素a所在类的equLas()方法:
equals()返回true,元素α添加失败
equals()返回false,则元素α添加成功。--->情况3
对于添加成功的情况2和情况3而言:元素α与已经存在指定索引位置上数据以链表的方式存储。
jdk 7 ︰元素α放到数组中,指向原来的元素。
jdk 8:原来的元素在数组中,指向元素a
总结:七上八下
/----Map接口:双列集合,用来存储一对(key - value)一对的数据―-->高中函数: y = f(x)
/ ----HashMap:Map主要实现类;线程不安全,效率高;可以存储null的key和value
/ ----LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。
原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前 一个和后一个对于频繁的遍历操作,此类执行效率高于HashMap .
/ ----TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。底层红黑树
/ ----Hashtable:线程安全,效率低;不能存储null的key和value
/ ----Properties:常用来处理配置文件。key和value都是String类型
HashMap的底层:数组+链表(jdk7及之前)
数组+链表+红黑树(jdk 8)
#### I/O
一、流的分类:
1.操作数据单位:字节流、字符流
2.数据的流向:输入流、输出流
3.流的角色:节点流、处理流
二、流的体系结构
抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
Inputstream FileInputStream BufferedInputstream
outputStream FileoutputStream BufferedOutputStream
Reader FiLeReader BufferedReader
writer FiLewriter Bufferedwriter
##### 一、==和equals区别:
###### ==可以使用在基本数据类型变量和引用数据类型变量中
###### 1.基本数据类型中,类型不一定要相同
###### 2.引用数据类型中,比较两个地址值是否相同
###### equals
1. Object类中equals相当于== 比较两个地址值
2. String中equals重写过比较内容是否相同
##### 二、抽象类与接口有哪些异同
都不能实例化
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
##### 三、常见的异常
四、synchronized 和lock异同
相同:都能解决线程安全问题
不同:synchronized机制在执行完同步代码后自动释放同步监视器
lock需要手动启动lock()同时结束同步也需要手动调用unlock()
五、解决线程安全几种方式(同步方法 同步代码块 lock)
六、sleep()和wait()异同
相同点:执行方法都会进入阻塞状态
不同点:两方法声明的位置不同。Thread中声明sleep() Object中声明wait()
调用要求sleep在任何地方调用。wait必须在同步方法同步代码块中调用
sleep不会释放同步监视器,wait释放
七、面试题: ArrayList、 LinkedList. Vector三者的异同?
同:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据
不同:
八、HashMap的底层实现原理?
HashMap的底层:数组+链表(jdk7及之前)
数组+链表+红黑树(jdk 8)
九、HashMap和HashtabLe的异同?
HashMap:Map主要实现类;线程不安全,效率高;可以存储null的key和value
Hashtable:线程安全,效率低;不能存储null的key和value
十、Java 序列化,标记不用序列化的字段
关键字:tranisant修饰