java面试经历之笔试题

面试java开发岗位收到面试邀请,一般都会有笔试题。以下是本人面试的一些笔试题目记录一下

2月26日面试题·················································

一、Java

1.以下不属于面向对象特征的基本特点的是( B

A封装性   B模块性  C多态性  D继承性 

2.在java中,表示换行符的转义字符是(A

A /n    B /f    C 'n'    D /dd

3.下列关于栈道描述错误的是(B

A 栈是先进后出的线性表   

B 栈只能顺序存储

C 栈具有记忆作用

D 对栈的插入与删除操作中,不需要改变栈底指针

解析:栈的存储结构是顺序存储和链式存储,故B错

4.在java中,能实现多重继承效果的方式是( C

A 内部类   B 适配器    C 接口   D 同步

解析:类可以实现多个接口从而达到多重继承的效果

5.下列关于线程优先级的说法中,正确的是( C

A 线程的优先级是不能改变的

B 线程的优先级是在创建线程时设置的

C 在创建线程后的任何时候都可以设置

D B和C

6.为了使模块尽可能独立,要求(B

A 模块的内聚程度尽可能高,且各模块间的耦合程度要尽可能强

B 模块的内聚程度尽可能高,且各模块间的耦合程度要尽可能弱

C 模块的内聚程度尽可能低,且各模块间的耦合程度要尽可能强

D 模块的内聚程度尽可能低,且各模块间的耦合程度要尽可能弱

二、数据库

班级表 t_class

班级代码             班级名称

1                           一年级

2                          二年级

分数表 t_scores

班级代码              学生                   科目                分数

1                            小明                   数学                90

1                            小明                   语文                60

2                           小红                   数学                80

2                           小红                   语文                70

2                           小刚                   数学                60

2                           小刚                   语文                50

1.统计查询每个学生的总分?

select name as 学生,
sum(case when subject='语文' then grade else 0 end) as 语文,
sum(case when subject='数学' then grade else 0 end) as 数学,
sum(grade) as 总分
from t_scores group by name

java面试经历之笔试题_第1张图片

或者

select name as 学生,                                           

sum(grade) as 总分
from t_scores group by name  

java面试经历之笔试题_第2张图片  

2.统计查询总分大于150分的学生?

select name as 学生,sum(grade) as 总分
from t_scores group by name having sum(grade)>150;  

  注: 学生的总分最大是150所以查不到数据可以在后面加个等于就有2条了

3.统计多少个学生?

select count(distinct name) as 学生个数 from t_scores ;

java面试经历之笔试题_第3张图片

4.统计每个班级多少个学生?

select c.code as 班级id,c.codeName as 班级名称,count(distinct s.name) as 个数 from 
t_scores s 
LEFT JOIN
t_class c 
on s.code =c.code 
group by  c.code;

java面试经历之笔试题_第4张图片

2月27日上午面试···························································

1.请列举一下你所熟悉的JAVA的基本数据类型?

整型:byte、short、int、long              浮点型:float、double     字符型:char            布尔型:bolean

2.请简述一下hibernate的原理?

hibernate是对jdbc进一步封装,简化了数据库访问层的重复代码。

工作原理:1.通过Configuration config = new  Configuration.configure(); //读取并解析Hibernate.cfg.xml配置文件

--2.由hibernate.cfg.xml中的; //读取并解析映射信息

--3.通过SessionFactory sf = config.buildSessionFactory(); //创建SessionFactory;

--4.Session session = sf.openSession(); //打开Session

--5.Transaction tx = session.beginTransaction(); //创建并开启事物Transaction

--6.persistent operate //操作数据,持久化操作

--7.tx.commint(); //提交事物

--8.关闭Session

--9.关闭sessionFactory

3.请简述list、set、map的区别?

list、set实现了Collection接口

list:1.可以允许重复的对象。2.可以插入多个null元素。3.是一个有序容器,怎么插入就怎么输出。4.实现类有ArrayList、LinkedList和Vector。ArrayList最流行,它提供了使用索引随意访问,而LinkedList则对经常从list中添加或删除元素的场景更适合。

set:1.不允许重复元素。2无序的容器,你无法保证每个元素的存储顺序,Treeset通过Comparator或者Comparable维护了一个排序顺序。3.只允许一个null元素4.set实现了Hashset、LinkedHashset以及Treeset。最流行的是基于HashMap实现的Hashset;TreeSet实现了SortedSet接口,因此TreeSet根据其Compare()和CompareTo()的定义进行排序的有序容器。

map:它表示Collection的子接口或实现类。map是一个接口。map的每个Entry都持有俩个对象,也就是一个键一个值,map可能会持有相同的值但键对象必须是唯一的。TreeMap也通过Comparator或者Comparable维护了一个排序顺序。map里你可以拥有随意个null值但键最多只有一个null键。Map实现类是HashMap、LinkedHashMap、Hashtable和TreeMap(HashMap、TreeMap最常用)

4.请简述ArrayList和LinkedList的存储方式?如果进行大量的删除和插入你会选取哪种?

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。ArrayList适合查询索引,LinkedList适合频繁增删

5.请举例说明SQL中的左外连接和内连接的区别

内连接是匹配两表中共有的行,左外连接指左表的某行在右表中没有匹配行则在相关联的结果集中右表列为空

6.请简述一下你所熟悉的设计模式?设计模式中观察者模式的设计思想是什么?

单例模式、工厂模式、代理模式、适配器模式

观察者模式其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到消息,没订阅就收不到消息

7.JAVA排序算法有哪些?简述其中的一个算法

java中有冒泡排序和快速排序为典型的排序算法。其中冒泡排序是相邻的元素相比较然后调换位置,然后最大或最小的数就在最后了,这个数就不用在参与比较,在按照之前的方式比较换位最后得出排序结果。

8. select a,b from table where a = ‘1’ GROUP BY a; 指出这条sql语句的错误

‘’这个符号是非法符号,应该是' ' 单引号

9.public、private、protected以及不写时的作用域?

pubilc :所有包下       protected:当前包下及子类中        不写指default:同包下          private:当前类

10.如何将数值类型转换为数字(Integer,Double)?

使用 Integer.parseInt()和Double.parseDouble()方法

11.String和StringBuffer的区别

String:是对象不是原始类型。为不可变对象,一旦被创建就不能修改,对于已经存在的对象修改都是创建一个新对象,然后把新值放进去。被final修饰的类不能被继承

StringBuffer:是可变对象,对它修改不会重新创建对象。它通过构造函数来建立对象,被创建后值内存中分配内存空间,并初始化保存一个null。赋值通过append方法

12. 下列符合代码规范的是( c

a. class 类命名:order.java                               b. 字段命名:private String OrderCode;//订单编号

c. 包名命名:com.cn.base                                d. 方法名:private void OrderStore() {.....}

13 写一条死循环换行打印 1 的java代码

这个比较简单,可以用for循环也可以while循环,只要条件永远成立就可以了。如下

public class test1 {
    public static void main(String[] args) { 
int i = 10;
        while (i >1){
            System.out.println(1);
        }
    }
}

14. Set里的元素是不能重复的,那么用什么方法来区别重复与否呢?是用==还是equeals来区别?用contains来区分是否有重复对象。还是都不用?

在比较时先调用hashcode方法,如果不同,证明不等。

如果相同,在调用equals方法,如果equals相同则相等,不同则不等。

==主要用最基本数据类型及引用

equals主要是对象或对象引用的比较

集合中是否包含某一元素用contains来判断;

二。常用的SQL语法

有一个学生管理系统中有班级表 t_class 和学生表 t_student 两张表,其中一个班级对应很多个学生,表的字段如下:

t_class

Id 自动增长

Code (数值型) 班级编号

Name 班主任名称

boyCount  男生数量

girlCount  女生数量

 

t_student

id 自动增长                class_id 对应 T_class中的ID 

age  年龄

sex。性别

point 期末分数

1.查询出男生最多的班主任名称

select Name from t_class where boyCount = ( select max(boyCount) from t_class )

2.查询出班级编号最小的班主任名称

select Name from t_class where Code = ( select min(Code) from t_class )

3.统计一共有多少班级

 select distinct count(Code) from t_class

4.用t_student中的男学生数量更新t_class中的男生数量

update t_class t set  boyCount = (select count(Code) as boyCount from t_student where t.Code = Code group by Code )

5.查询期末分数最高的班主任名称

select a.Code,b.Name from (select Code,sum(point) as score from t_student group by Code) a join t_class b on a.Code = b.Code where a.score =(select max(t.score) from (select Code,sum(point) as score from t_student group by Code)t)

6.求出班级的平均分数

select avg(point) as score from t_student group by Code;

注:我个人感觉这个题目有问题,所以我这学生表中加入了Code字段

java面试经历之笔试题_第5张图片

三。请简述一下当你在开发过程中遇到问题时解决思路

这个是开放性的问题,可以自由回答。

四。看图,填写框框里面的值并写出思路

[    3.5      ]   x    [    2.0      ] = 7

     +                          x         

[     8.5     ]    -   [    3.5     ]   = 5  

      ||                        ||        

     12                        7

这个其实可以用二元一次方程解出来,其实就是几个等式。

2月27日下午面试···························································

一选择题

1.下列方法中,哪些是正确的main方法(应用程序的入口)(一个或多个)b、d

a.public static void main()

b.public static void main(string arg[])

c.public void main(string [] arg)

d.public static void main(string [] args)

e.public static int main(string [] arg)

解析:main方法必须是 public static void main 公共的 静态的 没有返回值 参数是string数组,b和c写法不一样但都是string数组

2.执行 int[] x = new int[25];后,下列选项哪些是正确的?(一个或多个)a、e

a. x[24] is 0

b. x[24] is undefined                          注:不明确的;未下定义的

c. x[25] is 0

d. x[0] is null

e. x.length is 25

解析:数组的默认值全部为零,并且长度是25,c下标越界异常最大24下标从零开始的

3.阅读如下代码

1.class Q6

2.    public static void main(String[] args) {

3.            Holder h = new Holder();
4.             h.held = 100;
5.             h.bump(h);
6.            System.out.println(h.held);

7.     }

8.    }

9.

10.class Holder{

11.public int held;

12.public void bump(Holder theHoder){

 13.    theHoder.held++;

14.}

15.}

第六行输出的值是什么?  d

a.0

b.1

c.100

d.101

e.102

4.下列男性选项可以编译成功,且运行时,打印“Equal”?(一个或多个)a、b、e

a.  int x = 100; float y = 100.0F;

if (x == y){ System.out.println("Equal");}

b.  int x = 100; integer y = new integer(100);

if (x == y){ System.out.println("Equal");}

c.   integer x = new integer(100); integer  y = new integer(100);

if (x == y){ System.out.println("Equal");}

d.  String x = new String("100"); String y = new String("100")

if (x == y){ System.out.println("Equal");}

e.  String x = "100" ; String y = "100";

if (x == y){ System.out.println("Equal");}

解析:==比较的首地址值,c和d创建了2个新对象在堆上地址值就不同,其他的都是值常量池里面的

5.下列声明哪些是不合法的?(一个或多个)a、d、e

a.  default String s;

b. transient int i = 41;

c. public final static native int w();

d. abstract double d;

e. abstract final double hyperbolicCosine();

解析:default在java不是修饰词,一般在switch中使用。abstract 是修饰方法的, 表示该方法交给子类去实现。final修饰方法表示方法不能被修改, 然而abstract表示叫子类去修改和实现,矛盾

6.下列代码中,不能通过编译的是哪行?第7行 object转换成floar需要强制类型转换

1.Object ob = new Object();
2.String stringarr[] =new String[50];
3.Float floater = new Float(3.14f);
4.
5.ob = stringarr;
6.ob = stringarr[5];
7.floater = ob;
8.ob =floater;
1.int j = 2;
2.switch (j){
3.    case 2:
4.    System.out.println("value is two");
5.    case 2+1:
6        System.out.println("value is three");
7.    break;
8.    default:
9.        System.out.println("value is "+ j);
10.        break;
11.}

7.以下哪个选项是正确的?  d   

a. 代码是非法的,因为第5行有错误。

b.对于 switch(j),变量 j 可以是 byte,short,int,long中的任何一个;

c. 代码输出的结果是:value is two 

d. 代码输出的结果是:value is two     value  is three

e. 代码输出的结果是:value is two     value  is three   value is 2.

解析:a错误第5行没有错,b中的long不兼容类型转换异常,不写break会穿透到下一个break

8.阅读如下代码:

1.class Greebo extends java.util.Vector
2.  implements Runnable{
3.    public void run(String message){
4.        System.out.println("in run() method:"+
5.        message);
6.    }
7.}
8.
9.class GreeboTest{
10.    public static void main(String[] args) {
11.        Greebo g = new Greebo();
12.        Thread t= new Thread(g);
13.        t.start();
14.    }
15.}

下列哪个选项是正确的  a

a. 编译错误,因为Greebo类没有正确的实现Runnable接口。

b. 第12行会发生编译错误,因为你不能传递一个参数到Thread的构造方法

c .可以通过编译,但在运行时,在第12行会崩溃;

d. 可以通过编译,但在运行时,在第13行会崩溃;

e. 可以通过编译且运行正常

注:编译会出现以下异常 

java: Greebo不是抽象的, 并且未覆盖java.lang.Runnable中的抽象方法run()

二、SQL题

本题目的表结构如下:

表1、学生表(表名:student)

java面试经历之笔试题_第6张图片

表2、课程表(表名:course)

java面试经历之笔试题_第7张图片

表3、学生_课程关系表(表名s_c_score)

表4、教师表(表名:teacher)

1.查询学过“语文”并且也学过“数学”的同学的学号、姓名;

SELECT
    aa.sid,
    s.sname 
FROM
    (
    SELECT
        sc.sid,
        c.cid
        from 
        s_c_score sc
        INNER JOIN course c ON sc.cid = c.cid 
    WHERE
        c.cname IN ( "数学","语文" ) 
    ) aa
    INNER JOIN student s ON s.sid = aa.sid 
GROUP BY
    aa.sid

HAVING
    count( aa.sid    ) > 1;

2.查询学过“叶平”老师所教的所有课的同学的学号、姓名;

select sid
-- 子查询的结果必须要有一个别名t!!!!  虽然没多大作用  但是这个别名是必须的!!!!
from (
    -- 学过该老师课程的同学学号(包含只学一门)
    select sid,count(cid) num
    from s_c_score
    where cid in (
        -- 该老师教了哪些课程
        select cid
        from course
        where tid in (
            select tid
            from teacher
            where tname = '叶平'
        )
    )group by sid
) t
where t.num = (
    -- 统计该老师总课程数
    select count(cid)
    from course
    where tid = (
        select tid
        from teacher
        where tname = '叶平'
    )
)

3.查询“数学”成绩比“语文”成绩低的所有同学的学号、姓名;

SELECT
    y.sid 
FROM
    ( SELECT sid, score FROM s_c_score WHERE cid = ( SELECT cid FROM course WHERE cname = "语文" ) ) y
    JOIN ( SELECT sid, score FROM s_c_score WHERE cid = ( SELECT cid FROM course WHERE cname = "数学" ) ) s ON y.sid = s.sid 
    AND y.score > s.score;

三、问答题

1.请阐述你对对象锁、sleep、wait、notify、notifyAll的理解

对象锁就是常说的同步锁——synchronized。监视器或者说其所有权我也理解为对象锁,毕竟锁住后就拥有权利了

sleep() 是Thread类中静态方法,可以在任何地方使用

wait、notify、notifyAll只能在同步控制方法或同步控制块中使用,这些事object类中的方法

sleep()并没有释放锁,所以仍处于同步状态,监控仍然存在,睡眠时间结束自动恢复运行

wait()释放掉锁,所以不再处于同步状态

notify()会唤醒等待池中的一个线程

notifyAll()会唤醒等待池中的所有线程

2.StringBuilder与StringBuffer的区别是什么?你工作中用的最多是哪个?为什么?

区别:StringBuilder是线程不同步的不安全,但速度快,适合单线程

           StringBuffer是线程同步的线程安全,但效率低,适合多线程

大多数情况下是在单线程下进行操作,所以建议使用StringBuilder,因为速度快

四、编码题

1.用你熟悉的编程语言编写冒泡排序算法或者选择排序算法; (我写的是经典的冒泡排序)

public class Bubbling {
    public static void main(String[] args) {
        int[] arr={1,3,3,54,64,54,7,65,24,25,65,75,2,4,7,87,89,4,6} ;
        System.out.println("待排序的数组");
        for (int num:arr){
            System.out.print(num+",");
        }
        for (int i=0;i arr[j+1]){
                    int temp;
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println();
        System.out.println("经过排序后的数组");
        for (int num:arr){
            System.out.print(num+",");
        }
    }
}

3月14日面试题

1.JDK、JRE、JVM关系是什么

JDK包含JRE,JRE包含JVM。JDK是java开发所需的环境,JRE只能运行class文件程序没有编译功能。JVM既虚拟机java运行环境

2.对象的初始化顺序

没有继承情况下的初始化顺序:一般顺序为 先静态,后非静态,先变量,后初始化块,再是构造方法

继承情况下的初始化顺序:1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。

                                               2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

                                               3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。

                                               4. 执行父类的构造方法。

                                               5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

                                               6.执行子类的构造方法。      

3.jsp有哪些内置对象? 作用分别是什么?

Page,pageContext,request,response,session,application,out,config,exception

Page 指被jsp翻译的servlet对象的引用

pageContext 对象用来获取其他8个内置对象,存的值是当前页面范围  

request 请求对象用于获取服务器信息,存的值作用范围在一次请求中

response 响应对象,代表服务器返回浏览器的数据

session  代表一次会话,保存用户私密信息,可以当域对象使用                 

application 整个应用范围,使用这个对象保存信息中整个应用中都有效

out  先页面输出内容的对象           

config 指servletconfig 获得servlet配置的对象

exception  用来获取页面错误信息的

或者

- request:封装客户端的请求,其中包含来自GET或POST请求的参数; 
- response:封装服务器对客户端的响应; 
- pageContext:通过该对象可以获取其他对象; 
- session:封装用户会话的对象; 
- application:封装服务器运行环境的对象; 
- out:输出服务器响应的输出流对象; 
- config:Web应用的配置对象; 
- page:JSP页面本身(相当于Java程序中的this); 
- exception:封装页面抛出异常的对象。

4.switch语句能否作用在byte上,能否作用在long上,能否作用在String上

switch可作用于char byte short int及对应的包装类,不可作用于long double float boolean,包括他们的包装类。jdk1.7之后才可以作用在string上。

5. if(a+1.0=4.0),这样做好吗?

不好,因为计算机在浮点型数据运算的时候,会有误差,尽量在布尔表达式中不使用浮点型数据(if,while,switch中判断条件不使用浮点型)

6.在异常捕捉时,如果发生异常,那么try.catch.finally块外的retun语句会执行吗?

会执行的

7.写几个线程安全类,不安全的,支持排序的类命?

安全类:Vector、Hashtable、stack

不安全类:ArrayList、LinkedList、HashSet、HashMap等

支持排序类:HashSet、LinkedHashSet、TreeSet以及实现Set接口的类都支持排序

8. BIO、NIO 和AIO的区别

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

BIO是一个连接一个线程

NIO是一个请求一个线程

AIO是一个有效请求一个线程

9.TCP、UDP的区别

区别:1.tcp协议基于连接,udp协议基于无连接;2.对系统资源的要求(tcp占的资源相比于udp较多);3.udp可能会丢包,tcp不会并且tcp保证数据顺序,udp不保证。

10.解释Spring支持的几种bean的作用域

11.Netty的IO结构是什么?

12.用redis做过什么?redis集群如何同步?

13.TCP 粘包/拆包的原因及解决办法

原因:1.要发送的数据大于tcp发送缓冲区剩余空间大小,将发生拆包;

2.待发送数据大于mss(最大报文长度),tcp在传输前将进行拆包;

3.要发送的数据小于tcp发送缓冲区的大小,tcp将多次写入缓冲区的数据一次发送出去,将发生粘包;

4.接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;

解决方法:1.发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端着接收数据后,通过读取包首部的长度字段便知道每一个数据包的实际长度了。

2.发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从缓冲区中读取固定长度的数据就自然而然把每个数据包拆分开来。

3.可以在数据包之间设置边界,如添加特殊符号,这样接收端通过这个边界就可以将不同的数据包拆分开来。

14.什么是索引?什么条件适合建立索引?什么条件不适合建立索引?

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中特定信息。

适合建索引的:1.主键自增建立唯一索引

2.频繁查询条件的字段应创建索引

3.查询中与其他表有关联的字段,如外键关系

4.查询中排序的字段创建索引大大提高排序速度

不适合建立索引的:1.频繁更新的字段不适合,需要更新索引

2.where条件里用不到的字段,不创建索引

3.表记录太少,不需要创建索引

4.经常增删改的表,不创建索引

15.请写出下面几个表达式的结果,答案可以用10进制或16进制书写

   1)0x55 | 0xaa

      255

  2)  10 ^ 12

     6

  3)  15 & 240 

    0

  4) -2 >> 1

     -1

  5)  -2 >>> 1 

     2147483647

16. 写一个函数,把连续的字符串进行压缩,无需考虑编码

17. 几万人并发抢票怎么实现?

18. 项目中遇到哪些比较有挑战性的问题,是如何解决的?

-目前没太多时间还在面试中,以后可能更新,java面试重点:多线程高并发、IO流、spring的ioc与aop原理、项目框架、sql优化JVMList,set,map集合框架等等

本人入坑Java编程时间不长,以上题是个人查找资料得出的不一定准确,如有发现错误的地方还望指正,谢谢!

你可能感兴趣的:(java,java,面试题)