Java上市公司笔试题目及答案分析
一 、选择题(不定项选题)
1下面说法正确的是( C )
A.Java中包的主要作用是实现跨平台功能 B.package语句只能放在import语句后
C.包(package)是由一组类(class) 和 接口(inter'face)组成 D.无
2 不能用来修饰interface的有( ACD ) A private B public C protected D static
3 在Java语言中,下列关于字符编码和国际化的叙述,哪些是正确的( CD)
A每个中文字符占用2个字节,每个英文字符占用1个字节
B假设数据库中的字符是以GBK编码的,那么显示数据库数据的网页也必须是GBK编码的。
CJava的char类型,通常以UTF-16 Big Endian的方式保存一个字符。
D实现国际化应用常用的手段是利用ResourceBundle类 解析:
1.不同的编码格式,字符所占用的字节数是不一样的。如GBK中每个中文占用2个字节,UTF-8中则是变长编码,可能占用3个字节或者4个字节。因此A不正确。 2.不同的编码方式之间是可以转换的,如果数据库GBK编码,页面上可以使用任意支持汉字编码的编码方式显示都可以,只要在向页面传输的数据过程中进行编码的转换即可。如:数据库是GBK,页面上是UTF-8,那么可以这样转换:实例代码以java语法编写
4下面代码的执行结果是( C )
public class TestDemo { public static void main(String[] args) { System.out.println(test1()); } public static int test1() { int x = 10; try {
}
}
x = 20; System.out.println(10/0); return x;
} catch (Exception e) { x = 30; return x; }finally { x = 40; }
A 10 B 20 C 30 D 40
5关于springmvc的核心控制器DispatcherServlet的作用,以下说法错误的是(C)
A 它负责接收HTTP请求 B加载配置文件 C实现业务操作
D初始化上下应用对象ApplicationContext 解析:
SpringMVC是Spring中的模块,它实现了mvc设计模式,
首先用户发起请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handle,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handle进行处理并返回给前端控制器一个
modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染,并把数据装入到request域,返回给用户。
DispatcherServlet作为SpringMVC的前端控制器,负责接收用户的请求,并根据用户的请求返回相应的视图给用户。实现业务在service层,所以c答案错误
二 、简答题 1 进程和线程的区别是什么?
进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的
资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 1、简而言之,一个程序至少有一个进程,一个进程至少有一个线程。 2、线程的划分尺度小于进程,使得多线程程序的并发性高。
3、 另外,进程在执行过程中拥有的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 4、 线程在执行过程中与进程还是有区别的。每个的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5、从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有的执行序列。
2 解释一下什么叫AOP? AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
3 ArrayList和LinkedList有什么区别? 1、ArrayList和LinkedList可想从名字分析,它们一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。
前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
2、当随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
3、当对数据进行增加和删除的操作时(add和remove操作),LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
4、从利用效率来看,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。 5、ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开
销在于需要存储结点信息以及结点指针信息。
4 cookie 和 session 有什么区别? 1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。Session用来追踪。 2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。 所以,总结一下:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
5 列举几种设计模式并解释 设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要
暴露该对象的内部表示。 七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。 十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。 二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以的变化。 二十三、Flyweight,享元模式
23种设计模式要在这里详细的都说一遍内容实在太多了啊,推荐你一本好书《软件秘笈:设计模式那点事》,里面讲解的23中设计模式例子很生动,容易理解,还有JDK中设计模式应用情况,看了收获挺大的!百度里面搜“设计模式”,第一条中设计模式百度百科中就有首推该图书,浏览量在20几万以上的,不会错的。
三 、 编程题
1使用插入排序对数组进行排序
void insertSort(int[] arr){ }
解析:public static void main(String[] args) throws Exception { int[] arr={5,2,3,4,9,8,7,1}; insertSort(arr); } /**
* @param array插入排序算法待排数组 */
static void insertSort(int ...array){ int i,j,temp;
for(i=1;ifor(j=i-1;j!=-1&&array[j]>temp;j--){ array[j+1]=array[j]; }array[j+1]=temp; } }
for(int item:array) out.print(item+\" \"); }
2 编写程序在控制台输出波菲拉契数列前20项(数列特征:1、1、2、3、5、8、13、21...)
解析下面是通过递归实现的计算前20项的代码,如果要计算前100项,只需要把主
方法里面的20改成100就行。如果没必要的话,建议你不要计算前100项,因为数据太过庞大。
public class SumFib {
public long fid(int n){ if((n==1)||(n==2)){ return 1;
} else{
return fid(n-1)+fid(n-2); //递归调用 } }
public void prinSum(int n){ long sum=0L; for(int i=1;i<=n;i++){ sum+=fid(i); //求和 //System.out.println(fid(i)); }
System.out.println(sum); }
public static void main(String[] args) {
new SumFib().prinSum(100); //实例化匿名对象并调用求和方法 } }
3 student(sno,sname,sage,ssex)学生表
course(cno,cname,tno)课程表 sc(sno,cno,score)成绩表 teacher(tno,tname)教师表
1. 数据库三范式是什么?
2. 查询学过\"李四\"老师所教所有课程的所有同学的学号,姓名 3. 查询所有课程成绩小于60分的同学的学号,姓名
1解析:第一范式,又称1NF,它指的是在一个应用中的数据都可以组织成由行和列的表格形式,且表格的任意一个行列交叉点即单元格,都不可再划分为行和列的形式,实际上任意一张表格都满足1NF; 第二范式,又称2NF,它指的是在满足1NF的基础上,一张数据表中的任何非主键字段都全部依赖于主键字段,没有任何非主键字段只依赖于主键字段的一部分。即,可以由主键字段来唯一的确定一条记录。比如学号+课程号的联合主键,可以唯一的确定某个成绩是哪个学员的哪门课的成绩,缺少学号或者缺少课程号,都不能确定成绩的意义。 第三范式,又称3NF,它是指在满足2NF的基础上,数据表的任何非主键字段之间都不产生函数依赖,即非主键字段之间没有依赖关系,全部只依赖于主键字段。例如将学员姓名和所属班级名称放在同一张表中是不科学的,因为学员依赖于班级,可将学员信息和班级信息单独存放,以满足3NF
2 select DISTINCT st.sno,st.sname FROM student st,teacher te,course co,sc s WHERE te.tname='李四' AND s.sno = st.sno AND s.cno = co.cno AND co.tno = te.tno
3 select DISTINCT st.sno,st.sname FROM student st,teacher te,course co,sc s WHERE s.score<'60' AND s.sno = st.sno AND s.cno = co.cno