java面试

目录

1、构造器(constructor)是否可被重写(override)?

2、java 中操作字符串都有哪些类?它们之间有什么区别?

3、重载(Overload)和重写(Override)有什么区别?

4、抽象类(abstract class)和接口(interface)有什么异同?

5、Error和Exception有什么区别?

6、List、Set、Map是否继承自Collection接口?

7、进程和线程?

8、如何用Java代码列出一个目录下所有的文件?

9、阐述JDBC操作数据库的步骤

10、事务的ACID是指什么?

11、用Java写一个单例类

12、用Java写一个冒泡排序

13、什么是 Spring Boot?

14、为什么要用SpringBoot?

15、@SpringBootApplication 注解

16、Profile 多环境配置

17、前后端分离,如何维护Rest API接口文档 ?

18、什么是Spring MVC?

19、什么是DispatcherServlet?

20、MVC是什么?MVC设计模式的好处有哪些

21、Spring MVC常用的注解有哪些?

22、@Controller注解的作用

23、@RequestMapping注解的作用

24、Spring MVC怎么样设定重定向和转发的?

25、请求参数接收

基本参数类型

Pojo参数封装

26、Spring MVC 控制器返回值

普通字符串

转发字符串

重定向字符串

返回JSON数据


1、构造器(constructor)是否可被重写(override)?

答:重写是发生在子类与父类中,方法名、参数列表、返回值、访问修饰符和异常都相同。首先,构造器不能被继承,因为每个类名都不相同,而构造器的名称与类名相同,这肯定不能算是继承,所以,既然构造器不能被继承,因此不能被重写,但可以被重载。

2、java 中操作字符串都有哪些类?它们之间有什么区别?

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer.

3、重载(Overload)和重写(Override)有什么区别?

重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。

(1)方法名必须相同;在同一个人类中。

(2)方法的参数列表一定不一样。

(3)访问修饰符和返回值类型可以相同也可以不同。

重写(override):一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。

(1)方法名必须相同,返回值类型必须相同

(2)参数列表必须相同

(3)访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。

(4)子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。

(5)构造方法不能被重写。

4、抽象类(abstract class)和接口(interface)有什么异同?

(1)接口只有方法定义,没有具体的实现,实现接口的类要实现接口的所有方法;抽象类可以有定义与实现;

(2)接口与类是实现关系,并且类可以多实现;抽象类与类是继承关系,只能被一个类继承。

5、Error和Exception有什么区别?

Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。

Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。

6、List、Set、Map是否继承自Collection接口?

答:List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

7、进程和线程?

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位

线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。

8、如何用Java代码列出一个目录下所有的文件?

import java.io.File;

class Test {

	public static void main(String[] args) {
		File f = new File("/Users/Hao/Downloads");
		for(File temp : f.listFiles()) {
			if(temp.isFile()) {
				System.out.println(temp.getName());
			}
		}
	}
}

9、阐述JDBC操作数据库的步骤

答:下面的代码以连接本机的Mysql数据库为例,演示JDBC操作数据库的步骤。

  • 加载驱动。
	Class.forName("oracle.jdbc.driver.OracleDriver");
  • 创建连接。
	Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
  • 创建语句。
	PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
	ps.setInt(1, 1000);
	ps.setInt(2, 3000);
  • 执行语句。
	ResultSet rs = ps.executeQuery();
  • 处理结果。
	while(rs.next()) {
		System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
	}
  • 关闭资源。
	finally {
		if(con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

10、事务的ACID是指什么?

原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

11、用Java写一个单例类

饿汉式单例

public class Singleton {
    private Singleton(){}
    private static Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式单例

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static synchronized Singleton getInstance(){
        if (instance == null) instance = new Singleton();
        return instance;
    }
}

12、用Java写一个冒泡排序

package day0515;
public class demo_sort {
    public static void main(String[] args) {
        //冒泡排序算法
        int[] numbers=new int[]{1,5,8,2,3,9,4};
        //需进行length-1次冒泡
        for(int i=0;i<numbers.length-1;i++)
        {
            for(int j=0;j<numbers.length-1-i;j++)
            {
                if(numbers[j]>numbers[j+1])
                {
                    int temp=numbers[j];
                    numbers[j]=numbers[j+1];
                    numbers[j+1]=temp;
                }
            }
        }
        System.out.println("从小到大排序后的结果是:");
        for(int i=0;i<numbers.length;i++)
            System.out.print(numbers[i]+" ");
    }
}

13、什么是 Spring Boot?

用于简化 Spring 应用从搭建到开发的过程。应用开箱即用,只要通过一个指令,包括命令行 java -jar 、SpringApplication 应用启动类 、 Spring Boot Maven 插件等,就可以启动应用了。

14、为什么要用SpringBoot?

Spring Boot 优点非常多,如:独立运行、简化配置、自动配置和无需部署war文件等等

 SpringBoot的核心功能一:独立运行Spring项目,SpringBoot可以以jar包的形式独立运行,运行一个SpringBoot项目只需要 java -jar xxx.jar 来运行

SpringBoot的核心功能二:内嵌servlet容器,可以内嵌tomcat,接天jetty,或者undertow,这样我们就可以不用war包形式部署项目

SpringBoot的核心功能三,提供starter简化maven配置,spring提供了一系列starter pom 来简化maven的依赖加载, 当使用了 spring-boot-starter-web时,会自动加载所需要的依赖包

SpringBoot的核心功能四:自动配置spring,springboot 会根据在类路径的jar包,类,为jar包中的类自动配置bean,这样会极大的减少使用的配置,会根据启动类所在的目录,自动配置bean

Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件主要用于 Spring Boot 项目的自动化配置。

Spring Boot 的配置文件有哪几种格式?它们有什么区别?

主要有.properties 和 .yml格式,它们的区别主要是书写格式不同。另外,.yml 格式不支持 @PropertySource 注解导入配置。

15、@SpringBootApplication 注解

@SpringBootApplication 注解用标注启动类,被标注的类为一个配置类,并会触发自动配置和 Starter 组件扫描。根据源码可得,该注解配置了 @SpringBootConfiguration、 @EnableAutoConfiguration 和 @ComponentScan 三个注解, @SpringBootConfiguration 注解又配置了 @EnableAutoConfiguration 。所以该注解的职责相当于结合了@Configuration, @EnableAutoConfiguration 和 @ComponentScan 三个注解功能。

@SpringBootApplication 注解的职责如下:

在被该注解修饰的类中,可以用 @Bean 注解来配置多个 Bean 。应用启动时,Spring 容器会加载 Bean 并注入到 Spring 容器。
启动 Spring 上下文的自动配置。基于依赖和定义的 Bean 会自动配置需要的 Bean 和类。
扫描被 @Configuration 修饰的配置类。也会扫描 Starter 组件的配置类,并启动加载其默认配置。

16、Profile 多环境配置

application-dev.properties:开发环境
application-prod.properties:生产环境
想要使用对应的环境,只需要在application.properties中使用spring.profiles.active属性来设置,值对应上面提到的{profile},这里就是指dev、prod这2个。

17、前后端分离,如何维护Rest API接口文档 ?

在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新。

18、什么是Spring MVC?

Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,使用MVC架构模式的思想,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化我们日常开发。

19、什么是DispatcherServlet?

Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

20、MVC是什么?MVC设计模式的好处有哪些

三层架构:
1)界面层,用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面
2)业务逻辑层,它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计
3)数据访问层,其功能主要是负责数据库的访问

MVC架构:
1)Model:模型,将传输数据封装成一个完整的载体(Model)
2)View:视图,html、jsp等
3)Controller:控制器

21、Spring MVC常用的注解有哪些?

@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。

@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。

控制器的注解:一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。

22、@Controller注解的作用

@Controller 用于标记在一个类上,使用它标记的类就是一个Spring MVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

23、@RequestMapping注解的作用

@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@Controller
@RequestMapping("/hello")
public class HelloController{
    @RequestMapping("/hello.do")
    public void hello(HttpServletRequest request,HttpServletResponse response) throws IOException {
        response.getWriter().write("www.baidu.com");
    }
}

如果类和方法上都指定value值,那么方法的最终方法路径为:http://localhost:8080/hello/hello.do

24、Spring MVC怎么样设定重定向和转发的?

(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"

(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

/**
 * 实现转发
 */
@RequestMapping("/hello1.action")
public String hello1(HttpServletRequest request){
    request.setAttribute("name", "cjj");
    return "forward:hello.action";
}

/**
 * 实现重定向
 */
@RequestMapping("/hello2.action")
public String hello2(HttpServletRequest request){
    request.setAttribute("name", "cjj");
    return "redirect:/hello.action";
}

20、怎么样把ModelMap里面的数据放入Session里面?

答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

25、请求参数接收

基本参数类型

(1)设计表单页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<h2>基本类型参数封装</h2>
<form action="/param.do">
    用户名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

(2)编写控制器接收参数

@Controller
public class ParamController {

    @RequestMapping("/param.do")
    public String save(@RequestParam("name") String name,
                       @RequestParam("age") Integer age){
        System.out.println("用户名:"+name);
        System.out.println("年龄:"+age);
        return "success";
    }
}

这里要注意的是,控制器接收参数的形参名称必须和表单的name属性保持一致,否则会接收失败!

(3)springmvc.xml配置


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1.扫描Controller的包-->
    <context:component-scan base-package="com.controller"/>

    <!-- 2.配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 2.1 页面前缀 -->
        <property name="prefix" value="/pages/"/>
        <!-- 2.2 页面后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 3.创建处理器适配器和处理器映射器-->
    <mvc:annotation-driven/>
</beans>

Pojo参数封装

之前我们接收参数的时候都是定义一个个的基本类型来接收,这样比较繁琐,Spring MVC提供了使用Pojo(或者称为JavaBean)类型来封装请求参数。

(1)设计表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<h2>Pojo类型参数封装</h2>
<form action="/param.do" method="post">
    用户名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

(2)设计User对象封装表单数据

/**
 * 用于封装表单数据
 */
public class User {
    private String name;
    private Integer age;
    get、set方法,tostring方法

}

(3)编写Controller

@Controller
public class ParamController {

    @RequestMapping("/param.do")
    public String save(User user){
        System.out.println("用户名:"+user.getName());
        System.out.println("年龄:"+user.getAge());
        return "success";
    }
}

(4)springmvc.xml配置

26、Spring MVC 控制器返回值

普通字符串

返回普通字符串这种情况比较常见主要用在我们处理完业务逻辑后,需要跳转到应用的其他页面。

/**
 * 1)字符串 - 普通字符串(代表页面名称,不是完整路径,最后经过视图解析器的解析)
 *    优势:写法简单
 *    劣势:只能转发到视图解析器指定的特定目录
 */
@RequestMapping("/string")
public String string(){
    System.out.println("普通字符串....");
    //这里返回页面名称,必须经过视图解析器解析的!!!
    return "index";
}

转发字符串

普通字符串,只能转发到视图解析器指定前缀的目录下的页面,如果想转发到视图解析器目录以外的页面,这时可以使用转发字符串的写法。

/**
 * 2)字符串 - 转发字符串
 *     转发字符串格式:
 *        forward:完整页面的路径      例如:forward:/pages/index.jsp
 *
 *    优势:更加灵活,可以转到本项目下的任何页面,可以传递request域对象数据
 *    劣势:写法稍复杂
 */
@RequestMapping("/forward")
public String forward(){
    System.out.println("转发字符串....");
    return "forward:/index.html";
}

重定向字符串

如果希望使用重定向的方式跳转页面,这时可以使用重定向字符串完成。

/**
 * 3)字符串 - 重定向字符串
 *     重定向字符串格式:
 *        redirect:完整页面的路径      例如:redirect:/pages/index.jsp
 *
 *    优势:很灵活,可以重定向到项目内和项目以外的页面
 *    劣势:写法稍复杂,不能转发requesy域对象数据
 */
@RequestMapping("/redirect")
public String redirect(){
    System.out.println("重定向字符串....");
    return "redirect:http://www.baidu.com";
}

返回JSON数据

我们在开发中后端经常需要接受来自于前端传递的Json字符串数据,怎么把Json字符串转换为Java对象呢?后端也经常需要给前端返回Json字符串,怎么把Java对象数据转换为Json字符串返回呢?接下来我们看看如何使用@RequestBody和@ResponseBody注解。

(1)导入jackson支持包

Spring MVC默认是无法实现Json数据转换功能的,需要额外导入Jackson包来支持Json数据转换。

pom.xml配置:

<!-- jackson支持包 -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.5</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.5</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>

(2)页面传递Json到后端

编写json.jsp,使用jQuery实现ajax异步请求后端Controller,同时发送Json字符串对象

json.jsp内容如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <script src="/js/jquery-3.3.1.min.js"></script>
</head>
<body>
<script>
    //页面加载完毕
    $(function(){
        //点击按钮,发送post请求,传递json参数
        $("#btn").click(function(){
            $.ajax({
                //设置请求类型
                type:'post',
                //请求路径
                url:'/json',
                //传递json参数
                data: '{"id":268,"name":"小红","age":18}',
                //指定参数类型(如果json参数格式,必须设置为json类型)
                contentType: 'application/json;charset=utf-8',
                //该方法接收后台返回的数据格式
                dataType: 'json',
                //处理方法
                success:function(result){
                    alert(result.id+'--'+result.name+'--'+result.age);
                }

            });
        });
    });

</script>

<input type="button" value="演示Json字符串与Java对象转换" id="btn">
</body>
</html>

(3)后端处理Json数据

编写JsonController,这里用到两个关键注解@RequestBody和@ResponseBody。

  • @RequestBody:完成页面Json字符串转换为后端Java对象
  • @ResponseBody:完成后端Java对象转换为前端Json字符串
@Controller
public class JsonController {

    /**
     * 1) 接收前台传递json字符串格式 @RequestBody: 把json字符串转为Java对象
     * 2) 后台Java对象转换json字符串: @ResponseBody
     */
    @RequestMapping("/json")
    @ResponseBody
    public User json(@RequestBody User user){
        System.out.println("前端发送的数据:"+user);
        //后台返回json字符串给前端
        user.setId(368);
        user.setName("小苍");
        user.setAge(20);
        return user;
    }
}

User对象:

public class User {
    private Integer id;
    private String name;
    private Integer age;
    get、set方法,tostring方法
}

(4)springmvc.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1.扫描Controller的包-->
    <context:component-scan base-package="com.controller"/>

    <!-- 2.配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 2.1 页面前缀 -->
        <property name="prefix" value="/pages/"/>
        <!-- 2.2 页面后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 3.创建处理器适配器和处理器映射器-->
    <mvc:annotation-driven/>

    <!--静态资源处理-->
    <mvc:default-servlet-handler/>
</beans>
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值