共计 2529 个字符,预计需要花费 7 分钟才能阅读完成。
Java 语言有哪些特点?
- 简略易学;
- 面向对象(封装,继承,多态);
- 平台无关性(Java 虚拟机实现平台无关性);
- 可靠性;
- 安全性;
- 反对多线程(C++ 语言没有内置的多线程机制,因而必须调用操作系统的多线程性能来进行多线程程序设计,而 Java 语言却提供了多线程反对);
- 反对网络编程并且很不便(Java 语言诞生自身就是为简化网络编程设计的,因而 Java 语言不仅反对网络编程而且很不便);
- 编译与解释并存;
什么是字节码? 采纳字节码的益处是什么?
在 Java 中,JVM 能够了解的代码就叫做
字节码
(即扩大名为.class
的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的形式,在肯定水平上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比拟高效,而且,因为字节码并不针对一种特定的机器,因而,Java 程序毋庸从新编译便可在多种不同操作系统的计算机上运行。
1.1.4. Java 和 C++ 的区别?
- 都是面向对象的语言,都反对封装、继承和多态
- Java 不提供指针来间接拜访内存,程序内存更加平安
- Java 的类是单继承的,C++ 反对多重继承;尽管 Java 的类不能够多继承,然而接口能够多继承。
- Java 有主动内存治理垃圾回收机制(GC),不须要程序员手动开释无用内存
- 在 C 语言中,字符串或字符数组最初都会有一个额定的字符
'0'
来示意完结。然而,Java 语言中没有结束符这一概念。 这是一个值得深度思考的问题,具体起因举荐看这篇文章:https://blog.csdn.net/sszgg2006/article/details/49148189
1.2.1. 字符型常量和字符串常量的区别?
- 模式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的 0 个或若干个字符
- 含意上: 字符常量相当于一个整型值(ASCII 值), 能够加入表达式运算; 字符串常量代表一个地址值(该字符串在内存中寄存地位)
- 占内存大小 字符常量只占 2 个字节; 字符串常量占若干个字节 (留神:char 在 Java 中占两个字节)
List 的常见实现类
ArrayList 是一个数组队列,相当于动静数组。它由数组实现,随机拜访效率高,随机插入、随机删除效率低。
LinkedList 是一个双向链表。它也能够被当作堆栈、队列或双端队列进行操作。LinkedList 随机拜访效率低,但随机插入、随机删除效率高。
Vector 是矢量队列,和 ArrayList 一样,它也是一个动静数组,由数组实现。然而 ArrayList 是非线程平安的,而 Vector 是线程平安的。
Stack 是栈,它继承于 Vector。它的个性是:先进后出(FILO, First In Last Out)。相干浏览:java 数据结构与算法之栈(Stack)设计与实现
均衡二叉树(Self-balancing binary search tree)
均衡二叉树(百度百科,均衡二叉树的罕用实现办法有红黑树、AVL、替罪羊树、Treap、舒展树等)
红黑树
红黑树特点:
- 每个节点非红即黑;
- 根节点总是彩色的;
- 每个叶子节点都是彩色的空节点(NIL 节点);
- 如果节点是红色的,则它的子节点必须是彩色的(反之不肯定);
- 从根节点到叶节点或空子节点的每条门路,必须蕴含雷同数目的彩色节点(即雷同的彩色高度)。
当插入或者删除结点的时候,红黑树的规定可能被突破,须要调整以维持规定。
调整办法:变色和旋转。旋转又分为左旋转和右旋转。很简单,菜鸡先攒着。
红黑树的利用:
TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底层都用到了红黑树。
为什么要用红黑树?
简略来说红黑树就是为了解决二叉查找树的缺点,因为二叉查找树在某些状况下会进化成一个线性构造。具体理解能够查看 漫画:什么是红黑树?(也介绍到了二叉查找树,十分举荐)
举荐文章:
- 漫画:什么是红黑树?(也介绍到了二叉查找树,十分举荐)
- 寻找红黑树的操作手册(文章排版以及思路真的不错)
- 红黑树深刻分析及 Java 实现(美团点评技术团队
B-,B+,B* 树(B 示意均衡树)
B 树,非叶节点含有关键字信息,是数据结构寡人印象最深的那个。
B-tree 是 B +-tree 的变体,在 B + 树的根底上 (所有的叶子结点中蕴含了全副关键字的信息,及指向含有这些关键字记录的指针),B 树中非根和非叶子结点再减少指向兄弟的指针;B树定义了非叶子结点关键字个数至多为(2/3)M,即块的最低使用率为 2 /3(代替 B + 树的 1 /2)。
- B+ 树的叶子节点链表构造相比于 B- 树便于扫库,和范畴检索。
- B+ 树反对 range-query(区间查问)十分不便,而 B 树不反对。这是数据库选用 B + 树的最次要起因。B+ 树也更适宜操作系统中的文件索引。
起因如下:
- B+-tree 的磁盘读写代价更低
B+-tree 的外部结点并没有指向关键字具体信息的指针。因而其外部结点绝对 B 树更小。
如果把所有同一外部结点的关键字寄存在同一盘块中,那么盘块所能包容的关键字数量也越多。
一次性读入内存中的须要查找的关键字也就越多。相对来说 IO 读写次数也就升高了。
举个例子,假如磁盘中的一个盘块包容 16bytes,而一个关键字 2bytes,一个关键字具体信息指针 2bytes。
一棵 9 阶 B -tree(一个结点最多 8 个关键字)的外部结点须要 2 个盘快。而 B + 树外部结点只须要 1 个盘快。当须要把外部结点读入内存中的时候,B 树就比 B + 树多一次盘块查找时间(在磁盘中就是盘片旋转的工夫)。
- B+-tree 的查问效率更加稳固
因为非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查问的门路长度雷同,导致每一个数据的查问效率相当
- B树 是 B + 树的变体,B树调配新结点的概率比 B + 树要低,空间使用率更高;
LSM 树
B+ 树最大的性能问题是会产生大量的随机 IO,随着新数据的插入,叶子节点会缓缓决裂,逻辑上间断的叶子节点在物理上往往不间断,甚至拆散的很远,但做范畴查问时,会产生大量读随机 IO。
对于大量的随机写也一样,举一个插入 key 跨度很大的例子,如 7 ->1000->3->2000 … 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写 IO.