Java基础笔试题

1、指出Servlet及jsp的作用及区别,并且说明Servlet的生命周期?

1.JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类。

JSP 工作原理:
JSP页面在执行的时候都会被服务器端的JSP引擎转换为Servelet(.java),然后又由JSP引擎调用Java编译器,将Servelet(.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。下面验证这一点:
有一个JSP页面Test.jsp,在浏览器地址栏中输入http://localhost:8080/Test.jsp,将会出现执行结果。同时在%CATALINA_HOME%/work/Catalina/localhost下多出两个文件:_Test_jsp.java和_Test_jsp.class,他们分别就是Servelet和Class文件。

2.Servlet的应用逻辑是在Java文件中,从Java代码中动态输出HTML,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

2、HTTP请求的GET与POST方式的区别?

1)  GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&

连接。URL 的编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非
ASCII 字符都要编码之后再传输。POST 请求:POST 请求会把请求的数据放置在
HTTP 请求包的包体中。因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则
不会

2)  传输数据的大小:在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限

制。但是在实际开发过程中,对于 GET,特定的浏览器和服务器对 URL 的长度有限
制。因此,在使用 GET 请求时,传输数据会受到 URL 长度的限制。对于 POST,由
于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST
提交数据大小进行限制,Apache、IIS 都有各自的配置。

3)  安全性 POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面

GET 提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,
在进行登录操作,通过 GET 请求,用户名和密码都会暴露再 URL 上,因为登录页面
有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码
就很容易被他人拿到了。除此之外,GET 请求提交的数据还可能会造成 Cross-site
request frogery 攻击


3、Request、Session及Application的生命周期分别是什么?

application

全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。

session

会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。

打开一个浏览器请求一个网站的页面后,Session开始,当session超过时间限制(一般是20分种)后,session注销而失效或是人为使用session.invalidate();使用session失效。

用浏览器打开一个web程序,一个浏览器窗口就会有一个session,且是唯一的,过了session的生存周期就没了,或者是你关了窗口也就没了。

不同浏览器的session在计算机中并不是同一个。

request

请求作用域,就是客户端的一次请求。比如访问某个页面,就是一次请求。页面访问结束,该页面的request就结束了


4、说说HTML中的innerHTML和innerText有什么区别?

innerHTML指的是从对象的起始位置到终止位置的全部内容,包括Html标签。
innerText   指的是从起始位置到终止位置的内容,但它去除Html标签。


5、Java中this与super关键字分别是什么意思?

this代表的是当前对象,可以是当前对象的方法、变量。
super代表的是父类,说白了就是在子类中通过super关键字来调用父类的东西。


6、以下两种字符串定义方式有什么区别?
    String Str1 = new String("hello");
    String Str2 = "hello";
    str1 == str2 是true还是false?


str1.equals(str2); 的结果为 true
str1 == str2 的结果也为false
请注意eqauls是比较两个对象内容是否相等, "==" 比较符是比较两者是否是同一个内存地址


7、Java变量分为静态变量、成员变量及局部变量,说明他们的生存周期及作用域?

存储区域:
全局变量(全局静态变量)是放在方法区中。
成员变量如果没有实例化那么变量是放在栈中;实例化了对象放在堆中,栈中放的是指向堆中对象的引用地址。
局部变量放在栈中,new的对象放在堆中,8中基本数据类型变量放在栈中,变量所对应的值是放在栈帧中。

生命周期:
全局变量:当类加载的时候,就开始被创建,在类中只有一份; 会跟着类的消失而消失,生存时间叫长。
成员变量:在对象被创建时而存在,当对象被GC回收的同时,他也会消失,生存时间适中。
局部变量:当方法被调用时而存在,当方法调用结束而消失,生存时间短。

作用域:
全局变量:作用整个类中,直接被类调用。
成员变量:作用在整个类中(除静态方法不能使用,静态方法没有隐式的this),被对象调用。
局部变量:作用在一个局部区域,比如说在一个方法中,方法调用。


8、Java中基本数据类型及引用数据类型有什么区别?

基本数据类型,包括数值型,字符型和布尔型。
数值型:1)整型:byte 1个字节;short 2个字节;int 4个字节;long 8个字节。
    2)浮点型:float 4个字节;
    double 8个字节;可以采用十进制和十六进制两种表示方式,其中十六进制表示方法只能采用科学计数法,例如:0x1.2p3,表示的是的是1乘以16加上2乘以16的-1次方的和乘以2的三次方;浮点型的默认类型为DOUBLE型,如果声明float型浮点数,要在数值后面加上f或F,例如:float
    f1 = 3.14F;否则会报精度错误。
字符型:char 采用unicod的16位编码方式进行编码。
布尔型:true,false;
引用数据类型:类、接口类型、数组类型、枚举类型、注解类型;

基本数据类型和引用数据类型的区别主要在存储方式上:

基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

 

9、Java在方法调用时,形参和实参什么时候是值传递,什么时候是引用传递?请列举几个实例?

形参:用来接收调用该方法时传递的参数。只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间。因此仅仅在方法内有效
public void sum(int a, int b) {...}
这里边的a,b就是形参
public void sum(1, 2) {...}
其中1和2就是实际的参数值,就叫实参

参数传递:
形参:方法声明时,方法小括号内的参数
实参: 调用方法时,实际传入的参数值

java中传递值得机制:
形参是基本数据类型的: 将实参的值传递给实参的基本数据类型的变量
形参是引用数据类型的: 将实参的引用类型的值(即在堆空间中生成的首地址的值)传递给形参的引用类型的变量


10、如果父类没有无参数的构造方法,那么其子类能否有无参数的构造方法?为什么?

你在Xx类里定义了一个带参数的构造方法,那么这个Xx类就没有无参数的构造方法了。

子类在继承父类时,如果没有相同的带参构造方法,那么他就需要在其构造方法中明确的通过super()调用父类的带参构造方法,否则构造不出父类,从而也构造不出他自己了。

你如果在父类中写个不带参数的构造方法,就可以不用实现父类的带参构造方法了。


11、子类中能否包含一个方法签名中只有返回类型与父类不一样的方法?为什么?
12、说明public、protected、private及default的区别?

public:具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类  对外的一种接口的形式。
protected:主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西
default:有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
private:访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。


13、char类型占几个字节,能否存在中文字符?

Java基本类型占用的字节数:
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
注:1字节(byte)=8位(bits)

1.编码与中文:
Unicode/GBK: 中文2字节
UTF-8: 中文通常3字节,在拓展B区之后的是4字节
综上,中文字符在编码中占用的字节数一般是2-4个字节。


14、Java什么时候会抛出NullPointerException?

空指针异常,null


15、列举几个常用的字节流及字符流?

Java的流体系十分庞大,我们来看看体系图:

 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图

详细请查看链接:JavaIO流原理之常用字节流和字符流详解以及Buffered高效的原理


16、java.util.Collection接口有哪些常用的实现类?

详细请查看链接:java.util.Collection包下各个类的特点汇总


17、使用final修饰符修饰的变量,是引用不能变还是引用的对象不能变?

总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

详细请查看链接:final修饰的变量是引用不能改变还是引用的对象不能改变
18、下面的代码有什么不妥之处?
    if(username.equals("Jim")){
        ...
    }

如果username为空的话,if(username.equals("zxx")){}会报出空指针异常。改为:
if("zxx".equals(username)){}比较妥当


19、运行异常与可检测异常有何区别?

详细请查看链接:java异常处理 Exception、error、运行时异常和一般异常有何异同


20、SQL语句中Where子句后面能否使用聚合函数?

详细请查看链接:SQL中where子句中不能出现聚合函数的原因


21、SQL语句中union和union all有什么不同?

UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复
1、UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]

2、UNION ALL 的语法如下:
[SQL 语句 1]
UNION ALL
[SQL 语句 2]

效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。


22、说说JDBC开发中Statement和PreparedStatement的区别?

类似mybatis # 与 $ 的区别,防注入攻击

详细请查看链接:浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣


23、java.util.Date和java.sql.Date有什么区别

详细请查看链接:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
24、JS中undfined和null有什么区别?

undfined 未定义 null 空值

详细请查看链接:Javascript 中 null、NaN和undefined的区别
25、下面代码有没有错误,为什么?
     var a = [];
     a[0] = 1;
     a[10000] = "this is element 10000";

26、MySQL、Oracle和SQL Server的分页查询语句

假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql、Oracle和SQL Server分页查询student表。

Mysql的分页查询:
SELECT
    *
FROM
    student
LIMIT (PageNo - 1) * PageSize,PageSize;
理解:(Limit n,m)  =>从第n行开始取m条记录,n从0开始算。

Oracel的分页查询:
SELECT
    *
FROM
    (
        SELECT
            ROWNUM rn ,*
        FROM
            student
        WHERE
            Rownum <= pageNo * pageSize
    )
WHERE
    rn > (pageNo - 1) * pageSize
理解:假设pageNo = 1,pageSize = 10,先从student表取出行号小于等于10的记录,然后再从这些记录取出rn大于0的记录,从而达到分页目的。ROWNUM从1开始。

SQL Server分页查询:
SELECT
    TOP PageSize *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY id ASC) RowNumber ,*
        FROM
            student
    ) A
WHERE
    A.RowNumber > (PageNo - 1) * PageSize
理解:假设pageNo = 1,pageSize = 10,先按照student表的id升序排序,rownumber作为行号,然后再取出从第1行开始的10条记录。

<think>好的,我现在要帮用户生成关于Java基础笔试题。首先,我需要考虑用户的需求是什么。用户之前已经询问过线上问题排查的题目,现在转向Java基础,可能是在准备面试或者笔试材料,针对的是初级或中级开发者的岗位。 接下来,我需要确定Java基础的核心知识点。通常包括数据类型、面向对象、集合框架、异常处理、多线程、IO、JVM基础等。然后要设计不同题型的题目,比如选择题、简答题、代码题,来覆盖这些知识点。 选择题部分,应该涵盖常见但容易出错的概念,比如基本数据类型的默认值、String的不可变性、集合类的特性。例如,short的默认值是0,而很多开发者可能误以为是其他值。String的问题可以考察对字符串池的理解。 简答题需要考察对核心概念的理解,比如重载和重写的区别,ArrayList和LinkedList的区别,以及final关键字的用法。这些都是面试中常见的问题,能有效检验基础知识。 代码题方面,要考虑代码的输出结果,比如多线程中的线程安全问题和静态变量的使用。此外,单例模式是一个经典的设计模式题,需要确保线程安全和延迟加载。 最后,参考答案部分需要准确且简洁,特别是代码题要给出正确实现,比如双重检查锁定的单例模式。同时,考察点要明确,让用户知道题目设计的意图,比如面向对象、集合框架、多线程等。 需要确保题目难度适中,覆盖全面,并且没有错误。同时,用户可能需要题目用于笔试,所以格式要清晰,结构合理。可能还需要考虑题目的数量和多样性,确保能全面评估候选人的基础能力。</think>--- ### **Java 基础笔试题(面向初级/中级开发)** **题目名称**:Java 核心语法与特性考察 --- #### **一、选择题**(每题2分,共10分) 1. 以下代码的输出结果是什么? ```java short s = 10; s = s + 5; System.out.println(s); ``` A. 15 B. 编译错误 C. 10 D. 运行时异常 2. 关于 `String` 类,以下说法正确的是: A. `String` 是基本数据类型 B. `String s = new String("abc");` 会创建2个对象 C. `String` 的 `equals()` 方法比较的是对象地址 D. `StringBuffer` 是线程安全的,`StringBuilder` 是非线程安全的 3. 以下集合类中,允许存储 `null` 值的是: A. `TreeSet` B. `ConcurrentHashMap` C. `Hashtable` D. `ArrayList` 4. 以下代码的输出结果是什么? ```java public class Test { public static void main(String[] args) { int i = 0; System.out.println(i++ + ++i); } } ``` A. 0 B. 1 C. 2 D. 3 5. 关于 `try-catch-finally`,以下说法正确的是: A. `finally` 中的代码一定会执行 B. `try` 可以单独使用,不写 `catch` 或 `finally` C. `catch` 块必须捕获 `Exception` 的子类 D. `finally` 中修改返回值会影响最终结果 --- #### **二、简答题**(每题5分,共20分) 1. **方法重载(Overload)和重写(Override)的区别**? 2. **`ArrayList` 和 `LinkedList` 的底层实现及适用场景**? 3. **`final` 关键字可以修饰哪些内容?作用分别是什么**? 4. **Java 中 `==` 和 `equals()` 的区别**? --- #### **三、代码题**(每题10分,共20分) 1. **以下代码的输出结果是什么?为什么?** ```java public class ThreadTest { private static int count = 0; public static void main(String[] args) throws InterruptedException { Runnable task = () -> { for (int i = 0; i < 10000; i++) { count++; } }; Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(count); } } ``` 2. **实现一个线程安全的单例模式(Singleton)**,要求: - 使用双重检查锁定(Double-Check Locking) - 禁止通过反射创建实例 --- #### **参考答案** ##### **一、选择题** 1. B(`s + 5` 结果为 `int` 类型,需强制转换) 2. B(`new String("abc")` 创建堆对象和字符串常量池对象) 3. D(`ArrayList` 允许 `null`,`TreeSet` 和 `ConcurrentHashMap` 不允许) 4. C(`i++` 返回0后i=1,`++i` 返回2,总和为0+2=2) 5. A(`finally` 在 `try` 或 `catch` 后执行,但若 `System.exit()` 则不会执行) ##### **二、简答题** 1. **重载**:同一类中方法名相同,参数列表不同(类型、顺序、数量),与返回值无关。 **重写**:子类覆盖父类方法,方法名、参数、返回值相同,访问权限不能更严格。 2. **`ArrayList`**:基于动态数组,随机访问快($O(1)$),增删慢(需移动元素)。 **`LinkedList`**:基于双向链表,增删快($O(1)$),随机访问慢(需遍历)。 3. **`final`**: - 修饰类:不可继承 - 修饰方法:不可重写 - 修饰变量:不可修改(基本类型值不可变,引用类型指向对象不变) 4. **`==`**:比较基本类型的值或对象的地址。 **`equals()`**:默认比较地址,可重写(如 `String` 比较内容)。 ##### **三、代码题** 1. **输出结果**:可能小于20000(如18000),因为 `count++` 是非原子操作,存在线程安全问题。 2. **双重检查锁定单例**: ```java public class Singleton { private volatile static Singleton instance; private Singleton() { if (instance != null) { throw new RuntimeException("禁止反射创建实例"); } } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` --- #### **考察点** 1. **语法基础**:数据类型、运算符、集合框架、异常处理。 2. **面向对象**:重载、重写、单例设计模式。 3. **多线程**:原子性、可见性、线程安全实现。 4. **代码分析**:对代码逻辑和潜在问题的理解。 **附加思考题**: - 如何通过反射破坏单例模式?如何防御? - `volatile` 关键字在单例模式中的作用是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值