Java 面试题解析(Java Web)
阐述 Servlet 和 CGI 的区别?答:Servlet 与 CGI 的区别在于 Servlet 处于服务器进程中,它通过多线程方式运行其 service() 方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 Servlet。 补充:Sun Microsystems 公司在 1996 年发布 Servlet 技术就是为了和 CGI 进行竞争,Servlet 是一个特殊的 Java 程序,一个基于 Java 的 Web 应用通常包含一个或多个 Servlet 类。Servlet 不能够自行创建并执行,它是在 Servlet 容器中运行的,容器将用户的请求传递给 Servlet 程序,并将 Servlet 的响应回传给用户。通常一个 Servlet 会关联一个或多个 JSP 页面。以前 CGI 经常因为性能开销上的问题被诟病,然而 Fast CGI 早就已经解决了 CGI 效率上的问题,所以面试的时候大可不必信口开河的诟病 CGI,事实上有很多你熟悉的网站都使用了 CGI 技术。 Servlet 接口中有哪 ...
Java 面试题解析(设计模式)
简述一下面向对象的"六原则一法则"。答: 单一职责原则:一个类只做它该做的事情。(单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字“高内聚、低耦合”,就如同葵花宝典或辟邪剑谱的中心思想就八个字“欲练此功必先自宫”,所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则,这个类就只有单一职责。我们都知道一句话叫“因为专注,所以专业”,一个对象如果承担太多的职责,那么注定它什么都做不好。这个世界上任何好的东西都有两个特征,一个是功能单一,好的相机绝对不是电视购物里面卖的那种一个机器有一百多种功能的,它基本上只能照相;另一个是模块化,好的自行车是组装车,从减震叉、刹车到变速器,所有的部件都是可以拆卸和重新组装的,好的乒乓球拍也不是成品拍,一定是底板和胶皮可以拆分和自行组装的,一个好的软件系统,它里面的每个功能模块也应该是可以轻易的拿到其他系统中使用的,这样才能实现软件复用的目标。) 开闭原则:软件实体应当对扩展开放,对修改关闭。(在理想的状态下,当我们需要 ...
Java 面试题解析(反射)
获得一个类的类对象有哪些方式?答: 类型.class,例如:String.class 对象.getClass(),例如:"hello".getClass() Class.forName(),例如:Class.forName("java.lang.String") 如何通过反射创建对象?答: 通过类对象调用 newInstance() 方法,例如:String.class.newInstance() 通过类对象的 getConstructor() 或 getDeclaredConstructor() 方法获得构造器(Constructor)对象并调用其 newInstance() 方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello"); 如何通过反射获取和设置对象私有字段的值?答:可以通过类对象的 getDeclaredField() 方法字段(Field)对象,然后再通过字段对象的 setAccessible(true) 将其设置 ...
Java 面试题解析(数据库)
XML 文档定义有几种形式?它们之间有何本质区别?解析 XML 文档有哪几种方式?答:XML 文档定义分为 DTD 和 Schema 两种形式,二者都是对 XML 语法的约束,其本质区别在于 Schema 本身也是一个 XML 文件,可以被 XML 解析器解析,而且可以为 XML 承载的数据定义类型,约束能力较之 DTD 更强大。对 XML 的解析主要有 DOM(文档对象模型,Document Object Model)、SAX(Simple API for XML)和 StAX(Java 6 中引入的新的解析 XML 的方式,Streaming API for XML),其中 DOM 处理大型文件时其性能下降的非常厉害,这个问题是由 DOM 树结构占用的内存较多造成的,而且 DOM 解析方式必须在解析文件之前把整个文档装入内存,适合对 XML 的随机访问(典型的用空间换取时间的策略);SAX 是事件驱动型的 XML 解析方式,它顺序读取 XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理 XML ...
Java 面试题解析(IO流)
Java 中如何实现序列化,有什么意义?答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。 要实现序列化,需要让一个类实现 Serializable 接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过 writeObject(Object) 方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过 readObject 方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆(可以参考第 29 题)。 Java 中有几种类型的流?答:字节流和字符流。字节流继承于 InputStream、OutputStream,字符流继承于 Reader、Writer。在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于 Java 的 I/O 需要注意的有两点:一是两种对称性( ...
Java 面试题解析(并发)
Thread 类的 sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别?答:sleep() 方法(休眠)是线程类 Thread 的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第 66 题中的线程状态转换图)。wait() 是 Object 类的方法,调用对象的 wait() 方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的 notify() 方法(或 notifyAll() 方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。 补充:可能不少人对什么是进程,什么是线程还比较模糊,对于为什么需要多线程编程也不是特别理解。简单的说:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是 CPU 调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程的划 ...
Java 面试题解析(容器)
List、Set、Map 是否继承自 Collection 接口?答:List、Set 是,Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别,而 Set 存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List 是线性结构的容器,适用于按数值索引访问元素的情形。 阐述 ArrayList、Vector、LinkedList 的存储性能和特性。答: ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 中的方法由于添加了 synchronized 修饰,因此 Vector 是线程安全的容器,但性能上较 ArrayList 差,因此已经是 Java 中的遗留容器。 LinkedList 使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向 ...
Java 面试题解析(基础)
面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样 ...
Java 面试题解析
Java 基础Java 容器Java 并发Java IO流Java 数据库Java 反射Java 设计模式Java WebJava EE
排序算法
排序算法排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列,排序就是把集合中的元素按照一定的次序排序在一起。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 相关概念 稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。 非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。 非原地排序:需要利用额外的数组来辅助排序。 时间复杂度:一个算法执行所消耗的时间。 空间复杂度:运行完一个算法所需的内存大小。 时间复杂度对比 排序算法 平均时间复杂度 最坏时间复杂度 最优时间复杂度 空间复 ...
HTML 特殊符号编码对照表
符号 命名实体 十进制编码 符号 命名实体 十进制编码 符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε Ζ Ζ Ζ Η Η Η Θ Θ Θ Ι Ι Ι Κ Κ Κ Λ Λ Λ Μ Μ Μ Ν Ν Ν Ξ Ξ Ξ Ο Ο Ο Π Π Π Ρ Ρ Ρ Σ Σ Σ Τ ...
特殊符号
编号序号①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⓪ ❶❷❸❹❺❻❼❽❾❿⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴ ㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉ 一二三四五六七八九十 ⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇ ⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛ ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ ⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉ 数学符号﹢﹣×÷±/≌∽≦≧≒﹤﹥≈≡≠=≤≥<>≮≯≂≃≄≅≆≇≈≉≊≋≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≢≣≨≩⊰⊱⋛⋚∷∶∝∞∧∨∑∏∪∩∈∵∴⊥∥∠⌒⊙√∟⊿㏒㏑⅟½⅓⅕⅙⅛⅔⅖⅚⅜¾⅗⅝⅞⅘∫∬∭∮∯∰∱∲∳%℅‰‱øØπ 标点符号。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑·¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<_-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷^︹︽﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼❝❞ 上标符号ᵃ ...
HDFS Shell 命令
FS Shell 调用文件系统(FS)的 Shell 命令应使用 bin/hadoop fs <args> 的形式。 所有的 FS shell 命令使用 URI 路径作为参数。 URI 格式是 scheme://authority/path。对 HDFS 文件系统,scheme 是 hdfs,对本地文件系统,scheme 是 file。其中 scheme 和 authority 参数都是可选的,如果未加指定,就会使用配置中指定的默认 scheme。 一个 HDFS 文件或目录比如 /parent/child 可以表示成 hdfs://namenode:namenodeport/parent/child,或者更简单的 /parent/child(假设你配置文件中的默认值是 namenode:namenodeport)。 大多数 FS Shell 命令的行为和对应的 Unix Shell 命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到 stderr,其他信息输出到 stdout。 cat 使用方法: 1hadoop fs -cat URI [U ...
Git 使用教程
什么是 GitGit 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS,Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。 Git 与 SVN 区别Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。 如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。 Git 与 SVN 区别点: Git 是分布式的,SVN 是集中式的:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。 Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。 Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。 Git 没有一个全局的版本号,而 SVN 有:目前为止这是 ...
26 个字母 26 句话
#article-container img { width: 33%; display: inline-block;} 一个字母一张图,一张图一个感悟,一个感悟一份思考,一份思考一个行动。
R 语言统计分析
前言R 中的统计分析通过使用许多内置函数来执行。这些函数大多数是 R 基础包的一部分。这些函数将 R 向量作为输入和参数,并给出结果。 平均值通过求出数据集的和再除以求和数的总量得到平均值 函数 mean() 用于在 R 语言中计算平均值。 语法用于计算 R 中的平均值的基本语法是: 1mean(x, trim = 0, na.rm = FALSE, ...) 以下是所使用的参数的说明: x 是输入向量。 trim 用于从排序向量的两端丢弃一些观察结果。 na.rm 用于从输入向量中删除缺失值。 12345678910# Create a vector. x <- c(12, 7, 3, 4.2, 18, 2, 54, -21, 8, -5)# Find Mean.result.mean <- mean(x)print(result.mean)# 当我们执行上面的代码,它产生以下结果:[1] 8.22 应用 trim 选项当提供 trim 参数时,向量中的值被排序,然后从计算平均值中减去所需的观察值。 当 trim = 0.3 时,来自每端的 3 个值将从计算中减去 ...
R 语言数据接口
前言R 语言处理的数据一般从外部导入,因此需要数据接口来读取各种格式化的数据。 在 R 语言中,我们可以从存储在 R 语言环境外的文件中读取数据。我们还可以将数据写入将被操作系统存储和访问的文件。R 语言可以读取和写入各种文件格式,如 CSV,Excel,XML,JSON 等。 CSV 文件本章节学习从 CSV 文件读取数据,然后将数据写入 CSV 文件。该文件应该存在于当前工作目录中,以便 R 语言可以读取它。当然我们也可以设置我们自己的目录并从那里读取文件。 获取和设置工作目录您可以使用 getwd() 函数检查 R 语言工作区指向的目录。您还可以使用 setwd() 函数设置新的工作目录。 12345678910111213# Get and print current working directory.print(getwd())# Set current working directory.setwd("E:/data")# Get and print current working directory.print(getwd())# ...
R 语言图表
前言R 提供了非常丰富的绘图功能,可以通过命令:demo(graphics)(二维图表) 或者 demo(persp)(三维图表)来体验 R 绘图功能的强大。 图形工具是 R 环境的一个重要组成部分。R 提供了多种绘图相关的命令,分成三类: 高级绘图命令:在图形设备上产生一个新的图区,它可能包括坐标轴,标签,标题等等。 低级绘图命令:在一个已经存在的图上加上更多的图形元素,如额外的点,线和标签。 交互式图形命令:允许交互式地用鼠标在一个已经存在的图上添加图形信息或者提取图形信息。 下面介绍 R 的常用图表。 条形图条形图表示矩形条中的数据,条的长度与变量的值成比例。R 语言使用函数 barplot() 创建条形图。R 语言可以在条形图中绘制垂直和水平条。在条形图中,每个条可以给予不同的颜色。 语法在 R 语言中创建条形图的基本语法是: 1barplot(H, xlab, ylab, main, names.arg, col) 以下是所使用的参数的说明: H 是包含在条形图中使用的数值的向量或矩阵。 xlab 是 x 轴的标签。 ylab 是 y 轴的标签。 main 是条形图的 ...
R 语言教程
概述R 的简介 R 语言是用于统计分析,图形表示和报告的编程语言和软件环境。R 语言由 Ross Ihaka 和 Robert Gentleman 在新西兰奥克兰大学创建,目前由 R 语言开发核心团队开发。 R 语言的核心是解释计算机语言,其允许分支和循环以及使用函数的模块化编程。R 语言允许与以 C,C ++,.Net,Python 或 FORTRAN 语言编写的过程集成以提高效率。 R 语言在 GNU 通用公共许可证下免费提供,并为各种操作系统(如 Linux,Windows 和 Mac)提供预编译的二进制版本。 R 是一个在 GNU 风格的副本左侧的自由软件,GNU 项目的官方部分叫做 GNU S. R 的演变R 语言最初是由新西兰奥克兰奥克兰大学统计系的 Ross Ihaka 和 Robert Gentleman 写的。R 语言于 1993 年首次亮相。 一大群人通过发送代码和错误报告对 R 做出了贡献。 自 1997 年年中以来,已经有一个核心组(R 核心团队)可以修改 R 源代码归档。 R 的特点如前所述,R 语言是用于统计分析,图形表示和报告的编程语言和软件环境。以 ...
MySQL 优化
优化三大方向 优化 MySQL 所在服务器内核(此优化一般由运维人员完成)。 对 MySQL 配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整。 对 SQL 语句以及表优化。 参数优化 MySQL 默认的最大连接数为 100,可以在 mysql 命令提示窗口使用以下命令查看 1mysql> SHOW variables LIKE 'max_connections'; 查看当前访问 MySQL 的线程 1mysql> SHOW processlist; 设置最大连接数 1mysql> SET globle max_connections = 5000; 最大可设置 16384,超过没用 查看当前被使用的 connections 1mysql> SHOW GLOBAL STATUS LIKE 'max_user_connections' 性能优化 使用查询缓存优化查询 使用 EXPLAIN 关键字检测查询 只要一行数据时使用 LIMIT 1 为搜索字段建立索引 在 JOIN 表 ...