美文网首页
java笔试题

java笔试题

作者: 她与星河皆遗憾 | 来源:发表于2019-07-29 08:24 被阅读0次

面向对象就是:

把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。
对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。
类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。 

面向过程就是:

自顶向下顺序执行,逐步求精;其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;
各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;
其模块化实现的具体方法是使用子程序。程序流程在写程序时就已决定。

对象的属性和方法分别表示什么呢

属性是表示对象有什么,方法是表示对象能干什么。

什么是类

类是对象的模子,具有相同属性和方法的一组对象的集合,类是不存在的,是用来描述对象信息。

ArrayList和LinkedList和vetor的区别有以下几点:

1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;
3. Vector 是一种老的动态数组,是线程同步的,效率很低。(是多线程安全的)

Collection和Map的区别

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
  一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。
1、Map对象中,每一个关键字最多有一个关联的值。
2、不能包括两个相同的键,一个键最多能绑定一个值。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null

collection与map的继承体系

collection
map

List 和 Set 区别

List,Set 都是继承自 Collection 接口
List 特点:元素有放入顺序,元素可重复
Set 特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉

HashSet与TreeSet与HashMap的区别

HashSet  保存的数据是无序的,TreeSet保存的数据是有序的
TreeSet 依靠的是Comparable 来区分重复数据;
HashSet 依靠的是hashCode()、equals()来区分重复数据

HashMap与HashTable区别

a)  相同点
    这两个都是都是Map的实现,也就是说,都是双列的集合,都是存放键值对的,底层实现都是基于数组+链表的结构,也就是hash表。
b)  null值要求
    HashMap的key和值都可以为null;HashTable的键和值都不能为null;
d)  容量和增长方式
    HashMap:默认大小16,负载因子0.75,当hash表的容量超过负载因子的时候开始扩容,扩容为原始容量的2倍。
    HashTable:初始容量为11,负载因子为0.75。超过负载因子*容量开始扩容,扩容为旧的容量*2+1。
e)  安全性及性能
    HashMap是线程不安全的,所以效率高;HashTable是基于synchronized实现的线程安全的Map,效率较低;。

String/StringBuffer/StringBuilder

a)  相同点
    这三个类都是用来处理字符串的。
b)  是否可变
    String是不可变字符串,StringBuffer和StringBuilder是可变字符串。
c)  安全性
    StringBuffer是线程安全的,效率较低;StringBuilder是线程不安全的,效率高一些。
d)  String是否有length()方法,数组呢?
    String有length()方法,数组没有,有lenth属性。
e)  new String(“123”)会产生几个对象
    1个或者2个,因为new,一定会在堆中开辟空间,如果”123”在字符串常量池已经存在,就不会再字符串常量池中创建对象了,
这样就只会有1个;如果串池(字符串常量池)中没有,那么就会在串池中创建一个对象,这样,就有两个对象。

谈谈final, finally, finalize的区别

1.final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
2.finally—再异常处理时提供 finally 块来执行任何清除操作。
如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)
3.finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的

==和equals的区别

== 的作用
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
equals 的作用
  引用类型:默认情况下,比较的是地址值。

什么是 Java 的反射

Java 的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的
时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。

Error与Exception的区别

Error 指的是一些不可以预知的错误,多半指的是虚拟机错误,如:堆栈溢出错误StackOverFlowError和内存溢出OutOfMemoryError等。
Exception 指的是一些可以预知的问题,需要程序员进行处理。被分为两大类:编译时异常和运行时异常。

常见异常

运行时异常有:
    1.NullPointException(空指针)
    2.ArrayIndexOutOfBoundsException(数组下标越界)
    3.ClassCastException(类型转换异常)
    4.IllegalArgumentException(参数错误异常)
    5.ArithmeticException(算术异常,如1/0等)
    6.SecurityException(安全异常)
    7.ConcurrentModificationException(同步修改异常,快速失败异常,发生在集合迭代的时候调用List.add或者list.remove方法)
编译时异常:
    1.ClassNotFoundException(类找不到)
    2.FileNotFoudException(文件找不到异常)
    3.NoSuchMethodException(没有这个方法)
    4.SQLException(SQL异常)
    5.ParseException(解析异常)
    6.IOExeception(IO异常)

如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后?

1.finally语句在return语句执行之后return返回之前执行的
2.finally块中的return语句会覆盖try块中的return返回
3.如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变

面向对象特征

**抽象、封装、继承、多态(重写体现)**
1.抽象:从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象
2.封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式;
好处:
隐藏实现细节,提供公共的访问方式;
提高了代码的复用性;
提高安全性;
封装原则:
将不需要对外提供的内容都隐藏起来;
把属性隐藏,提供公共方法对其访问;
3.继承:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可,通过extends关键字可以实现类与类的继承。
4.多态:同一个对象在不同时刻体现出来的不同状态

抽象类和接口

a)  相同点
    都是用来抽取公共的特性的;都不能实例化;都没有构造器
b)  定义方式
    接口使用interface定义,抽象类使用abstract class定义;
c)  使用方式
    一个类可以实现多个接口,之间用逗号隔开;只能继承一个抽象类;一个接口可以继承多个接口;
d)  方法
    接口里面的方法都是抽象方法,即都没有方法体(注意从jdk8之后是可以有的,使用default修饰方法);
    抽象类里面可以没有抽象方法,也可以有(使用abstract修饰);

什么是线程?

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

Java 中创建线程主要有方式:

继承 Thread 类创建线程类
实现 Runnable 接口创建线程类

什么是多线程

多线程就是一个应用程序同时有多个线程在执行,实现多任务处理,同一任务中的各个线程共享程序段、数据段等资源。

线程和进程的区别

1.  进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是资源分配和调度的基本单位;线程是CPU调度和分派的基本单位,
它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),
但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.。
2.  一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
3.  资源分配给进程,同一进程的所有线程共享该进程的所有资源。

线程生命周期

线程有五个状态:新建、就绪、运行、阻塞、死亡。
线程生命周期

Swing中的顶层容器类

Swing提供三个顶层容器类:JFrame,JDialog和JApplet。

截止JDK1.8版本,java并发框架支持锁包括?

读写锁
自旋锁
乐观锁

HTTP 请求的 GET 与 POST 方式的区别

1. get 是把参数数据队列加到提交表单的 ACTION 属性所指的 URL 中,在
URL 中可以看到。
2.post 是通过 HTTPPOST 机制,将表单内各个字段与其内容放置在 HTML
HEADER 内一起传送到 ACTION 属性所指的 URL 地址。用户看不到这个过程。
3. get 安全性非常低, post 安全性较高。但是执行效率却比 Post 方法好。
4. get 传送的数据量较小,不能大于 2KB。 post 传送的数据量较大,一般被
默认为不受限制。但理论上, IIS4 中最大量为 80KB, IIS5 中为 100KB。
5. 对于 get 方式, 服务器端用 Request.QueryString 获取变量的值,对于
post 方式, 服务器端用 Request.Form 获取提交的数据。
所以综上建议:
1、包含机密信息的话,建议用 Post 数据提交方式;
2、在做数据查询时,可以使用 Get 方式;而在做数据添加、修改或删除时,建
议用 Post 方式;

session 与 cookie 区别
单个 cookie 在客户端的限制是 3K,就是说一个站点在客户端存放的cookie 不能 3K
将登陆信息等重要信息存放为 session;其他信息如果需要保留,可以放在 cookie 中

cookie与session区别

Cookie过期时间

一般都是自己设置过期时间的,在后台通过Cookie.setMaxAge方法,如果没有设置,浏览器关闭就没有了

JDBC 流程

1、 加载 JDBC 驱动程序:
2、 提供 JDBC 连接的 URL
3、创建数据库的连接
4、 创建一个 Statement
5、执行 SQL 语句
6、处理结果
7、关闭 JDBC 对象

final关键字的基本用法

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。

冒泡排序

    public static void bubbleSort(int[] arr) {
        for (int i = 1; i<arr.length; i++) {// 外层循环控制比较的趟数,比较的趟数是数组长度-1
            // 第j趟比较中少比较的个数为j-1个,所以i<arr.length - 1 - (j-1),即arr.length-j
            for (int j = 0; j<arr.length - i; j++) { // 内存循环控制要对比的元素个数
                if (arr[j] >arr[j + 1]) {// 前面的元素和后面的元素做对比,如果前面的大于后面的,交换位置
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
            }
        }
    }

修饰符级别

修饰符
单例模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

第一种:懒汉(线程不安全)
public class Singleton {
 private static Singleton instance;

 public static Singleton getInstance() {
  if (instance == null) {
   instance = new Singleton();
  }
  return instance;
 }
}
 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。


第二种:懒汉(线程安全)
public class Singleton {
 private static Singleton instance;

 public static synchronized Singleton getInstance() {
  if (instance == null) {
   instance = new Singleton();
  }
  return instance;
 }
}
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。

工厂模式

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

内存模型

1.堆:存放对象实例
2.栈(虚拟机栈):存储局部变量,操作数栈,动态链接,方法出口等
3.方法区:存放类信息,常量(字符串常量池,-128-127),静态变量,编译后的代码(字节码文件)

什么是垃圾回收

    垃圾回收是java语言中的一直机制,用来对不再使用的“垃圾”对象占用的空间进行回收;而不用程序员自己手动的释放内存,减少内存泄漏的发生。

类加载过程

加载、验证、准备、解析、初始化

数据库事务特性

   原子性(Atomicity):
事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
   一致性(Consistency):
一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
   隔离性(Isolation):
可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
   持久性(Durability):
一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

内存模型

堆:存放对象实例
栈(虚拟机栈):存储局部变量,操作数栈,动态链接,方法出口等
方法区:存放类信息,常量(字符串常量池,-128-127),静态变量,编译后的代码(字节码文件)

IO与NIO

a)  IO是面向流的,而NIO是面向缓冲区的;
b)  IO是阻塞式的,而NIO是非阻塞式的
c)  NIO通过选择器可以是一个线程同时监视多个输入管道;

Ajax

Ajax 全称是 asychronous javascript and xml,主要用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新

原生ajax写法

$.ajax({
        /*url指定接收请求的地址*/
        url : "${pageContext.request.contextPath}/checkUsername",
        /*data填写发送的数据*/
        data : {
                 "name" :  $('input[name=username]').val()
        },
        // type指定请求类型
        type : "get",
        // dataType指定响应信息格式
        dataType : "json",
        // 指定成功的回调函数,res是响应回来的信息
         success : function (res) {
             if(res == 0){
              }
         },
         // 指定失败的回调函数
         error : function(){
                 alert("服务响应失败");
         },
         // 异步请求
        async : true
  })

&和&&的区别

    都可以做逻辑运算符,&还可以作为位运算符
    &&是短路运算符,如果左边的表达式是false,右边不执行

#和$区别

a)  # 会对传入的参数进行预编译,在传入的值两边添加’’,所以在一定程度上可以防止SQL注入
b)  $相当于字符串拼接,有SQL漏洞的问题;
c)  一般推荐使用#,然而,在要传入表名或者字段名等数据库信息的时候,不能再使用#,而只能使用$;
1,首先Mybatis中的#{}与${}到底有什么区别?

其实,区别就是如果使用#{},会将{}里面的传入的值自动解析成为带引号的值,比如:

select count(1) from t_user where user_name = #{userName} and user_password  = #{userPassword}

假如,此时传入userName传入的值为admin,userPassword传入的值为123456,那么最后的sql就是:

select count(1) from t_user where user_name = 'admin' and user_password  = '123456';

会解析成字符串,而${}就会这样解析:

select count(1) from t_user where user_name = admin and user_password  = 123456;

显然,这是一个错误的sql语句,那么,什么叫SQL注入呢?为什么#{}可以有效的防止sql注入呢?

2,什么是SQL注入?

SQL注入就是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作

比如说,在登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功

而如果不存在就登录失败,如果说你后台使用的是${},恶意用户在表单中的用户名文本框中输入的是'admin'

密码框中输入的是' ' or 1 = 1 加了一引号和一个恒成立的条件,那么,传到数据库中的sql就是:

select count(1) from t_user where user_name = 'admin' and user_password = ' ' or 1=1

如果程序没有做其他的校验,此时,该恶意用户是可以登录系统的! 这就是SQL注入,恶意攻击

而如果使用#{}是不会出现这种情况的,#{}默认会给输入的值加上引号,但是使用#{}在其他场景下并不适用

比如要使用到排序 order by #{} 传入的参数应是表对应字段名,但是加上引号后就会解析成

order by 'age' 这样就达不到排序的目的,而此时如果使用${}就可以达到排序的目的

即,sql解析成 order by age,根据age排序

%运算符

    结果和第一个值的符号一样,负数取模是负数,整数取模是整数。

JSP内置对象

1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(

2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。

4、application对象
 application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。

5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
7、config 对象
config 对象的主要作用是取得服务器的配置信息。

8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。

git常用命令

   git add:把工作区修改添加到暂存区;
   git commit:提交到本地仓库
   git push:提交到远程仓库
   git clone:下载远程仓库
   git pull:拉取远程仓库代码到本地(更新的)
   git status:查看状态
   git log:查看历史日志
   git reset:重置到某个版本
   git diff:对比文件的差异
   git checkout:检出到某个分支,如git checkout develop表示切换到develop分支
   git branch:创建分支,如git branch develop表示创建develop分支
   git merge:合并分支,get merge master,表示把master上面的修改合并到当前分支

Redis是什么?

Redis是一个开源的,基于内存的高性能存储系统,可以用作数据库、缓存、消息代理等,
提供了strings,hashs,lists,sets,sorted sets等丰富的数据结构。

数据库的默认端口号

   MySQL:3306
   Oracle:1521
   SQLServer:1433

相关文章

网友评论

      本文标题:java笔试题

      本文链接:https://www.haomeiwen.com/subject/zlfihctx.html