各大公司笔试面试经-Java软件工程师

最近陆续进行的校园招聘笔试和面试,由于没有好好准备,好多基础知识慢慢遗忘,在这里将笔试和面试遇见的问题记录下来,不定期更新。


立信集团--诚毅软件

1.群面时,给出一道题,是关于淘宝“双11”:题目大意是 “双11” 那天在第一个小时的用户访问,商品查询以及订单处理情况,出现的几个关键词是:吞吐率、响应时间、日PV、QPS等等,问为应对 ”双11“ 所使用的技术。

    小组讨论时,说到了负载均衡、分布式系统、多线程、页面静态化、原生JS、缓存、数据持久化以及连接池等技术。

    负载均衡:负载均衡是分布式系统架构设计中必须考虑的因素之一。通常是指,将请求/数据均匀分摊到多个操作单元上执行。提高了业务处理能力,保证业务的高可用性。

    页面静态化:题目中,用户访问商品详细页面次数达到14亿次,如此高频率的访问量,如果每一次用户请求访问,都要向数据库请求数据实在太耗费时间,因此可以将页面静态化,其中一种方法是是把页面加载成XML文件保存在web服务器,这样一来,用户再次请求时,不需要到数据库中查找信息,加快了页面打开浏览速度。

    分布式架构:分布式架构通常分为:客户端层、反向代理层、站点层、服务层、数据层.。 其中,客户端层-反向代理层的负载均衡,通过DNS轮询; 反向代理层-站点层的负载均衡,通过ngnix; 站点层-服务层的负载均衡,通过“服务连接池”实现; 数据层的负载均衡,通过“数据的负载均衡”与“请求的负载均衡”实现,常见的方式有“按照范围水平切分”和“按照id 哈希水平切分”。


盛鸿电气

2.纯虚函数、虚函数

    定义一个虚函数,不代表函数不可以被实现,定义函数为虚函数是为了允许利用基类的指针来调用子类的这个函数,从而达到多态的效果。 定义一个纯虚函数,才代表该函数没有被实现,定义函数为纯虚函数是为了实现一个接口,规范这个类的子类必须实现这个函数。

    虚函数的声明:virtual 类型 函数名 (参数列表);

    纯虚函数声明:virtual 类型 函数名 (参数列表)=0;

    引入纯虚函数的原因:方便使用多态特性;在很多情况下,基类本身生成对象是不合理的,将函数定义为纯虚函数,则编译器要求在派生类中必须予以重写以实现多态特性,同时含有纯虚函数的类成为抽象类,不能生成对象,用户只能创建其派生类的实例。


3.中断响应

    中断响应是指中央处理机发现已有中断请求时,中止、保存现行程序的执行,并自动引出中断处理程序的过程。

    包括识别中断源、保留现场、引出中断处理程序等过程。


4.OSI七层体系结构

    应用层、表现层、会话层、传输层、网络层、数据链路层、物理层。


5.Java语言的优缺点,Java与C++的区别

    Java优点:平台无关性、面向对象、简单、安全、分布性、稳定、开源、多线程

    Java缺点:需要运行环境,不适合开发桌面应用程序

    与C++的区别:Java不支持多重继承,但支持一个类继承多个接口

                             Java中没有指针的概念,但其实Java中处处是“指针”,且增添了自动内存管理功能

                             Java没有全局变量,但提供静态变量作为类中共同访问变量

                             Java的垃圾回收机制使得开发人员编程不需要关心内存的分配与回收

                             Java中的异常处理机制,用于捕获异常,增强系统的容错能力


6.静态变量与非静态变量的区别

                                                                                                                                  

    内存分配         静态变量: 类加载时便分配内存(堆),直到该类运行结束才消亡        非静态变量: 被实例化后才分配内存(栈)

    生存周期         静态变量:     与应用程序的生存周期相等                                                   非静态变量: 取决于实例化对象的生存周期

    调用方式         静态变量:    类.静态变量名 / 对象调用(一般不需要)                           非静态变量:  实例化对象直接访问

    共享方式         静态变量:   被类中所有实例对象共享,只有一份                                    非静态变量:   局部变量,不共享


7.override(覆盖/重写) 与 overload(重载) 的区别

    override 是指子类与父类中的某个方法,函数名和参数列表完全相同,通过子类创建的实例对象调用该方法时,将调用子类中定义的方法,体现的是父类子类的多态特性。

    overload 是指一个类中有多个函数名相同的方法,但是参数个数或者参数类型不同,体现的是一个类的多态特性。


8.抽象类与接口

    接口中的所有方法必须是抽象的,接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final类型。

    区别:

        抽象类可以有构造方法,接口中不能有构造方法

        抽象类中可以包含非抽象的普通方法,接口中的所有方法都是抽象的

        抽象类中可以有普通成员变量,接口中没有

        抽象类和接口都可以包含静态成员表变量,抽象类的静态成员变量访问类型可以任意,但是接口只能是public static final

        抽象类中可以包含静态方法,接口中不可以       

        一个类可以实现多个接口,但只能继承一个抽象类


9.String、StringBuffer、StringBuilder

    String:不可变类型,任何对String的改变其实都是产生了新的String对象

    StringBuffer:可变类型,支持并发操作,线程安全

    StringBuilder:可变类型,不支持并发操作,线程不安全,但在单线程中性能要高


武汉群硕

1.几种实现多态的方式,为什么要使用继承

    实现多态的三个必要条件:继承、重写、向上转型(父类引用指向子类对象)

    在Java中有两种实现多态的方式:继承与接口

    多态有运行时多态与编译时多态,编译时多态是静态的,主要是指方法的重载,它根据参数列表的不同来区分不同的函数;运行时多态是动态的,通过动态绑定实现。


2.C#与Java的区别

    两者都是面向对象编程,不同点:

   1)C#中的命名空间是namespace,类似于java中的package包,同时导入包java是import,C#是using

    2)从Main() 函数入口,C#写法是:

                                                                 static void Main(String[] args){ }

                                                                 static int Main(String[] args){ }

                                                                 static void Main(){ }

                                                                 static int Main(){ }

                                          java只有一种:static void main(String[] args){ }

    

3.多线程

    多线程技术允许同一程序中有两个以上的执行线路。Java语言支持多线程,允许多个线程共存于同一块内存中,且共享资源。CPU位每个线程轮流分配时间片,每个线程在分配的时间片内处理任务。


4.并发与并行

    并发执行是指若干个程序同时在系统中运行,这些程序的执行在时间上重叠的,一个程序尚未结束,另一个程序的执行已经开始。

    并行是指同时发生的多个并发事件,具有并发的含义,但是并发不一定并行,也就是说并发事件不一定是同一时刻发生。


5.Servlet是什么,可以单独运行吗

      运行在Web服务器端的小程序,不可以单独运行,因为没有main方法。可以完成如下功能:

    1)创建并返回一个基于客户请求的动态内容的完整HTML页面

    2)与其他服务器资源(数据库、基于java的应用、服务器文件等)进行通信

    3)对特殊的请求处理采用MIME类型过滤数据,例如图像转换和服务器包含(SSI)技术


5.doPost方法和doGet方法的区别

   1)get 是从服务器获取数据,post 是向服务器传送数据

   2)生成方式:

                  get 有四种:直接在地址栏输入URL / 网页超链接 / 设置form 表单的method为get / form 中的method为空时,默认为get

                  post 只有一种:form表单的method设置为post

   3)数据传送方式:

                  get:表单数据存放在URL后面,所有get方式提交时HTTP中没有消息体

                  post:表单数据存放在HTTP消息体中以实体的方式传送到服务器

   4)传送的数据量:get 有限制,post  适合大规模数据传送

   5)安全性:get <  post :get直接把数据显示在URL中,浏览器有缓冲,可记录用户信息;

                                                post提交数据时采用HTTP POST机制,将表单中的字段与值存放在HTTP HEADER内一起传送给URL,用户看不见


6.数据库的存储过程、索引

    存储过程:1)接受输入参数并以输出参数的形式将多个值返回至调用过程或批处理

                        2)包含执行数据库操作的编程语句

                        3)向调用过程或批处理返回状态值,以表明成功或失败

    优点: 1)重复使用

                 2)提高性能:存储过程在创建的时候就进行了便宜,将来使用的时候不用再重新编译。

                 3)减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称及参数就可以了

                 4)增加安全性:参数化的存储过程可以防止SQL注入攻击


7.JSP如何实现与后台的交互

    1)表单提交

    2)AJAX


8.事务的四个特征

    所谓事务就是用户定义的一个数据库操作序列,是一个不可分割的工作单位。

    1)原子性:一个事务中所包含的操作要么全部执行并且正常结束,要么什么都不做

    2)一致性:事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态

    3)隔离性:一个事务的执行不能被其他事务所干扰

    4)持久性:事务一旦提交,它对数据库中数据的改变就是持久的


最后一道脑筋急转弯:有一个5升和一个6升的桶,如何一次性的给他3升的水

首先,装满5升桶,将水全部倒入6升桶中,然后继续装满5升桶,将水倒入6升桶将其装满,这时5升桶里剩下4升水,然后倒掉6升桶的水,将4升水全部倒入6升桶中,再装满5升桶,最后倒进6升桶将其装满,这时5升桶里便剩下了3升水。


珍爱网

1.JVM

    Java虚拟机,实现了程序与操作系统的分离,从而实现了java的平台无关性。

    JVM逻辑内存模型如下:

   各大公司笔试面试经-Java软件工程师_第1张图片


其中:

堆内存:所有引用数据类型的真实信息(所有线程共享)

栈内存:基本数据类型、运算、指向堆的指针

方法区:已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(所有线程共享)

程序计数器:一个非常小的内存空间,看作是当前线程所执行的字节码的行号指示器

本地方法栈:为虚拟机使用搭配的Native方法服务


2.网络编程


3.JDK

    是面向java开发人员提供的开发运行环境,是开发人员用来构建java应用程序的软件包,包括java虚拟机(JVM)、java编译器(Javac)、java归档文件(JAR)、java文档等(javadoc)。


4.集合类

5.ArrayList和LinkedList

6.Map

7.垃圾回收机制

   1)什么时候?

                 当eden满了,Minor GC,主要是复制和标记-清除垃圾回收算法

                 升到老年代的对象大于老年代剩余空间时,Full GC,或者是小于时,HandlePromotionFailure参数强制GC,主要是标记-整理垃圾回收算法

    2)回收对象:

                  GC Root开始搜索,搜索不到的对象,而且经过第一次标记、清理后仍然没有复活的对象

    3)做什么:

       

8.TCP/UDP/Socket


9.Session/Cookie       

                  




    

你可能感兴趣的:(数据结构,java,MySQL)