回顾Java知识点,面试题汇总Day11(持续更新)

回顾Java知识点,面试题汇总Day11(持续更新) 一、集合1.1 Collection接口Collection是集合框架中最基础的父接口可以存储无序、不唯一的对象。Iterable专门用来迭代把集合中的元素全部取出来Collection 中所有元素可以通过Iterator进行迭代List、Set)Collection常用方法方法描述int size()获取集合长度boolean isEmpty()判断集合是否为空boolean contains(Object o)判断集合中是否包含某个元素IteratorE iterator()实例化Iterator接口遍历集合Object[] toArray()将集合转换为一个Object类型的对象数组boolean add(E e)向集合中添加元素boolean remove(Object o)从集合中移除元素boolean containsAll(Collection c)判断集合中是否存在某个集合的所有元素boolean addAll(Collection c)向集合中添加某个集合的所有元素boolean removeAll(Collection c)从集合中移除满足条件的另一个集合void clear()清空集合boolean equals(Object o)比较两个集合是否相等int hashCode()获取集合对象的散列值1.2 Collection的子接口使用其子接口List存放有序、不唯一的元素Set:存放无序、唯一的元素Queue:队列接口1.3 List接口List接口在继承Collection接口的基础上进行了扩展常用的扩展方法方法描述E get(int index)通过下标获取集合中指定位置的元素E set(int index,E element)替换集合中指定位置的元素void add(int index,E element)向集合中的指定位置添加元素E remove(int index)通过下标删除集合中指定位置的元素int indexOf(Object o)查找某个对象在集合中的下标int lastIndexOf(Object o)从后向前查找某个对象在集合中的下标ListIteratorE listIterator()实例化ListIterator接口ListE subList(int fromIndex,int toIndex)获取集合中的子集合1.4 List接口的实现类ArrayList实现了长度可变的数组优点查找快因为元素都是连续的可以快速求出下标从而取出元素缺点增删慢因为元素都是连续的添加一个元素就必须先将后续的元素依次后移一位再把新元素加入删除同理。import java.util.ArrayList; public class Test5 { public static void main(String[] args) { ArrayList list new ArrayList(); list.add(Hello); list.add(World); list.add(Love); list.add(You); System.out.println(list); } }调用的是toString方法源码如下public String toString() { IteratorE it iterator(); if (! it.hasNext()) return []; StringBuilder sb new StringBuilder(); sb.append([); for (;;) { E e it.next(); sb.append(e this ? (this Collection) : e); if (! it.hasNext()) return sb.append(]).toString(); sb.append(,).append( ); } }LinkedList 采用链表的形式来存储数据和ArrayList恰好相反优点增删快缺点查询慢地址指向元素不连续。import java.util.ArrayList; import java.util.LinkedList; public class Test5 { public static void main(String[] args) { LinkedList list new LinkedList(); list.add(Hello); //向集合中添加元素 list.add(World); list.add(Java); System.out.println(list); list.offer(JavaSE); //向集合中添加元素向后添加 list.offer(JavaEE); System.out.println(list); list.push(JavaME); //向集合中添加元素从0开始添加 System.out.println(list); list.addFirst(JavaEE2);//从前开始添加元素 System.out.println(list); System.out.println(list.peekFirst());//获取集合中第一个元素 System.out.println(list.peekLast());//获取集合中最后一个元素 System.out.println(list); System.out.println(list.pollFirst()); //获取集合中第一个元素并删掉 System.out.println(list.pollLast());//获取集合中最后一个元素并删掉 System.out.println(list); } }二、Spring2.1 AOPAspect Oriented Programming 面向切面编程Object Oriented Programming 面向对象编程将程序中所有参与模块都抽象成对象然后通过对象之间的相互调用完成特定的功能。AOP是对OOP的一种补充是在另外一个维度上抽象出对象具体是指程序运行时动态将非业务代码切入到业务代码中实现了业务代码和非业务代码的解耦合。dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.3.31/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-aop/artifactId version5.3.31/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-aspects/artifactId version5.3.31/version /dependencypackage com.myspring.aop; public interface Cal { public int add(int num1, int num2); public int sub(int num1,int num2); public int mul(int num1,int num2); public int div(int num1,int num2); }package com.myspring.aop; import org.springframework.stereotype.Component; Component public class CalImpl implements Cal{ Override public int add(int num1, int num2) { // System.out.println(add的参数是 num1 , num2); //非业务代码 int result num1 num2;//业务代码 // System.out.println(add方法的结果是 result); //非业务代码 return result; } Override public int sub(int num1, int num2) { int result num1 - num2; return result; } Override public int mul(int num1, int num2) { int result num1 * num2; return result; } Override public int div(int num1, int num2) { int result num1 / num2; return result; } }package com.myspring.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.Objects; Component Aspect EnableAspectJAutoProxy //生成动态代理 public class LoggerAspect { /** * 参数日志 */ // Before(execution(public int com.myspring.aop.CalImpl.add(..))) //此时只对add方法生效 Before(execution(public int com.myspring.aop.CalImpl.*(..))) //此时CalImpl中所有方法皆可输出 public void before(JoinPoint joinPoint){ String name joinPoint.getSignature().getName(); String args Arrays.toString(joinPoint.getArgs()); System.out.println(name 的参数是 args); } /** * 结果日志 */ AfterReturning(value execution(public int com.myspring.aop.CalImpl.*(..)),returning result) public void afterReturn(JoinPoint joinPoint, Object result){ String name joinPoint.getSignature().getName(); System.out.println(name 方法的结果是 result); } }package com.myspring.aop; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Test { public static void main(String[] args) { // Cal cal new CalImpl(); // System.out.println(cal.add(10, 1)); ApplicationContext applicationContext new AnnotationConfigApplicationContext(com.myspring.aop); Cal cal (Cal) applicationContext.getBean(calImpl); System.out.println(cal.add(1, 1)); System.out.println(cal.sub(5, 2)); System.out.println(cal.mul(3, 8)); System.out.println(cal.div(10, 2)); } }AOP基于IoC,将业务对象和切面对象分别注入到IoC中同时业务对象只写业务代码切面对象只写非业务代码从而在代码层面实现业务代码和非业务代码的解耦合效果通过IoC再将业务代码和非业务代码整合到一起即可开发时解耦运行时合并。如何整合通过代理对象将业务对象注入到IoC中将切面对象也注入到IoC中由IoC负责根据业务对象和切面对象创建出一个动态的代理对象分别去完成业务代码和非业务代码的执行。业务对象和切面对象必须注入到IoC中切面对象需要添加切面注解以及动态代理注解 Aspect EnableAspectJAutoProxy三、Spring MVCSpring MVC是Spring全家桶的一款产品对Java Web开发流程进行了封装不需要再通过Servlet的方式来完成代码的开发无论是代码量还是参数的接收返回值等等各方面都做了优化。Spring MVC是基于Spring框架的基于IoC容器Servlet创建一个Servlet,接收客户端请求完成相关的业务操作。3.1 Spring MVC的使用1.引入Spring MVC的依赖!--引入spring mvc的依赖-- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.31/version /dependency2.web.xml文件中配置springmvc!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd web-app display-nameArchetype Created Web Application/display-name !--Spring MVC的前端控制器-- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc.xml/param-value /init-param /servlet servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping /web-app3.创建springmvc配置文件?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd !-- 启用注解驱动必须要有。Spring MVC 的 RequestMapping 注解。 需要 mvc:annotation-driven/ 来启用注解驱动的处理器映射和适配器。 没有它Spring 根本不认识你的 Controller 和 RequestMapping-- mvc:annotation-driven / !-- 扫包 -- context:component-scan base-packagecom.myspring.controller/ !-- 视图解析器 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/ / property namesuffix value.jsp / /bean /beans4.创建控制器package com.myspring.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller public class HelloController { RequestMapping(/index) public String index(){ System.out.println(index......); return index; } }3.2 Spring MVC传参数Spring MVC会自动对request中的参数进行解析类型转换。开发者只需要在方法定义处声明需要的参数类型格式Spring MVC会自动对参数进行解析和转换。3.3 Spring MVC 返回视图定义方法返回值类型为String,返回视图名称同时结合视图解析器将真正的视图资源返回给调用者。JSON数据需要在方法定义处添加RequestBody,方法中直接返回数据即可。返回试图是前后端不分离的单体架构返回JSON数据前后端分离的架构。3.4 单体架构返回视图将业务数据同时带到前端package com.myspring.controller; import com.myspring.entity.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; Controller public class HelloController { RequestMapping(/index) public String index(Model model){ User user new User(); user.setId(1); user.setName(李四); model.addAttribute(name,张三); // model.addAttribute(user,User); //String 没有 id/name 属性 model.addAttribute(user,user); //正常访问 ${user.id} 和 ${user.name} return index; } }% page contentTypetext/html;charsetUTF-8 languagejava % % page isELIgnoredfalse%!--可以把视图上的{name}转换成对应的值“张三”-- html head titleTitle/title /head body h1${name}/h1 h2${user.id}/h2 h2${user.name}/h2 /body /html四、MyBatisMyBatis是ORM框架4.1 pom.xmldependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.4.5/version /dependency4.2 config.xml?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !-- 配置项 -- settings !--打印SQL-- setting namelogImpl valueSTDOUT_LOGGING/ /settings environments defaultdevelopment environment iddevelopment transactionManager typeJDBC/transactionManager dataSource typePOOLED !--MySQL 8.0 要用 com.mysql.cj.jdbc.Driver不是 com.mysql.jdbc.Driver-- property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/car_rental_separate/ property nameusername valueroot/ property namepassword value123456/ /dataSource /environment /environments mappers mapper resourcecom/myspring/mapper/NewsMapper.xml/mapper /mappers /configuration4.3 创建实体类package com.myspring.entity; import lombok.Data; import java.util.Date; Data public class News { private int id; private String title; private Date createtime; private String opername; private String content; }4.4 创建Mapper接口package com.myspring.mapper; import com.myspring.entity.News; public interface NewsMapper { public int add(News news); }4.5 接口对应的mapper.xml文件?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.NewsMapper !-- 你的映射语句 -- insert idadd parameterTypecom.myspring.entity.News insert into sys_news(title,content,createtime,opername) values (#{title},#{content},#{createtime},#{opername}) /insert /mapper4.6 使用package com.myspring; import com.myspring.entity.News; import com.myspring.mapper.NewsMapper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.util.Date; public class Test1 { public static void main(String[] args) { InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 NewsMapper mapper sqlSession.getMapper(NewsMapper.class); News news new News(); news.setTitle(测试); news.setCreatetime(new Date()); news.setOpername(admin); news.setContent(测试测试测试); int add mapper.add(news); System.out.println(add); sqlSession.commit();//提交到数据库 } }也可以将SQL直接添加到业务方法上package com.myspring.mapper; import com.myspring.entity.News; import org.apache.ibatis.annotations.Insert; public interface NewsMapper { Insert({insert into sys_news(title,content,createtime,opername) values (#{title},#{content},#{createtime},#{opername})}) public int add(News news); }