JavaSE
1.java三大版本:
javaSE,javaME,javaEE
2.JDK,JRE,JVM![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/ddc14b8fe74add6158b15c7f08e6bdc4.png)
JDK(开发者工具)>JRE(运行时环境)>JVM(虚拟机)
数据类型
- 基本类型
Byte,short,int,long,float,double,char,boolean
- 引用类型
类,接口,数组
i++和++i的区别
a++: ++在后,先使用,后+1赋值
++a: ++在前,先+1赋值,后使用
类型转换
- 自动转换 容量低–>高:
byte,shoat,char,int,long,float,double
- 强制转换 变量名 高–低
int i = 128;
byte b = (byte)i; //强制转换 内存溢出 -128~127
double d =i; //自动转换
break和continue的区别
- break可用在任何循环的主体部分,由于强行退出循环,也可以用在switch语句。 跳出switch语句。
- continue用于循环语句中,终止某次循环过程,跳过剩余语句,之间进行下一次循环条件判断。
方法重载和方法覆盖(重写)的区别
重载是在一个类中,有相同的方法名,参数列表不同的方法。 方法重载的规则:
- 方法名称必须相同
- 参数列表必须不同(个数、参数类型、或排序不同)
- 返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以成为方法的重载
覆盖(重写)
- 重写:子类的方法必须与父类方法必须一致,方法体不同。
- 重写是方法的重写,与属性无关
- 重写方法只与非静态方法有关,与静态方法无关(静态方法不能被重写)
注意点
1.方法名、参数列表必须相同
2.修饰符范围可以扩大,不能缩小(public>protect>private)
3.抛出的异常 范围可以被缩小,不能扩大
4.被**static(属于类,不属于实例),final(常量方法),private(私有)**修饰的方法不能重写
类
Arrays类
数组的工具类java.util.Arrays
常用功能
- 给数组赋值:fill方法。
- 排序:sort方法,升序。
- 比较数组:equals方法比较数组中元素值是否相等。
- 查找数组元素:binarySearch对排序好的数组进行二分查找法操作。
- 打印数组元素:Arrays.toString(数组名);
Object内部类
Object 类是java.lang包的一个类,是java所有类的父类(根类)。直接父类或间接类型
- 获取 引用中存储的对象 的实际类型。getClass()方法
- 获取 对象的哈希码值 int hashCode()方法
- 返回 对象的字符串形式 String toString()
- 在对象垃圾回收时,由JVM的垃圾回收器自动调用,进行垃圾回收相关工作。void finalize()
- 用于 比较2个对象的内容 是否相同 boolean equals(Object obj)
==和.equals的区别
1> == 判断相等
A. 比较2个基本类型的数据,比较值是否相同;
B. 比较2个引用类型的数据,比较(对象的首)地址是否相同。
开发中的应用:比较2个引用 是否指向 同一个对象。
2> equals方法 判断内容相等
只能比较2个引用类型的数据, 比较 内容 是否相同。
集合
常用集合的分类
Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap
Collection集合
List和Set集合详解
list和set的区别
List:
- 有序、有下标、元素允许重复
- 实现类:ArrayList:底层数据结构是
数组
,查询快,增删慢,线程不安全,效率高,可以存储重复元素Set:
- 无序、无下标、元素不允许重复
- 实现类: HashSet
Map集合
- Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value
- 键key – 唯一、无序无下标
- 值value – 可以重复、无序无下标
实现类:HashMap非线程安全
list,set,map的区别
list 有序,可重复
set 无序,不可重
键值对,键唯一,值不唯一,键不能重复,值可以重复
面向对象(OOP)
三大特性
封装 程序设计追求“高内聚,低耦合” 属性私有Private
继承 (extends ) java中只有单继承
多态
注意点:
1.多态是方法的多态,没有属性的多态
2.父类和子类,有联系 类型转换异常: ClassCastException
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象!
super & this的区别
- super()调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或构造方法中
- super()和this()不能同时调用构造方法,因为this也必须写在第一行
super与this的区别:super代表父类对象的引用,只能在继承条件下使用;this调用自身对象,没有继承也可以使用。
instanceof运算符
语法: 引用名 instanceof 类名9
功能: 判断前面引用指向的实际对象 是否是 后面的类(一种/个 is a ),是结果为true,否则结果是false。
三个修饰符
访问修饰符:private 默认 protected public
修饰符: abstract static final
注意:以上修饰符在一起使用时,没有先后顺序。
abstract 抽象的 可以修饰类和方法
static 静态的 可以修饰属性、成员方法和代码块
final 最终的 可以修饰 变量、成员方法和类
抽象类(abstract)
- abstract修饰的类就是抽象类,修饰的方法就是抽象方法。
- 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类。
- 抽象类不能使用new来创建对象,它是用来让子类继承的。
- 抽象方法只有方法的声明,没有实现,让其子类实现。
- 子类继承抽象类,必须实现抽象类的所有方法,否则该子类也要声明为抽象类。
静态(static)
-
静态方法中 不允许 直接使用 本类的非静态成员(非静态属性+非静态方法)
-
静态方法中 允许直接调用 本类的静态成员(静态属性+静态方法)
-
静态方法中 不允许 使用this和super
-
静态方法 可以被继承
最终的(final)
- final修饰的变量 是最终变量,只允许赋1次值,不允许修改。
- final修饰的方法 称最终方法,不允许被覆盖
- final修饰的类 称最终类,不允许被继承。
接口(interface)
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范,没有方法实现,专业的约束!约束与实现分离:面向接口编程~
- 接口就是规范,定义的是一组规则,"你是什么…必须做什么…"的思想。
- 接口的本质是约束,就像人间法律一样,制定好大家都遵守。
注意点:
- 接口没有构造方法,不能被实例化
- 实现类必须要重写接口中的方法
- 实现类(implements) 可以实现多个接口
接口和抽象类的区别
相同点: 1. 编译后都可以生成.class文件
2. 都可以定义属性、成员方法
3. 都不能创建对象,但可以声明引用
不同点: 1. 接口中 所有属性 默认是 public static final 修饰的(常量);
2. 接口中 的方法 默认是 public abstract修饰的;
3. 接口中 不能定义构造方法;抽象类中可以
异常
异常类分为两大类,错误
Error
和异常Exception
throw和throws的区别
throw: 手动抛出异常,写在方法体中,语法 throw 异常对象;
throws: 消极的处理异常,写在方法声明的最后
- final、finally和finalize的区别
final 是修饰符,可以修饰 变量、方法、类
final修饰的变量,是最终变量,只能赋值1次 不允许修改
final修饰的方法,是最终方法,不允许被覆盖
final修饰的类,是最终类,不允许被继承
finally用在try…catch…finally中代表 不论try中的代码是否有异常,总是会被执行到的代码
finalize是Object类的一个方法,用于在垃圾回收器回收垃圾对象时 由JVM自动调用
IO流
IO流也称为输入输出流、就是用来读写数据的
I:input,是数据从硬盘文件读入到内存的过程,称之为输入,负责读
O:output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出、负责写
多线程
创建线程方式1:继承Thread类,重写run(),调用start()开启线程
创建线程方式2:实现Runnable接口,重写run(),执行线程需要丢给Runnable接口实现类(Thread类实现了Runnable),调用start开启线程
继承Thread和实现Runable对比
创建线程方式3:实现Callable接口,带返回值的
四、面试题【重点】
- 创建线程的2种方式
1> 继承Thread父类 2> 实现Runnable接口3>实现Callable接口 - 什么是线程同步
在多线程环境中,为了保证临界资源对象的 正确性,而 不破坏 原子操作。 - 线程同步如何实现
使用synchronized,有2种使用方法,同步代码块和同步方法。