Java 语言有哪些特点?

  1. 简略易学;
  2. 面向对象(封装,继承,多态);
  3. 平台无关性( Java 虚拟机实现平台无关性);
  4. 可靠性;
  5. 安全性;
  6. 反对多线程( C++ 语言没有内置的多线程机制,因而必须调用操作系统的多线程性能来进行多线程程序设计,而 Java 语言却提供了多线程反对);
  7. 反对网络编程并且很不便( Java 语言诞生自身就是为简化网络编程设计的,因而 Java 语言不仅反对网络编程而且很不便);
  8. 编译与解释并存;

什么是字节码?采纳字节码的益处是什么?

在 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. 字符型常量和字符串常量的区别?

  1. 模式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的0个或若干个字符
  2. 含意上: 字符常量相当于一个整型值( ASCII 值),能够加入表达式运算; 字符串常量代表一个地址值(该字符串在内存中寄存地位)
  3. 占内存大小 字符常量只占 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、舒展树等)

红黑树

红黑树特点:

  1. 每个节点非红即黑;
  2. 根节点总是彩色的;
  3. 每个叶子节点都是彩色的空节点(NIL节点);
  4. 如果节点是红色的,则它的子节点必须是彩色的(反之不肯定);
  5. 从根节点到叶节点或空子节点的每条门路,必须蕴含雷同数目的彩色节点(即雷同的彩色高度)。

当插入或者删除结点的时候,红黑树的规定可能被突破,须要调整以维持规定。
调整办法:变色和旋转。旋转又分为左旋转和右旋转。很简单,菜鸡先攒着。

红黑树的利用:

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)。

  1. B+ 树的叶子节点链表构造相比于 B- 树便于扫库,和范畴检索。
  2. 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的查问效率更加稳固

因为非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查问的门路长度雷同,导致每一个数据的查问效率相当

  1. B树 是B+树的变体,B树调配新结点的概率比B+树要低,空间使用率更高;

LSM 树

B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会缓缓决裂,逻辑上间断的叶子节点在物理上往往不间断,甚至拆散的很远,但做范畴查问时,会产生大量读随机IO。

对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 ... 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO.