Java面试题

1.随机生成一个四位数,要求每位数字均不重复。

第一种:市面上的答案

public class test01 {
	 public static void main(String[] args) {
         Random r = new Random();
         int tag[] = {0,0,0,0,0,0,0,0,0,0};
         String four = "";
         int temp = 0;
         while(four.length() != 4){
                 temp = r.nextInt(10);
                 if(tag[temp] == 0){
                       four += temp;
                      tag[temp] = 1;
                 }
         }
        System.out.println(four);
 }
}

第二种:使用set添加并比较

public class test01 { 
public static void main(String[] args) { 
Random r=new Random(); 
private static int[] ints=new int[3];//四位的数组 
String four=""; 
Set<Integer> set = new HashSet<Integer>(); 
while(four.length()<4){//从0开始循环到3,共循环4次 
int ar= r.nextInt(10); 
if(four.length==0 && ar==0){
continue;
}
if(!set.contains(ar)){//判读是否重复 
set.add(ar); 
four+=ar; 
} 
} 
System.out.println("你要的数:"+four); 
} 
}

第三种:循环比较,出现这种的直接PASS

   if((a==b)||(a==c)||(a==d)||(b==c)||(b==d)||(c==d)){
}

2.自定义一个长度为10的数组,不允许用排序的方法(比如冒泡排序等),输出数组中第二大的数。

第一种:在判断最大的同时判断出第二大的

public  class  Second{
    public  static  void  main(String[]  args){
          int  a[10]={2,3,8,1,0,12,56,36,98,23};
          int  max=a[0];
          int  SecondMax=0;
          for(int  i=1;i<10;i++){
              if(a[i]>max){
              max=a[i];
              SecondMax=max;
              }else  if(a[i]>SecondMax){
                SecondMax=a[i];
              }
          }
            System.out.println(SecondMax);
    }          
}

第二种:使用Array的sort方法,虽然可以但是不符合题意

int  [] a = {1,6,4,5,12,23,34,53,11,9};
Arrays.sort(a);
System.out.println(a[8]);

3.将"abcdewfg"逆字符输出。

第一种:使用StringBuilder或者StringBuffer

String s = “abcdewfg”;
StringBuilder sb = new StringBuilder(s);
System.out.println(sb.reverse().toString());

第二种:将字符串拆解逆序输出

String s = “abcdewfg”;
char[] charArray = s.toCharArray();
for(int i=charArray.length-1;i>=0;i--){
System.out.print(charArray[i]);
}

4.自定义一个数据表,用一条sql查询出不同年级男女学生的人数

第一种:使用函数

select class,sum(case when sex="男" then 1 else 0 end) as ‘男’,
sum(case when sex="女" then 1 else 0 end) as ‘女’ from student group by class;

第二种:不使用函数,只使用group by

select class,sum(sex='男'),sum(sex='女') from student group by class;

5、将String date="2019/04/19 10:40:50"转换成精度为秒的时间戳

  public static int getTimestamp(String time) {
        Long timestamp = null;
        try {
            timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return (int)(timestamp/1000);
    }

6、计算两个时间点之间的天数

第一种:java1.8新类型

/**
	 * 计算两个时间点之间的天数
	 */
	public static void main(String[] args) {
		LocalDate start = LocalDate.of(2019, 10, 17);
		  LocalDate now = LocalDate.now();
		  System.out.println("两个时间之间的天数是:" + dome2.getBetweenDay(start, now) + " 天。");
	}
	 
	/**
	 * 计算两个时间点之间的天数
	 */
	public static long getBetweenDay(LocalDate start, LocalDate end) {
	  return end.toEpochDay() - start.toEpochDay();
	}

第二种

public static final int daysBetween(Date early, Date late) { 
	     
        java.util.Calendar calst = java.util.Calendar.getInstance();   
        java.util.Calendar caled = java.util.Calendar.getInstance();   
        calst.setTime(early);   
         caled.setTime(late);   
         //设置时间为0时   
         calst.set(java.util.Calendar.HOUR_OF_DAY, 0);   
         calst.set(java.util.Calendar.MINUTE, 0);   
         calst.set(java.util.Calendar.SECOND, 0);   
         caled.set(java.util.Calendar.HOUR_OF_DAY, 0);   
         caled.set(java.util.Calendar.MINUTE, 0);   
         caled.set(java.util.Calendar.SECOND, 0);   
        //得到两个日期相差的天数   
         int days = ((int) (caled.getTime().getTime() / 1000) - (int) (calst   
                .getTime().getTime() / 1000)) / 3600 / 24;   
         
        return days;   
   }   
  
   
   public static void main(String[] args)
   {
        Date earlydate = new Date();   
        Date latedate = new Date();   
        DateFormat df = DateFormat.getDateInstance();   
        try {   
            earlydate = df.parse("2009-09-21");   
            latedate = df.parse("2009-10-16");   
        } catch (ParseException e) {   
              e.printStackTrace();   
          }   
         int days = daysBetween(earlydate,latedate);   
         System.out.println(days);   
   }

7、使用反射获取取当前类对应类中的所有方法;输出方法名数组

package dome;

import java.lang.reflect.Method;
public class dome1 {
	//使用反射获取取当前类对应类中的所有方法--输出方法名数组
  public static void main(String[] args) throws ClassNotFoundException {
	 Class clazz = Class.forName("dome.dome1");
	  System.out.println(clazz.getName());
	  Method[] methods = clazz.getMethods();
      for(Method method:methods){
          System.out.print(" "+method.getName());
      }
      System.out.println();
  }
}

8、完成下列要求:

1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
2) 增加新老师Tom教CoreJava
       增加新老师John教Oracle
       增加新老师Susan教Oracle
       增加新老师Jerry教JDBC
       增加新老师Jim教Unix
       增加新老师Kevin教JSP
       增加新老师Allen教JDBC
3) Lucy 改为教CoreJava
4) 删除Jim老师
5) 遍历Map,输出所有的老师及老师教授的课程
6) 利用Map,输出所有教JSP 的老师。

package com.lanxi.demo1_2;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class Test {
    public static void main(String[] args) {
        Map map=new HashMap();
        //以老师姓名为key,以老师所上课程为value,放入集合
        map.put("Tom", "CoreJava");
        map.put("John", "Oracle");
        map.put("Susan", "Oracle");
        map.put("Jerry", "JDBC");
        map.put("Jim", "Unix");
        map.put("Kevin", "JSP");
        map.put("Lucy", "JSP");
        //增加一位新老师
        map.put("Allen", "JDBC");
        //删除Jim老师
        map.remove(“Jim”)
        //将Lucy改为教CoreJava
        map.put("Lucy", "CoreJava");
        //遍历map
        System.out.println("name   lecture");
        Iterator it=map.entrySet().iterator();
        while(it.hasNext()){
            Entry en=(Entry)it.next();
            System.out.println(en.getKey()+"\t"+en.getValue());
            if("JSP".equals(en.getValue())){
                System.out.println("教JSP的老师:"+en.getKey());
            }
        }
    }
}

9、简述mvc的工作原理。

//传统MVC
客户端发送请求request。servlet容器将请求传递给springMVC的前端控制器dispatchServlet接收到请求后。将url转发给handlermapper.根据url查找相应的handler。并将其传回DispatchServlet。由其发送请求到处理器适配器,处理器前端适配器寻找相应的Hanler处理。这里的Handler就是我们写的controller。处理完毕后。会返回相应的ModelView。并将其传回处理器适配器。处理器适配器将其传回DispatchServlet。由DispatchServlet将数据传递给视图渲染器。视图渲染器将渲染完成后得到的真正的视图传回DispatchServlet。由DispatchServlet将视图展现给客户端。

持久层:创建接口,并编写抽象方法。规划需要执行的sql语句。编写sql映射。
业务层:规划可能出现的异常。创建接口,并编写持久层对应的抽象方法。创建实现类,对抽象方法进行实现。
控制器:创建所有控制器类的基类。添加ExceptionHandler注解,对业务层设置的异常进行捕获。autowire自动装配业务层对象,进行实现。

// SpringMVC
Springmvc架构原理解析
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果

组件:
1、前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet减少了其它组件之间的耦合度。

2、处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler

3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

4、处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

5、视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)

6、视图View(需要程序员开发jsp)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

10、谈谈你对Spring Boot的认识

spring Boot是一个开源框架,它可用于创建可执行的Spring应用程序,采用了习惯优于配置的方法。此框架的神奇之处在于@EnableAutoConfiguration注解,此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。 
1. @Enable*注释 @Enable*注释并不是新发明的注释,早在Spring 3框架就引入了这些注释,用这些注释替代XML配置文件。 很多Spring开发者都知道@EnableTransactionManagement注释,它能够声明事务管理;@EnableWebMvc注释,它能启用Spring MVC;以及@EnableScheduling注释,它可以初始化一个调度器。 
 
2. 属性映射 下面看MongoProperties类,它是一个Spring Boot属性映射的例子: @ConfigurationProperties(prefix = "spring.data.mongodb") public class MongoProperties { private String host; private int port = DBPort.PORT; private String uri = "mongodb://localhost/test"; private String database; // ... getters/ setters omitted } @ConfigurationProperties注释将POJO关联到指定前缀的每一个属性。例如,spring.data.mongodb.port属性将映射到这个类的端口属性。 强烈建议Spring Boot开发者使用这种方式来删除与配置属性相关的瓶颈代码。 
 
3.@Conditional注释 Spring Boot的强大之处在于使用了Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。 在Spring Boot的org.springframework.boot.autoconfigure.condition包中说明了使用@Conditional注释能给我们带来什么,下面对这些注释做一个概述: @ConditionalOnBean @ConditionalOnClass @ConditionalOnExpression @ConditionalOnMissingBean @ConditionalOnMissingClass @ConditionalOnNotWebApplication @ConditionalOnResource @ConditionalOnWebApplication 
 
4.应用程序上下文初始化器 spring.factories还提供了第二种可能性,即定义应用程序的初始化。这使得我们可以在应用程序载入前操纵Spring的应用程序上下文ApplicationContext。 特别是,可以在上下文创建监听器,使用ConfigurableApplicationContext类的addApplicationListener()方法。 AutoConfigurationReportLoggingInitializer监听到系统事件时,比如上下文刷新或应用程序启动故障之类的事件,Spring Boot可以执行一些工作。这有助于我们以调试模式启动应用程序时创建自动配置的报告。 要以调试模式启动应用程序,可以使用-Ddebug标识,或者在application.properties文件这添加属性debug= true。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.bjsxt.servlet; import com.bjsxt.entity.User; import com.bjsxt.service.UserService; import com.bjsxt.service.impl.UserServiceImpl; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; import java.net.URLEncoder; import java.sql.Date; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class UserServlet extends BaseServlet { // @Override // protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // //解决POST表单的中文乱码问 // request.setCharacterEncoding("utf-8"); // //接收method属性的值 // String methodName = request.getParameter("method"); // // //根据method属性的值调用相应的方法 // if("login".equals(methodName)){ // this.login(request,response); // }else if("register".equals(methodName)){ // this.register(request,response); // }else if("logout".equals(methodName)){ // this.logout(request,response); // } // // } public void show(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取表单的数据 String userId = request.getParameter("userId"); if(userId == null){ userId = ""; } String strAge = request.getParameter("minAge"); int minAge = 0; try{ minAge = Integer.parseInt(strAge); //"12" "abc" }catch(NumberFormatException e){ e.printStackTrace(); } //调用业务层完成查询操作 UserService userService = new UserServiceImpl(); //List<User> userList = userService.findAll(); List<User> userList = userService.find(userId,minAge); //List<User> userList = null; //List<User> userList = new ArrayList<User>(); //跳转到show.jsp显示数据 request.setAttribute("userId",userId); request.setAttribute("minAge",strAge); request.setAttribute("ulist",userList); request.getRequestDispatcher("/admin/show.jsp").forward(request,response); } public void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //结束当前的session request.getSession().invalidate(); //跳转回登录页面 response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); } public void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.setCharacterEncoding("utf-8"); //1.接收来自视图层的表单数据 String userId = request.getParameter("userId"); String realName = request.getParameter("realName"); String pwd = request.getParameter("pwd"); String rePwd = request.getParameter("repwd"); int age = Integer.parseInt(request.getParameter("age"));// "23" String [] hobbyArr = request.getParameterValues("hobby"); String strDate = request.getParameter("enterDate");//"1999-12-23" Date enterDate = Date.valueOf(strDate); //util.Date SimpleDateFormat //判断两次密码是否相同 if(pwd == null || !pwd.equals(rePwd)){ request.setAttribute("error","两次密码必须相同"); request.getRequestDispatcher("/admin/register.jsp").forward(request,response); return; } //2.调用业务层完成注册操作并返回结果 User user = new User(userId,realName,pwd,age, Arrays.toString(hobbyArr),enterDate); UserService userService = new UserServiceImpl(); int n = userService.register(user); //3.根据结果进行页面跳转 if(n>0){ response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); }else{ request.setAttribute("error","注册失败"); request.getRequestDispatcher("/admin/register.jsp").forward(request,response); } } public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决POST表单的中文乱码问 //request.setCharacterEncoding("utf-8"); //获取用户名和密码 request 内建对象 请求 String username = request.getParameter("username"); String password = request.getParameter("password"); String rememberme = request.getParameter("rememberme"); //调用下一层判断登录是否成功,并返回结果 //进行服务器端的表单验证 if(username ==null || "".equals(username)){ request.setAttribute("error","用户名不能为空JSP"); request.getRequestDispatcher("/admin/login.jsp").forward(request,response); return; } if (username.length()<=6){ request.setAttribute("error","用户名长度必须大于6JSP"); request.getRequestDispatcher("/admin/login.jsp").forward(request,response);//后面语句还会执行 return; //后面的语句不再执行 } // boolean flag = false;//默认失败 // if(username.indexOf("sxt")>=0 || username.contains("尚学堂")){ // flag = true; // } User user = null;//默认登录失败 // UserDao userDao = new UserDaoImpl(); // user = userDao.find(username,password); UserService userService = new UserServiceImpl(); user = userService.login(username,password); //userService.addOrder("shoppingCart"); //输出结果 if(user != null){ //登录成功才记住我 //1.办理会员卡 String username2 = URLEncoder.encode(username,"utf-8"); Cookie cookie1 = new Cookie("uname",username2); Cookie cookie2 = new Cookie("password",password); //2.指定会员卡的作用范围,默认范围是当前目录 /servlet/LoginServlet /admin/login.jsp //cookie1.setPath("/"); //当前服务器 cookie1.setPath("/myservlet2/"); //当前项目 cookie2.setPath("/myservlet2"); //3.指定会员卡的作用时间 if("yes".equals(rememberme)){ cookie1.setMaxAge(60*60*24*10); //默认的时间浏览器不关闭的时间;-1 表示一直有效 cookie2.setMaxAge(60*60*24*10); }else{ cookie1.setMaxAge(0); cookie2.setMaxAge(0); } //4.将会员卡带回家 response.addCookie(cookie1); response.addCookie(cookie2); //成功跳转到成功页面 //out.println("登录成功"); // /servlet/LoginServlet // /servlet/success.jsp // request.getRequestDispatcher("/admin/success.jsp").forward(request,response); HttpSession session = request.getSession(); // session.setAttribute("username",username); session.setAttribute("user",user); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response.sendRedirect("https://www.bjsxt.com:443/news/11377.html"); //response.sendRedirect("http://localhost:8080/myservlet2/admin/success.jsp"); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response.sendRedirect(request.getContextPath()+"/admin/success.jsp"); //http://192.168.58.250:8080/myservlet2/servlet/LoginServlet //http://192.168.58.250:8080/myservlet2/admin/success.jsp //登录成功后,网站的访问人数+1 //1.获取当前的访问人数 ServletContext context = this.getServletContext(); Integer count2 = (Integer) context.getAttribute("count"); //2.人数+1 if(count2 == null){ //第一个用户 count2 = 1; }else{ count2++; } //3.再存放到application作用域中 context.setAttribute("count",count2); //http://192.168.58.250:8080/myservlet2/servlet/admin/success.jsp response.sendRedirect("../admin/success.jsp"); }else{ //失败跳转回登录页面 //out.println("登录失败"); request.setAttribute("error","用户名或者密码错误"); // RequestDispatcher rd = request.getRequestDispatcher("/admin/login.jsp"); // rd.forward(request,response); //RequestDispatcher rd = request.getRequestDispatcher("http://localhost:8080/myservlet2/admin/login.jsp"); //RequestDispatcher rd = request.getRequestDispatcher("/admin/login.jsp"); //http://192.168.58.250:8080/myservlet2/servlet/admin/login.jsp RequestDispatcher rd = request.getRequestDispatcher("../admin/login.jsp"); rd.forward(request,response); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值