一: java基础
1.1 java的8种基本数据类型 装箱 拆箱
1.1.1 8种基本数据类型
- Byte short int long double float char Boolean
1.1.2.装箱和拆箱
- 自动装箱是java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。如:把int转化为 Integer,double转化成 Double,等等,反之就是自动拆箱。
- 原始类型:boolean,char,byte,short,int,long,float,double
- 封装类型:Boolean,Character,Byte,Short,Integer, Long,Float,Double
1.1.3 java基本类型和引用类型的区别
基本类型保存原始值,引用类型保存的是引用值(引用值就是指对象在堆中所处的位置/地址)
2.1Java语言的三大特性
- 封装:
将属性和方法封装到一个类中,我认为就是私有化 private,将对象内部方法实现的细节隐藏,然后对外提供访问的接口 - 继承
继承遵循里氏替换原则,子类可以扩展父类的功能,但不能修改父类原有的功能,继承后的子类自动拥有父类的属性和方法,私有的属性和构造方法除外,继承实现了代码的复用 - 多态
是以封装和继承为基础,父类的变量指向子类的对象。
注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态的定义与使用格式
定义: 父类类型 变量名 = new 子类类型();
//在多态中: 成员变量:编译运行看左边
Fu f = new Zi();
System.out.printIn(f.num); //这里取的是变量,所有看父类,所有 f.num 取到的是父类中定义的 num
//成员方法:编译看左边,运行看右边
Fu f = new Zi();
System.out.printIn(f.eat());// 这里是方法,所有看子类,所有 f.eat() 取到的是子类中重写后的方法
2.2. == 和 equals 的区别
- ==比较的是内存地址
- equals比较的值本身
- equals如果不重写,和 == 是等价的
2.2.1 hashCode() 和 equals() 的区别
- 性能分析:重写的equals() 里面一般比较的比较全面复杂,这样效率就比较低,而hashCode() 进行对比时,只要生成一个hash值进行比较就可以了,效率很高。
- 可靠性分析:hashCode() 并不是完全可靠,有时候不同的对象生成的hashCode也会不一样,所有hashCode() 只能说大部分时候可靠,并不是绝对可靠。so
- equals() 相等的两个对象他们的hashCode() 肯定相等,也就是说用equals() 对比时绝对可靠的。
- hashCode() 相等的两个对象他们的equals() 不一定相等,也就是说用hashCode()对比不是绝对可靠。
2.3 操作字符串的类
String 、StringBuilder、StringBuffer
String 和 StringBuffer、StringBuilder的区别在于String声明的是不可变对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。
StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。
2.3.1 String str = “a” 与 String str = new String(“a”)一样吗
不一样,因为内存的分配方式不一样。
String str = "a"; //这里把a存在常量池中
String str = new String("a"); //这里是存在堆内存
2.3.2 抽象类能使用final修饰吗?
不能,定义抽象类就是让其他类继承的,而final修饰的类不能被继承。
2.3.3关于static的那些事
1. 抽象的(abstract)方法是否可同时是静态的(static)?
答:不行,抽象方法将来是要被重写的,而静态方法是不能重写的。
2. 是否可以从一个静态(static)方法内部发出对非静态方法的调用?
答:不能,静态方法只能访问静态成员,非静态方法的调用要先创建对象。
3. static 可否用来修饰局部变量?
答:不允许
4. Java中是否可以覆盖(override)一个private或者是static的方法?
答:Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所有概念上不适用。
2.3.3 重载(Overload)和重写(Override)
方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则为重载;**重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。**重载对返回类型没有特殊的要求,不能根据返回类型区分。
2.4 序列化和反序列化
Java 序列化就是将对象转换为字节序列的过程,反序列化是将字节序列转换成目标对象的过程
2.4.1 什么情况下需要Java序列化
当Java对象需要在网络上传输 或者 持久化存储到文件中时需要序列化。
2.4.2 序列化如果实现
让类实现Serializable接口,标注该类对象是可被序列的。
2.4.3 某些数据不想序列化,如何处理?
在字段前面加 transient 关键字,比如:
transient private String num; //该字段不参与序列化
二:Java 集合(后续补充目前数据结构暂未熟悉)
1.1.1. Java 集合框架的基础接口
Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。
- Set 是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就像一副扑克牌。
- List 是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List 更像长度动态变换的数组。
- Map 是一个将key映射到value的对象,一个Map不能包含重复的key:每个key最多只能映射一个value。
- 还有一些其他的接口:Queue、Dequeue、SortedSet、SortedMap、和ListIterator。
1.1.2Collection 和Collections 有啥区别?
- Collection 是一个集合接口,它提供了集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如:List、Set 等。
- Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:Collections.sort(list)
1.1.3 List 、Set 、Map 是否继承自Collection接口
List、Set 是,Map不是。Map 是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许重复的元素(数学中的集合也是如此),List 是线性结构的容器,适用于按数值索引访问元素的情况。
1.1.3.1为何Map 接口不继承Collection接口
尽管Map接口和他的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。
如果Map继承Collection接口,那么元素去哪了?Map包含Key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。
三:异常和反射
1.1. error和exception有什么区别?
error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。
exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。
1.1.1. 说出5个常见的RuntimeException?
(1) Java.lang.NullPointerException空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
(2)Java.lang.NumberFormatException字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
(3)Java.lang.IndexOutOfBoundsException数组角标越界异常,常见于操作数组对象时发生。(4)Java.lang.IllegalArgumentException方法传递参数错误。
(5)Java.lang.ClassCastException数据类型转换异常。
1.2. throw和throws的区别?
throw:
- throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
- throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:
- throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
- throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的
- throws表示出现异常的一种可能性,并不一定会发生这种异常。
1.2.1 Java中异常的处理
首先处理异常主要有两种方式:一种try catch,一种是throws。
- try catch:
- try{}中放入可能发生异常的代码。catch{}中放入对捕获到异常之后的处理。
- throw throws:
- throw是语句抛出异常,出现于函数内部,用来抛出一个具体异常实例,throw被执行后面的语句不起作用,直接转入异常处理阶段。
- throws是函数方法抛出异常,一般写在方法的头部,抛出异常,给方法的调用者进行解决
四:IO(TODO)
五:多线程(TODO)
1.1.什么是进程
进程是系统中正在运行的一个程序,程序一旦运行就是进程。
进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
1.1.2 什么是线程?
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
1.2. 线程的实现方式
- 继承Thread类
- 实现Runnable接口
- 使用Callable和Future
文章哪里有问题请指正,后面会继续更新
最后,如果对你有帮助的话,点个赞吧  ̄︶ ̄