IT技术人员面试基础知识结合.docx
《IT技术人员面试基础知识结合.docx》由会员分享,可在线阅读,更多相关《IT技术人员面试基础知识结合.docx(69页珍藏版)》请在冰豆网上搜索。
![IT技术人员面试基础知识结合.docx](https://file1.bdocx.com/fileroot1/2023-4/17/96d3d2f9-1bdc-4b06-a7e7-5767df80cf76/96d3d2f9-1bdc-4b06-a7e7-5767df80cf761.gif)
IT技术人员面试基础知识结合
面试必备的相关知识
目的:
为了更好的认识java体系,同时为了找更高的薪水。
1、java基础知识
1.1基础知识
1.1.1配置环境变量
新建java_home变量(安装目录),值为:
C:
\ProgramFiles\Java\jdk1.6.0_14;此值为JDK的安装位置。
新建classpath变量(类加载路径),值为:
.;%java_home%\lib;%java_home%\lib\tools.jar
修改path变量(使得系统可以在任何路径下识别java命令),值为:
%java_home%\bin;%java_home%\jre\bin
1.1.2访问修饰符
Public:
任何地方可以访问
Private:
只有自身可以访问
Protected:
同一个包和子类可以访问
默认:
只有同一个包内可以访问
1.2对象的清理
1.2.1认识Java的自动垃圾回收
垃圾回收是Java语言的一大特性,方便了编程,是以消耗性能为代价的。
而垃圾在这里只无用的对象。
而C++是需要程序员自己写析构函数来释放内存的,麻烦,也有可能忘记而导致内存泄露。
Java语言对内存的分配管理是通过JVM内部机制决定的。
程序员可以不关心其处理。
1.2.2垃圾回收的原理和意义
Java虚拟机中有个称之为垃圾回收器的东西,实际上这个东西也许真正不存在,或者是已经集成到JVM中了,但这无关紧要,我们仍然可以称为为垃圾回收器。
垃圾回收器的作用是查找和回收(清理)无用的对象。
以便让JVM更有效的使用内存。
垃圾回收器的运行时间是不确定的,由JVM决定,在运行时是间歇执行的。
虽然可以通过System.gc()来强制回收垃圾,但是这个命令下达后无法保证JVM会立即响应执行,但经验表明,下达命令后,会在短期内执行你的请求。
JVM通常会感到内存紧缺时候去执行垃圾回收操作。
垃圾回收过于频繁会导致性能下降,过于稀疏会导致内存紧缺。
这个JVM会将其控制到最好,不用程序员担心。
但有些程序在短期会吃掉大量内存,而这些恐怖的对象很快使用结束了,这时候也许有必要强制下达一条垃圾回命令,这是很有必要的,以便有更多可用的物理内存。
从上面了解到,没有用的对象就是垃圾。
准确的说,当没有任何线程访问一个对象时,该对象就符合垃圾回收的条件。
对于String,存在一个字符串池,这个不属于本文讨论的范围,字符串池中的垃圾回收,算法和这里所讨论的垃圾回收完全是两码事。
但是不得不说的是,字符串的胡乱拼接,往往导致性能急剧下降,尤其是在庞大的循环语句中,拼接字符串就是在让程序慢性自杀。
这也是很多Java程序员容易犯的毛病。
字符串既然是池,就是为了缓冲,为了有更高的命中率,因此垃圾回收的频率也许会比JVM对象垃圾回收器要低很多。
垃圾回收器仅仅能做的是尽可能保证可用内存的使用效率,让可用内存得到高效的管理。
程序员可以影响垃圾回收的执行,但不能控制。
1.2.3通过编程影响垃圾回收
虽然程序员无法控制JVM的垃圾回收机制。
但是可以通过编程的手段来影响,影响的方法是,让对象符合垃圾回收条件。
分别说来有一下几种:
1、将无用对象赋值为null.
2、重新为引用变量赋值。
比如:
Personp=newPerson("aaa");
p=newPerson("bbb");
这样,newPerson("aaa")这个对象就是垃圾了——符合垃圾回收条件了。
3、让相互联系的对象称为“岛”对象
Personp1=newPerson("aaa");
Personp2=newPerson("bbb");
Personp3=newPerson("ccc");
p1=p2;p2=p3;p3=p1;
p1=null;p2=null;p3=null;
在没有对p1、p2、p3置null之前,它们之间是一种三角恋关系。
分别置null,三角恋关系依然存在,但是三个变量不在使用它们了。
三个Person对象就组成了一个孤岛,最后死在堆上——被垃圾回收掉。
1.2.4强制的垃圾回收System.gc()
实际上这里的强制,是程序员的意愿、建议,什么时候执行是JVM的垃圾回收器说了算。
调用垃圾回收也不一定能保证未使用的对象一定能从内存中删除。
唯一能保证的是,当你内存在极少的情况,垃圾回收器在程序抛出OutofMemaryException之前运行一次。
1.3集合
1.4文件流
1.4.1输出字节流
1.4.2输入字节流
1.4.3输入输出字符流
1.5网络
1.5.1TCP和UDP的区别
TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠的无差别错的数据传输。
UDP是无连接通信协议,UDP不保证可靠的数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据。
1.6多线程
1.6.1实现多线程
实现多线程:
继承自Thread类,可以重写run()方法去覆盖去Thread中的run()方法;实现Runnable接口并实现它的run()方法。
线程的优先级代表该线程的重要程度(不是绝对的),当有多个线程同时处于可执行状态并等待获得CPU时间时,线程调度系统根据各个线程的优先级来决定给谁分配CPU时间,优先级高的线程有更大的机会获得CPU时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。
1.6.2多线程方法的解释和区别
1.start()是启动一个线程。
2.join()是直到执行完(或强制执行一段时间)当前的线程后才往下执行主线程或其他的线程
3.stop()是停止当前的线程。
阻塞线程比较多
sleep()方法:
sleep()允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU时间,指定的时间一过,线程重新进入可执行状态。
可能给其他线程执行的机会(自私,睡着了,不释放锁,时间到了才放锁)
suspend()和resume()方法:
两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。
yield()方法:
yield()使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得CPU时间。
调用yield()的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。
不过yield()只能使同等级别的线程获取执行的机会(公平竞争,释放大家再次选举)。
而sleep(1000)使同级别或不同级别的都有可能。
wait()和notify()和notifyAll()方法是Object中定义的方法:
必须在synchronized代码块中使用,在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象的锁标志,进入等待的状态,并且可以调用notify()或者notifyAll()方法通知正在等待的其他线程。
notify()通知的是等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有数量。
几个方法配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notify()被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的notify()被调用。
1.6.3wait和sleep的区别
wait()在object类里定义;sleep()在Thread类里定义。
wait()方法只能放在同步方法或同步块中,表示资源同步时,线程需要等待。
sleep()方法可放在任何位置,表示当前线程睡眠。
wait()方法会释放对象锁;sleep()不会释放对象锁。
wait()方法要等待唤醒之后,线程才会继续执行。
sleep()则是休眠一段时间,线程自动恢复执行.
sleep()必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常
1.6.4notify()和notifyAll()的区别
notify()方法导致解除阻塞的线程是从因调用该对象的wait()方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
notifyAll()方法将把因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞。
当然,只有获得锁的那一个线程才能进入可执行状态。
1.6.5run和start的区别
run()方法:
在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:
启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;
start()方法是启动(即开辟)一个线程的方法,因此线程的启动必须通过此方法,
而run()方法,只是Thread类的一个方法,它本身并不能开辟线程。
1.7异常
运行时异常和Error是catch不了的。
throw和throws的区别
throw是抛出一个具体的异常类,产生一个异常。
throws则是在方法名后标出该方法会产生何种异常需要方法的使用者捕获并处理。
自定义异常必须继承Exception类。
1.8格式化
略
1.9数字运算
略
1.10正则表达式
1.10.1次数限定符
*0次或多次
+至少1次
?
0或1次
{n}指定n次
{n,}至少n次
{n,m}匹配n-m次
2、JAVA面向对象的基础知识
2.1面向对象的三个特征
2.1.1封装
属性是私有,方法的公开的。
自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2.1.2继承
它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
2.1.3多态
实现多态有2种方式:
静态多态(编译时的多态,在同一个类中)和动态多态(一个对象可以有多种类型)。
是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
一句话:
允许将子类对象赋值给父类的引用或父类指向子类的对象。
2.1.4总结
封装可以隐藏实现细节,使得代码模块化。
继承可以扩展已存在的代码模块(类)。
封装和继承属于代码重用。
多态是为了接口重用。
2.1.5继承、聚合、组合、关联的区别
继承很好理解,下图表示(实线):
实现也很好理解,下图表示(虚线):
依赖(代码中通常表示的是局部变量、方法参数、返回值),下图表示:
关联(代码中通常表示的类的属性),下图表示:
聚合(关联的一种,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;has-a,空心菱形),下图表示
组合(关联的一种,表示更强的关系,整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,contains-a,实心菱形),下图表示
2.2抽象、接口定义及区别
抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstractclass),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
不能创建abstract类的实例。
然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。
不能有抽像构造函数或抽像静态方法。
Abstract类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。
取而代之,在子类中实现该方法。
知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽像类的变体。
在接口中,所有方法都是抽像的。
多继承性可通过实现这样的接口而获得。
接口中的所有方法都是抽像的,没有一个有程序体。
接口只可以定义staticfinal成员变量。
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。
然后,它可以在实现了该接口的类的任何对像上调用接口的方法。
由于有抽像类,它允许使用接口名作为引用变量的类型。
通常的动态联编将生效。
引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。
2.3匿名类、内部类、匿名内部类
在一个类中定义另外一个类,这个类就叫做内部类或内置类(innerclass)。
内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
内部类不能用普通的方式访问。
内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
我们为什么使用内部类?
A、在内部类(innerclass)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。
B、内部类可以用于创建适配器类,适配器类是用于实现接口的类。
使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。
C、内部类的更多用法(匿名innerclass实现一个接口,不过切记最后那个分号;实现继承和接口实现时出现同名方法的问题;实现多重继承的功能)
2.4反射
这种动态的获取信息及动态调用方法的机制在Java中称为“反射”(reflection)。
Reflection是Java被视为动态(或准动态)语言的一个关键性质。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:
代表一个类;
Field类:
代表类的成员变量(成员变量也称为类的属性);
Method类:
代表类的方法;
Constructor类:
代表类的构造方法;
Array类:
提供了动态创建数组,以及访问数组的元素的静态方法;
在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。
Class类是ReflectionAPI中的核心类,它有以下方法:
getName():
获得类的完整名字;
getFields():
获得类的public类型的属性(包括继承的类的public属性);
getDeclaredFields():
获得类的所有属性;
getMethods():
获得类的public类型的方法;(包括继承的类的public方法);
getDeclaredMethods():
获得类的所有方法;
getMethod(Stringname,Class[]parameterTypes):
获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型;
getConstructors():
获得类的public类型的构造方法;
getConstructor(Class[]parameterTypes):
获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型;
newInstance():
通过类的不带参数的构造方法创建这个类的一个对象;
通过默认构造方法创建一个新对象:
ObjectobjectCopy=classType.getConstructor(newClass[]{}).newInstance(newObject[]{});
以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。
获得对象的所有属性:
Fieldfields[]=classType.getDeclaredFields();
Class类的getDeclaredFields()方法返回类的所有属性,包括public、protected、默认和private访问级别的属性。
Java允许我们从多种途径为一个class生成对应的Classobject
(一)运用getClass()方法
(二)运用Class.getSuperclass()方法
(三)运用静态方法Class.forName(),这个最常用
(四)运用.class语法
(五)运用原始包装类的TYPE方法
2.5浅复制和深复制
浅负责也叫浅克隆,深复制也叫深克隆。
克隆一般通过实现Cloneable中的clone方法来实现浅克隆和深克隆,但是深克隆有一个问题,如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。
业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。
由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,等于生成了一个完全克隆的对象。
绝!
这个方法的要求是对象(包括被引用对象)必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程中。
3、UML相关知识
3.1软件工程的生命周期
3.1.1软件工程的生命周期
需求捕获、系统分析与设计、系统实现、测试、维护
3.2.UML(UnifiedModelingLanguage)概述
3.3UML组成
视图(View)是一个或多个图组成的对系统某个角度的抽象
图(Diagram)是模型元素集的图形表示
模型元素(ModelElement)代表面向对象中的类、对象、接口、消息和关系的概念
通用机制(GeneralMechanism)用于表示其他信息,如注释、模型元素的语义等
3.4视图
视图由图组成,UML提供9种不同的视图,其中视图的包括
用例视图(强调系统功能)也称用户模型视图
用例图
逻辑视图(展现系统的静态或结构组成特征)也称为结构模型视图或静态视图
类图、对象图
并发视图(体现系统的动态或行为特征)也称为行为模型视图或动态视图
时序图、协作图、状态图、活动图
组件视图(体现系统实现的结构和行为特征)也成为实现模型视图
组件图
配置视图(体现系统实现的环境的结构和行为特征)也称环境模型视图或物理视图
配置图
3.5静态建模机制和动态建模机制
UML内容归纳为2大类:
静态建模机制和动态建模机制
静态建模机制包括用例图、类图、对象图、组件图、配置图、包等
动态建模机制包括时序图、协作图、状态图、活动图、消息等
3.6UML用来描述模型内容的有3种:
事物、关系、图(静态视图和动态视图)
主要说说事物和关系
事物包括如下
结构事物:
用例(椭圆)、类(矩形)、接口(圆心)、协作(虚椭圆)、活动类(粗线矩形)、组件、节点(资源:
电脑)
行为事物:
交互(通常画成带箭头的信息)、状态机(对象的一个或多个状态的集合)
组织事物:
包
辅助事物:
注释
关系:
关联、依赖、泛化、实现
3.7类与类关系
类(矩形:
名称、属性、操作、职责)
其中表示+、-、#是public、private、protected
关系
依赖(有方向的虚线):
使用依赖、抽象依赖、授权依赖、绑定依赖
泛化(父类和子类的关系):
描述了类之间的“isakindof”的关系,用子类指向父类的空心三角形箭头(实线)表示该关系。
泛
化使得多态成为可能。
关联:
描述一组具有相同结构特征、行为特征、关系和语义的链接。
关联的修饰有:
名称(描述关系的性质)、角色(职责)、多重性(0..n)、聚合(整体和部分,即hasa的关系)、
组合(是更强的关系,是另外一种聚合,整体有管理部分特有的职责并且有一致的生命周期)等。
实现:
实现规格说明和其实现间的关系。
它表示不继承结构而只继承行为。
大多数情况下,实现关系用来规定接口和实现接口的类或
组件之间的关系。
(带空心的箭头表示,线是虚线)
3.8类图
描述类、接口、协作以及它们之间关系的图。
类图包括7个元素:
类、接口、协作、依赖关系、泛化关系、实现关系以及关联关系
类图的作用:
对系统的词汇建模、对简单的协作建模、对逻辑数据库模式建模
3.9对象图
表示某一刻一组对象以及它们之间关系的图
3.10包图(略)
3.11用例视图
用例(UseCase):
对一个系统或一个应用的一种单一的使用方式所作的描述。
参与者(Actor):
系统外部的一个实体(可以说任何事物或人)
参与者之间的关系(泛化关系、包含关系、扩展关系)
3.12时序图
描述对象之间传递消息的时间顺序,他用来表示用例中的行为顺序,是强调消息时间的交互图
包括4个元素:
对象、生命线、激活、消息
3.13协作图
强调参与交互的各对象结构的信息。
协作图是一种类图。
协作图中包含3个元素:
对象、链、消息。
如图:
3.14状态图
通过类对象的生命周期建立模型来描述对象随时间变化的动态行为。
它包括:
状态和转换
注意:
初始状态:
实圆心、终止状态:
半实圆心。
状态机、状态、转化
其中状态包括:
名字、入口/出口动作、内部转换、延迟事件、子状态。
转换包括:
源状态、目标状态、出发事件、监护条件、动作
3.15活动图
描述一个过程或操作的步骤。
描述状态外,更突出活动
动作状态、活动状态、动作流、分支、分叉和汇合、泳道、对象流。
3.16组件图
描述软件组件及组件之间的关系。
包括:
组件、接口、关系(依赖、泛化、关联、实现)。
3.17配置图
显示软件系统运行的物理硬件。
包括节点(单个物理对象)、组件和关系(依赖和关联)
4、熟悉LINUX
(略)
5、SSH框架的配置及相关知识
5.1MVC
5.1.1简介
MVC模式的目的就是实现Web系统的职能分工。
Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。
View层用于与用户的交互,通常用JSP来实现。
Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
5.1.2MVC的优缺点
优点:
低耦合、高可复用性和可适用性、较低的生命周期成本、快速部署、可维护性、有利于软件工程化管理。
缺点:
原理较复杂花费时间思考、程序分成三个部分需要管理更多的文件。
5.1.3MVC的现有框架
Struts:
Apache的,最流行的MVC组件
Struts2:
Apache用Struts和WebWork的组合出来的新产品,目前上升势头强劲
WebWork:
这个可是老牌的MVC组件,后来组合成了Struts2,不过自身仍在发展
SpringMVC:
SpringFramework自己整合自己Spring的优势推出的MVC组件,用户也不少。
JSF:
这个是一个规范,Sun的和Apache的都有各自的实现。
用户量很大,被众多IDE支持。
5.1.4Model1和Model2
Model1是将业务、控制、视图都放在jsp页面、Model