JAVA知识点全总结——(二)JAVA基础知识

上一篇:JAVA知识点全总结——(一)JVM

2. JAVA基础知识

2.1 集合类库

2.1.1 ArrayList

数组列表,优点是查询快速,缺点是中、前数据的删除会导致大量的数据移位,从而效率变低。如果插入和删除的点在末尾,实际上效率并不是很差。默认的大小是10,如果每次add或者构造函数创建了一个很大的数值时会对结构有变化,会调用核心的grow方法,这个方法会判断是否超出了范围,如果超出范围就把原来的大小扩展1.5倍,如果扩展之后的大小仍然不能满足需要的大小,就直接将大小设置成所需的大小。

2.1.2 LinkedList

LinkedList是通过链表实现的数组,优点是插入和删除非常快速,缺点是没有索引,查询中间效率不高。对于这个问题jdk中的get方法会将索引分成两部分,根据get和size的比较,如果在前半部就从头开始遍历,如果在后半部就从尾部开始遍历。LinkedList没有长度限制。

2.1.3 ArrayDeque

这个类是queue的实现类,实际上也是数组的实现,基本面试不会问这个类,但是实际算法中这个类非常好用,因为他提供了3组方法,addFirst,addLast,getFirst,getLast,removeFirst,removeLast方法分别对数组的头尾进行处理,我们可以用逻辑来实现堆和队列。

2.1.4 HashMap

hashmap是一个散列表,用的散裂方法是hash法,如果使用这个数据结构的时候一定需要注意实现hashcode方法和equals方法。哈希冲突的解决法是拉链法,具体是8个以内直接拉,超过8个改用红黑树。容量是2的倍数,为了用A&(B-1)代替效率极差的%操作,解决分布不均匀的方法是将高16位和低16位&操作。这样resize也非常简单。

2.1.5 TreeMap

这个数据结构是用红黑树实现的,因为是用红黑树实现的,在插入删除的时候必会找到临近的一个节点,所以这个类中有很多类似“大于当前节点的最小节点”此类的方法。

2.1.6 LinkedHashMap

这个类完全是通过另外维护一个LinkedList来记录我们存放进HashMap中数据的顺序。可以通过构造函数来选择是用存放的顺序还是使用的顺序。

2.1.7 Set

set类就不写了,全部都和map一样,只不过不再使用value了。

2.2 IO通信模型

分为:阻塞同步、非阻塞同步、多路复用IO、信号IO、异步IO。我喜欢把最后一个种叫做异步异步,因为对于AIO而言等待和操作两部完全都是系统进行的,java不需要多余的操作,和异步概念类似和阻塞概念不同。

2.3 IO

IO也叫做BIO,是一种阻塞同步的通信模型,基本操作是通过实现OutputStream和InputStream的实现类来对不同的数据进行处理,通常用于文件的操作,我们可以用装饰器模式来对流增加一些类似缓存的功能,是面向字节的。也可以通过OutpuStreamWriter和InputStreamReader来将字节流转换成字符流操作。

2.4 NIO

1.4之后JDK引入了NIO,NIO是一种应用非常广泛的IO,从模型上来看NIO采用的是多路复用IO的模型,多路复用是多个非阻塞同步IO的结合体,用一个轮询的方式进行处理。用select、channel、buffer组合达到这种效果,select是选择器用来控制channel的轮询,buffer用来缓冲数据流。buffer的实现实际上是在JVM的外部分配了一块直接内存,这一部分直接内存通过jvm内部的一个对象进行读写操作,这样防止数据的不断复制浪费。再底层的话,NIO是用Unsafe进行内存分配的。如果出现OOM,而HeapDump文件没什么内容,很可能是使用了NIO,因为直接内存不在JVM中,dump不到。多路复用IO的缺点在于如果一个任务比较长,这样select迟迟不能移动到下一个,导致阻塞。

2.5 AIO

AIO是一种异步异步的通信模型,第一步等待建立连接的过程是异步的,甚至操作系统根本不需要提示java完成,之后操作系统可以继续进行需要的操作。第二步也是异步的,知道结果计算完毕会进行返回。也正因为如此,AIO和操作系统有很大的耦合性。

2.6 反射

反射是一种通过class文件加载类的方法,因为在类加载的时候会在堆中创建一个class类,这个类中有记录我们创建的类的方法和变量的信息。我们可以通过这个class类进行类的实例化,从而获取到所有的方法和变量。通过反射我们可以进行IoC操作等。

2.7 异常

异常分为Error和Exception两种。

2.7.1 Error

Error普遍表示计算机和JVM本身的一些限制从而不能满足需要而失败。理论上不是代码的问题。但是一般SOF和OOM的出现都是我们的代码有点问题。举例:OutOfMemoryError、StackOverflowError。

2.7.2 Exception——Runtime

Exception表示我们程序中存在的问题,其中又分为Runtime和非Runtime两类,Runtime是指运行时异常,是我们代码写错了,本不应该出现这种问题。举例:空指针、数组越界、字符串转换数字、除零、类型转换等。

2.7.3 Exception——非Runtime

非Runtime是指编写代码的时候我们就已经预料到的问题,可能发生,我们需要去获取这种问题。举例:IO异常、文件读取、SQL问题、时间类型转换。

2.8 序列化

序列化是一种将数据转化为流的形式传输到另一个机器上的操作,我们会把数据压缩成一定的规则的文件。常见的序列化有xml,json。这两种是可读性强而压缩效果一般的序列化方式。java中实现序列化使用的是Serializable接口,这个接口是个声明接口,没有需要实现的方法,用以标记此类可进行序列化操作。在IO中使用ObjectOutputStream的wirteObject方法进行输出、使用ObjectInputStream的readObject方法进行输入操作。需要一个UID字段,作为版本的标识。

2.9 Object方法

2.9.1 equals

equals用来判断两个对象是否等价,默认判断地址

2.9.2 hashcode

如果两个对象equals判断相同,那么hashcode必相同;如果两个对象equals判断不相同,hashcode也有可能相同。 这个方法也需要重写,需要使用上所有有影响的字段。

2.9.3 clone

继承下来默认是浅拷贝,可以自己编写逻辑进行深拷贝。但是在对象很复杂的情况下难以操作,不如序列化进行深拷贝。

2.9.4 wait/notify/notifyAll

用于在sync锁中进行等待和唤醒操作。

2.9.5 getClass

对某个对象使用这个方法,获取他在堆上的class类,使用反射的好方法。

2.9.6 toString

转换成字符串。

2.10 StringBuilder/StringBuffer

快速拼接字符串的类,如果我们用javap反汇编会发现+操作字符串会默认创建StringBuilder进行操作,底层原理是char数组,类似于ArrayList的原理。StringBuffer是同步的,在所有的方法加上了sync锁。

下一篇:JAVA知识点全总结——(三)多线程与并发

猜你喜欢

转载自blog.csdn.net/quinnnorris/article/details/81181701
今日推荐