Java面试题

Java面试题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。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106431.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号