主页

Spring Boot(一) Spring Boot项目创建

简介 Spring Boot简化了基于Spring的应用开发,你只需要”run”就能创建一个独立的,产 品级别的Spring应用。 我们为Spring平台及第三方库提供开箱即用的设置,这样你 就可以有条不紊地开始。多数Spring Boot应用只需要很少的Spring配置。 Spring Boot的目标是: 为所有Spring开发提供一个从根本上更快,且随处可得的入门体验。 开箱即用,但通过不采用默认设置可以快速摆脱这种方式。 提供一系列大型项目常用的非功能性特征,比如:内嵌服务器,安全,指标, 健康检测,外部化配置。 绝对没有代码生成,也不需要XML配置。 系统要求 默认情况下,Spring Boot 1.4.0.BUILD-SNAPSHOT需要Java7环境,...

阅读更多

计算机网络面试题集锦

OSI,TCP/IP,五层协议的体系结构,以及各层协议 OSI分层 (7层): 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 TCP/IP分层(4层): 网络接口层 网际层 运输层 应用层。 五层协议 (5层): 物理层 数据链路层 网络层 运输层 应用层 每一层的协议如下: 物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器) 数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机) 网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器) 传输层:TCP、UDP、SPX 会话层:NFS、SQL、NETB...

阅读更多

Java面试题集锦

Java基础 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。 JDK和JRE的区别是什么? Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。 Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Jav...

阅读更多

Java修饰符

梗概 Java提供了很多的修饰符,修饰符用于描述类/方法/变量的一些属性,主要分为两类 访问修饰符 非访问修饰符 访问修饰符 用于描述该类/方法/变量的被访问的权限,关键字有四个,权限范围如下: 修饰符 包外 子类 包内 类内 public √ √ √ √ protected   √ √ √ default     √ √ ...

阅读更多

简单的JNI介绍和实例

native关键字 native是与C++联合开发的时候用的!使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。总而言之: native 是用做java 和其他语言(如c++)进行协作时使用的,也就是native 后的函数的实现不是用java写的。 既然都不是java,那就别管它的源代码了,我们只需要知道这个方法已经被实现即可。 native的意思就是通知操作系统, 这个函数你必须给我实现...

阅读更多

原码、反码和补码

概述 相信每一个学计算机的同学都头疼过原码,补码和反码这三个东西,甚至有时候还会冒出一个移码 我们人类在计数的时候,用的都是十进制,但是计算机可不认这个,它们的世界用的是二进制来表示数,这个时候我们如果想要了解它们的世界是怎么样的,那么首先就要认识它们是怎么数数的 我们把我们正常计数用的表示方法表示的数称为“真值”,把机器里面表达的数称为“机器数” 原码 概念 原码(true form) 是一种计算机中对数字的二进制定点表示方法.原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小. 数学表示如下(有的书上会约定符号位和数值位之间用逗号隔开,所以表达式会有所不同,这里的以没有逗号隔开的为准) 若$X$...

阅读更多

位运算

简介 我们都知道计算机里的数据实际上是通过二进制进行储存的,所以我们在计算机上的所有操作其实都是在操作这些二进制数据 位运算,意思就是在实际编程中对把数据当做二进制数进行运算操作,因为计算机实际上也是把数据转化为二进制数进行运算,所以我们直接使用二进制的运算方式计算的效率就会很高 试想如果是十进制运算的话,计算机还要先把十进制运算转化为二进制运算才开始计算,而我们直接使用二进制运算就跳过了中间”编译”的过程,这也是为什么我们说位运算的效率高. 种类 在Java里位运算共有7种,如下表 名称 Java 按位与 a & b 按位或 a |...

阅读更多

集合专题1 Collection

简介 Collection的相关关系图如下 Collection是一个接口,它主要的两个分支是:List 和 Set。 List和Set都是接口,它们继承于Collection List 有序1,可以有重复的元素 Set 无序,不可以有重复元素 List和Set都有它们各自的实现类。 为了方便,我们抽象出了AbstractCollection抽象类,它实现了Collection中的绝大部分函数;这样,在Collection的实现类中,我们就可以通过继承AbstractCollection省去重复编码。AbstractList和AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于...

阅读更多

集合专题3 LinkedList

简介 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同。LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比 ArrayList 更加高效。但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ ...... } 继承: AbstractSequentialList 继承...

阅读更多

集合专题2 ArrayList

简介 ArrayList 可以理解为动态数组,用 MSDN 中的说法,就是 Array 的复杂版本。与 Java 中的数组相比,它的容量能动态增长。ArrayList 是 List 接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造 ArrayList 时指定其容量。在添加大量元素前,应用程序也可以使用 ensureCapac...

阅读更多

插入排序(Insertion Sort)

概念 插入排序是一种简单直观的排序算法. 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 步骤 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 举例 例1 现有一组数组[5, 6, 3, 1, 8, 7, 2, 4],共有八个记录,排序过程如下: [5] 6 3 1 8 7 2 4 我们...

阅读更多

选择排序(Selection Sort)

概念 选择排序是一种简单直观的排序算法,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕. 顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来, 顺序放入新数组,直到全部拿完. 再简单点,对着一群数组说,你们谁最小出列,站到最后边,然后继续对剩余的无序数组说,你们谁最小出列,站到最后边,再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了. 优点 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行...

阅读更多

冒泡排序(Bubble Sort)

概念 冒泡排序是一种简单的排序算法.基本思想是迭代地对数列中的第一个元素到最后一个元素进行两两比较,当需要的时候交换这两个元素(位置).重复这个过程一直到所有元素都被排序到正确的位置上. 冒泡排序得名于较小的元素如同”气泡”一样逐渐漂浮到数列的顶端. 步骤 比较相邻的元素,如果第一个比第二个大1,就交换它们两个的位置. 对每一对相邻元素作进行同样的步骤,从开始第一对到结尾的最后一对这步做完后. 进行一轮的比较之后,最大的数会被不断交换到最后一位,这样最后一位数就是有序2的了. 针对所有的元素重复以上的步骤,直到所有的元素都被排好序. 举例 例 1 假定有一个数组[5, 7, 4, 10, 9],我们要把这个数组按从小到大排列 我们从第一个数开始,两个一组进...

阅读更多

希尔排序(Shell sort)

概念 将整个序列分割成若干小的子序列,再分别对子序列进行直接插入排序,使得原来序列成为基本有序。这样通过对较小的序列进行插入排序,然后对基本有序的数列进行插入排序,能够提高插入排序算法的效率。 希尔排序也是插入排序的一种,使用了分治的思想,让排序的时间复杂度较插入排序有大幅的提升,于是单独拿出来作为一章. 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 步骤 先取一个正整数$d_1<n$,把所有序号相隔d1的数组元素放一组 组内进行直接插入排序 然后取$d_2<d_1$,重复上述分组和排序操作 直至$d_i=1$,即所有记录放进一个组中排序为止。 举例 例1 以n=10...

阅读更多

Algorithms(算法详解) 汉化项目

背景   在酷安闲逛时发现了这个应用.   Algorithms采用了动画演示的方式,向大家展示了算法的执行过程,通过精美的动画流程展示,帮助学习算法的人更加容易理解算法,加上我也正好在进行算法的学习,所以对这个应用的评价也相当高.   然而应用本身并没有提供中文版本,虽然在编程的学习中,我们都提倡直接使用英语进行学习,毕竟编程这个东西是外国人发明的,语法什么的都是为英语环境设计的,但是对于广大的初学者来说(包括我),直接面对英语环境,还是略显吃力,于是萌生了对其进行汉化的念头,既可以加深自己对算法的理解,也可以帮助到大家. 计划 Plan A 应用中有英文版的提供者,我认为作者应该是有针对国际化的设计,没有什么汉化可以比得上原生提供中文,于是我向开发者发送了邮件,希望向其提供...

阅读更多