秋招要点
本文最后更新于 1556 天前,其中的信息可能已经有所发展或是发生改变。
  1. 悲观锁
    每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
  2. 乐观锁
    每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,
    像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
  3. 形参实参
    当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。
  4. 链表的实现方式
    数组和指针
  5. int和Integer的区别
    1. Integer是int的包装类,int则是java的一种基本数据类型
    2. Integer变量必须实例化后才能使用,而int变量不需要
    3. Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
    4. Integer的默认值是null,int的默认值是0
    5. 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.print(i == j); //false
    
    1. Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
    Integer i = new Integer(100);
    int j = 100;
    System.out.print(i == j); //true
    
    1. 非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false
    
    1. 对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
    Integer i = 100;
    Integer j = 100;
    System.out.print(i == j); //true
    Integer i = 128;
    Integer j = 128;
    System.out.print(i == j); //false
    

    java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了

  6. UDP&TCP的区别
    • TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
    • UDP(User Data Protocol,用户数据报协议)是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户和服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。
  7. http请求是如何先建立的三次握手?
    先清楚一个概念http请求与tcp链接之间的关系,在客户端向服务端请求和返回的过程中,是需要去创建一个TCP connection,因为http是不存在链接这样一个概念的,它只有请求和响应这样一个概念,请求和响应都是一个数据包,中间要通过一个传输通道,这个传输通道就是在TCP里面创建了一个从客户端发起和服务端接收的一个链接,TCP链接在创建的时候是有一个三次握手(三次网络传输)这样一个消耗在的。

    • 第一次握手: 建立连接,客户端A发送SYN=1、随机产生Seq=client_isn的数据包到服务器B,等待服务器确认。
    • 第二次握手: 服务器B收到请求后确认联机(可以接受数据),发起第二次握手请求,ACK=(A的Seq+1)、SYN=1,随机产生Seq=client_isn的数据包到A。
    • 第三次握手: A收到后检查ACK是否正确,若正确,A会在发送确认包ACK=服务器B的Seq+1、ACK=1,服务器B收到后确认Seq值与ACK值,若正确,则建立连接。
  8. 过滤器(Filter)
    • Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
    • 拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。拦截器不是在web.xml,比如struts在struts.xml中配置。
    • 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
    • Spring的Interceptor(拦截器)与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
      1. Filter Interceptor Summary
      2. Filter 接口定义在 javax.servlet 包中 接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中
      3. Filter 定义在 web.xml 中
      4. Filter 只在 Servlet 前后起作用。 拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。
      5. Filter 是 Servlet 规范规定的。 而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。 使用范围不同
      6. Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。 而拦截器是在 Spring容器内的,是Spring框架支持的。 规范不同
      7. Filter 不能够使用 Spring 容器资源 拦截器是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如 Service对象、数据源、事务管理等,通过IoC注入到拦截器即可 Spring 中使用 interceptor 更容易
      8. Filter 是被 Server(like Tomcat) 调用 Interceptor 是被 Spring 调用 因此 Filter 总是优先
  9. 即使执行System.exit();finally里的语句不管怎样都会执行
  10. 访问修饰符
    访问权限 同类 同包 子类 其他包
    public 1 1 1 1
    protect 1 1 1 0
    default 1 1 0 0
    private 1 0 0 0
    私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员
    公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态
    保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问
  11. 内存泄漏:生命周期长的对象持有生命周期短的引用
  12. 遍历二叉树:递归 非递归

    • 前序遍历:根左右
    • 中序遍历:左根右
    • 后序遍历:左右根
    • 转换:知二求三
      • 通过前序找到根(最前),再到中序里按根分开,再去前序里找到靠前的即为根,再次分开
      • 通过后序找到根(最后),再到中序里按根分开,再去后序里找到靠后的即为根,再次分开
    public class Recursive{
        public void preOrder(Node root,LinkedList result){
            if(null==root){
                return;
            }
            result.add(root.data);          
            preOrder(root.left,result);
            preOrder(root.right,result);                
        }
    }
    public class NoRecursive{
        //前序,后序先push进入while后pop,取值(注意插入列表的顺序),再判断左右孩子不为空就压栈(注意压栈顺序)
        public LinkedList postOrder(Node root){
            LinkedList<Integer> result=new LinkedList<>();
            Stack<Node> stack=new Stack<>();
            if(null==root){
                return result;
            }
            stack.push(root);
            while(!stack.empty()){
                Node tmp=stack.pop();
                result.add(0,tmp.data);
                if(null!=root.left){
                    stack.push(root.left);
                }
                if(null!=root.right){
                    stack.push(root.right);
                }
            }
            return result;
        }
        //中序,先不push,进入while不为空就push,再往左走,为空就pop,再往右走
        public LinkedList inOrder(Node root){
            Stack<Node> stack=new Stack<>();
            LinkedList<Integer> result=new LinkedList<>();
            while(null!=root||!stack.empty()){
                if(null!=root){
                    stack.push(root);
                    root=root.left;
                }else{
                    Node tmp=stack.pop();
                    result.add(tmp.data);
                    root=tmp.right;
                }
            }
        }
    }
    
  13. redis为什么比MySQL快
    1. Redis是基于内存存储的,MySQL是基于磁盘存储的
    2. Redis存储的是k-v格式的数据。时间复杂度是O(1),常数阶,而MySQL引擎的底层实现是B+Tree,时间复杂度是O(logn),对数阶。Redis会比MySQL快一点点。
    3. Redis是单线程。简化算法的实现,第二,单线程避免了线程切换以及加锁释放锁带来的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。当然了,单线程也会有它的缺点,也是Redis的噩梦:阻塞。如果执行一个命令过长,那么会造成其他命令的阻塞,对于Redis是十分致命的,所以Redis是面向快速执行场景的数据库,例如缓存,分布式session。
    4. Redis是单线程的多路复用IO,而多路复用IO避免了IO等待的开销,在多核处理器下提高处理器的使用效率可以对数据进行分区,然后每个处理器处理不同的数据。
  14. B+tree 红黑树
    • 平衡二叉查找树
      定义为:节点的子节点高度差不能超过1
    • B Tree
      多路平衡查找树 数据存在节点里
    • B+tree
      所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)
  15. 介绍下springMVC
    通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,这样分离后,会让我对整个项目的开发更好的规划,比如做一个web项目,我就知道先设计数据库,然后数据访问层,服务层,控制层,视图层。
  16. GitHub使用技巧
    • 使用搜索条件
      in:name spring boot
      in:readme spring boot
      stars:>1000
      in:description 微服务
      language:java
      pushed:>2019-01-01
  17. 数据库引擎
    • InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,
      • InnoDB主要特性有:
        • InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。
        • InnoDB是为处理巨大数据量的最大性能设计。
        • InnoDB被用在众多需要高性能的大型数据库站点上
    • MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
      • MyISAM拥有较高的插入、查询速度,但不支持事物。
      • MyISAM主要特性有:
        • 大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
    • MEMORY存储引擎将表中的数据存储到内存中,查询和引用其他表数据提供快速访问。
      • MEMORY主要特性有:
        • 不支持事务
  18. list.remove & list.removeAll
    for (int i = 0, size = list.size(); i < size; i++) {
            if (list.get(i) == 2) {
                list.remove(i);
                size--;
                i--;  //注意将i-1,否则打印结果将变为:  [1, 2, 4, 5]
            }
        }
    
    • removeAll
      用于从列表中移除指定collection中包含的所有元素
      移除对象为实体类时注意
      实体类没有Override hashCode和equals方法 !而在执行removeAll方法时是通过equals方法来判断集合元素是否相等的,如果没有Override equals方法,其默认的仍是比较对象,
    • remove()方法不能删除传入的集合对象。括号参数只能是 remove(Object element)和 remove(int index). 而 removeAll()方法中参数只能是 一个集合对象 。而不能是 一个元素名称,如 list.removeAll("Hello");提示错误 。不被允许输入。
  19. 通过 add()方法将 list 添加到 list2 集合中,注意add()方法加入的长度为1 ,即把此前的 list 当做一个元素集合来处理,并且以数组形式显示
  20. 小数在Java中默认为double类型
    • 错误示范: float x = 12.4
    • 正确做法: float x = (float)12.4 或者 float x = 12.4f
  21. 标识符
    • 由字母、下划线、美元符号$、数字构成,长度无限制。
    • 第一个字符不可以是数字字符。
    • 使用比ASCII码更广泛的Unicode字符集,所以在(1)中所说的“字母”包含部分简体中文。
  22. JAVA中转义字符:
    1. 八进制转义序列:\ + 1到3位数字;范围'\000'~'\377',\0:空字符
    2. Unicode转义字符:\u + 四个十六进制数字;0~65535,\u0000:空字符
  23. 字符串编码转换 byte数组
    GBK转UTF-8
    String str = "任意字符串";
    str = new String(str.getBytes("gbk"),"utf-8");
  24. springboot springcloud介绍
    • Spring Boot简化配置,降低难度,开发者更好上手,优点非常多,如:独立运行 简化配置 自动配置 无代码生成和XML配置 无需部署war文件
    • Spring cloud流应用程序启动器是基于SpringBoot的Spring集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。
    • SpringBoot专注于快速,方便的开发单个的微服务个体,SpringCloud关注全局的服务治理框架
    • SpringCloud和Dubbo区别:服务的调用方式Dubbo使用的是RPC(协议)远程调用,而SpringCloud使用的是 Rest API,其实更符合微服务官方的定义
  25. REST是什么
    答:是一种软件架构风格,在REST中的一切都被认为是一种资源,每个资源由URI标识,使用统一的接口处理资源,如HTTP请求中的POST,GET,PUT,DELETE类似创建读取更新和删除操作,无状态,每个请求是一个独立的请求,REST原则:连接无状态,有一致接口,资源均有独一无二的URI
  26. 数据库事务特性
    原子性 一致性 隔离性 持久性
  27. 对称加密算法 非对称加密算法 优缺点 举例 应用场景
    • 对称加密
      • 简介:
        对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。
      • 特点:
        加密速度快、加密效率高。安全性得不到保证,密钥管理困难
      • 具体算法:DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。
      • 非对称加密
      • 简介:
        因为加密和解密使用的是两个不同的密钥,
      • 特点:
        算法强度复杂,安全性高,速度慢
      • 主要算法:
        RSA、Elgamal、背包算法、Rabin、HD,ECC(椭圆曲线加密算法)。
        使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。
  28. hibernate
    • 为什么要使用
      1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
      2. Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM 实现。他很大程度的简化DAO层的编码工作
      3. hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,
  29. 什么是延迟加载?
    延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。
  30. 静态代码块执行顺序
    • 父静>子静>父非静>父构造>子非静>子构造
    • 首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,
    • 如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
    • 子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
  31. 面向字符的输入流 InputStreamReader
  32. 构造器不能被继承 不能把重写
  33. 进程和线程的区别
    • 引入线程的目的:在传统的操作系统中,拥有资源和程序执行的基本单位都是进程,但是为了提高操作系统的并发性能,引入线程作为基本的CPU执行单元。
    • 进程和线程的关系:一个进程可以由多个线程组成,同一进程的线程可以并发执行,进程拥有独立的地址空间,同一进程的线程可以共享进程的资源,所以同一进程内的线程切换时,时空开销很少。
    • 资源拥有方面:进程是拥有资源的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,线程可以访问所隶属进程的资源。
    • 通信方面:线程之间的通信更方便,进程之间的通信较困难。
    • 创建销毁方面:创建和撤销一个线程比启动一个进程的开销要小。
  34. 进程之间的通信方式
    1. 共享存储:在通信进程之间存在一块可以直接访问的共享空间,通过对这块共享空间的读写操作,实现进程之间的通信。
    2. 消息传递:
      直接通信方式:利用系统提供的进程消息发送和消息接收功能进行通信。
      间接通讯方式:发送进程先把消息发送到某个消息存储设备当中,接收进程从这设备当中消费消息。
    3. 管道通信:是消息传递的特殊方式,发送进程向管道写入数据,接收进程从管道中读取数据。
    4. 信号量(PV操作)在系统中创建一个信号量集合(本质是个数组),可以使进程互斥地访问临界资源。
  35. 线程之间的通信方式(Java线程之间的通信)
    1.锁机制
    2.使用Object类的wait() 和 notify() 方法
    3.使用JUC工具类 CountDownLatch
    4.关键字synchronize,volatile
  36. 多进程与多线程的区别
    线程共享所属进程的资源,所以线程之间的通信比进程之间的通信更有效、更容易。上下文切换的时空开销也较少。
  37. 0.654是什么数据类型
    double
  38. 设计模式 aop属于什么
    • AOP:代理模式
    • 单例模式
      所谓的单例设计指的是一个类只允许产生一个实例化对象。
    • 工厂设计模式
      • 工厂方法模式
        普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
        使用工厂类来创建数据库的连接对象
      • 静态工厂方法模式
        将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
  39. 单列模式
    • 饿汉式
      public class Singleton{
          private static Singleton instence = new Singleton;
          private Singleton(){}
          public static Singleton getInstence(){
              return instence;
          }
      }
      
    • 懒汉式线程安全
      public class Singleton{
          private static Singleton instence;
          private Singleton(){}
          public static synchronized Singleton getInstence(){
              if(instence==null){
                  instence=new Singleton();
              }
              return instence;
          }
      }   
      
  40. 完全二叉树 最后节点可以只有一个子节点
  41. ftp 端口号
    默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。
  42. SSH是标准的网络协议
    可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全性。
  43. get post区别
    • GET在浏览器回退时是无害的,而POST会再次提交请求。
    • GET产生的URL地址可以被加入到书签,而POST不可以。
    • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    • GET请求只能进行url编码,而POST支持多种编码方式。
    • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    • GET请求在URL中传送的参数是有长度限制的,而POST么有。
    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    • GET参数通过URL传递,POST放在Request body中。
    • 大多数浏览器通常都会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。
    • http是明文传输,所以post的数据还是能被查看,所以最好使用https协议,它使用SSL加密,更加安全。
  44. System.out.println("5"+2);
    输出52
  45. 下面的方法,当输入为2的时候返回值是多少?()
    public static int getValue(int i) {
        int result = 0;
        switch (i) {
        case 1:
            result = result + i;
        case 2:
            result = result + i * 2;
        case 3:
            result = result + i * 3;
        }
        return result;
    }
    

    A0 B2 C4 D10
    答案:D
    解析:注意这里case后面没有加break,所以从case 2开始一直往下运行

  46. 在Java Web开发中,不同的客户端需要共享数据,则数据应该存储在( B )中。
    A. session B. application C. request D. response
  47. GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。
    例如学号和姓名,一一对应的
  48. TCP/IP协议栈的网络层的主要功能是通过以下哪个协议来完成的?()
    A IP协议
    B TCP协议
    C 以太网协议
    D IGP协议
    正确答案:A
  49. 滑动窗口
    解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。
  50. HTTPS使用SSL协议对报文进行封装
  51. Java程序中的起始类名称必须与存放该类的文件名相同
  52. 不通过构造函数也能创建对象吗
    A. 是 B. 否
    答案:A
    解析:Java 创建对象的几种方式(重要):

    1. 用 new 语句创建对象,这是最常见的创建对象的方法。
    2. 运用反射手段,调用 java.lang.Class 或者 java.lang.reflect.Constructor 类的 newInstance() 实例方法。
    3. 调用对象的 clone() 方法。
    4. 运用反序列化手段,调用 java.io.ObjectInputStream 对象的 readObject() 方法。
      1.和2.都会明确的显式的调用构造函数 ;3.是在内存上对已有对象的影印,所以不会调用构造函数 ;4.是从文件中还原类的对象,也不会调用构造函数。
  53. 完整的url访问过程
    从浏览器输入一个URL(www.baidu.com)的全过程

    1. 根据域名到DNS中找到IP
    2. 根据IP建立TCP连接(三次握手)
    3. 连接建立成功发起http请求
    4. 服务器响应http请求
    5. 浏览器解析HTML代码并请求html中的静态资源(js,css)
    6. 关闭TCP连接(四次挥手)
    7. 浏览器渲染页面
  54. 在OSI参考模型中,第N层和其上的第N+1层的关系是( )。
    A第N+1层将为从第N层接收的信息增加一个信头
    B第N层利用第N+1层的服务
    C第N层对第N+1层没有任何作用
    D第N层为第N+1层提供服务
    正确答案:D
  55. Java语言中,关于sleep()和wait(),以下描述不正确的是(D )。* 【多选题】
    A. sleep是线程类(Thread)的方法,wait是Object类的方法;
    B. sleep不释放对象锁,wait放弃对象锁;
    C. sleep暂停线程、但监控状态仍然保持,结束后会自动恢复;
    D. wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态。
    //还有notifyAll
  56. 在Java EE中,Servlet是在服务器端运行,以处理客户端请求而做出的响应的程序,下列选项中属于Servlet生命周期阶段的是(E)
    A. 加载和实例化
    B. 初始化
    C. 服务
    D. 销毁
    E. 全部
  57. 关于JavaScript里的xml处理,以下说法正确的是 ()
    Xml是种可扩展标记语言,格式更规范,是作为未来html的替代
    Xml一般用于传输和存储数据,是对html的补充,两者的目的不同
    在JavaScript里解析和处理xml数据时,因为浏览器的不同,其做法也不同
    在IE浏览器里处理xml,首先需要创建ActiveXObject对象
    正确答案:C D
  58. 下面哪些不是Thread类的方法
    start()
    run()
    exit()
    getPriority()//返回线程优先级
    正确答案:C
  59. 要动态改变层中内容可以使用的方法有(AB )
    a)innerHTML
    b)innerText
    c)通过设置层的隐藏和显示来实现
    d)通过设置层的样式属性的display属性
  60. javascript基础题目
  61. java8中,忽略内部接口的情况,不能用来修饰interface里的方法的有( )
    A private
    B public
    C protected
    D static
    正确答案:A C
  62. Java8的接口方法可以有如下定义
    only public, abstract, default, static and strictfp are permitted
  63. java 1.8开始支持接口中定义静态方法,

  64. int n;
    System.out.println(n=0);
    if (n=0){
    

    判断条件n = 0,先将0赋给int型变量n,这时候条件是一个int类型的0,

  65. 下列值不为true的表达式是(C)
    A ."john" = = "john"
    B ."john".equals("john")
    C ."john" = "john"
    D ."john".equals(new String("john"))
  66. JSP九个隐式对象:
    request response out session application pageContext page config exception
    隐式对象就是不需要我们new的对象,直接的我们就可以在页面使用的对象,
  67. 空白符字符输入

    char temp;
    string str;
    while((temp=cin.get())!='\n'){
        str+=temp;
    }
    cout<<str.length()<<endl<<str<<endl;
    for(int i=0;i<str.length();i++){
        cout<<str[i]<<endl;
    }
    
  68. 新闻文章 id springmvc 占位符
    @RequestMapping("restful/{id}")
    @ResponseBody
    public String showInfo6(@PathVariable Integer id){
        System.out.println("restful id:"+id);
        return "id:"+id;
    }
    
  69. tomcat 与 nginx的区别是什么?
    • nginx常用做静态内容服务和代理服务器(不是你FQ那个代理),直面外来请求转发给后面的应用服务(tomcat,django什么的)
    • tomcat更多用来做做一个应用容器,让java web app跑在里面的东西
    • 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
    • 负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理
  70. Node.js
    运行在服务端的 JavaScript。
  71. dubbo序列化
    dubbo RPC默认启用的序列化方式hessian2
    FST序列化方式的性能多数都显著优于 hessian2
    使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:
  72. AOP
    • spring 中 AOP是基于 “动态代理” 实现,其采用了两种方式:
      • JDK 动态代理
        采用java内置的代理API实现,cglib代理类的实现效率是比 jdk代理类实现效率要高,并且更强大的,但spring中更推荐使用java原生的代理方式,因为稳定。
        生成的代理类实现了被代理对象的接口并继承Proxy
      • CGLIB 动态代理
        采用第三方API实现,生成的代理类是直接继承被代理类
  73. 动态代理和静态代理
    静态代理:编译时将增强代码植入class文件,因为是编译期进行的增强,所以代码运行时效率比动态代理高。使用Aspect可以实现静态代理。
    动态代理:运行时生成代理类并加载,效率比静态代理要低,spring中使用了上文中的两种动态代理的方式来实现代理类的生成。
  74. Java多线程实现(四种方法)
    1. 继承Thread类,重写run方法(其实Thread类本身也实现了Runnable接口)
      new Thread子类().start()
    2. 实现Runnable接口,重写run方法
      new Thread(Runnable接口实现类的对象).start()
    3. 实现Callable接口,重写call方法(有返回值)
      public class MyThread {
          public static void main(String ards[]) throws InterruptedException, ExecutionException{
              for(int i=0;i<10;i++){
                  Callable<Integer> implCallable = new ImplCallable();
                  FutureTask<Integer> futureTask = new FutureTask<Integer>(implCallable);
                  new Thread(futureTask).start();
                  System.out.println(Thread.currentThread().getName()+"----"+futureTask.get());
              }
              System.out.println(Thread.currentThread().getName());
          }           
      }
      //重写call方法
      class ImplCallable implements Callable<Integer>{
      
          @Override
          public Integer call() throws Exception {
              int result = 0;
              for(int i=0;i<10;i++){
                  result += i;
              }
              System.out.println(Thread.currentThread().getName());
              return result;
          }
      
      }
      
    4. 使用线程池(有返回值)
      public class ThreadPool {
          public static void main(String[] args){
              //使用Executors工具类中的方法创建线程池
              ExecutorService pool = Executors.newFixedThreadPool(5);
              ThreadPoolDemo demo = new ThreadPoolDemo();
              //为线程池中的线程分配任务,使用submit方法,传入的参数可以是Runnable的实现类,也可以是Callable的实现类
              for(int i=1;i<=5;i++){
                  pool.submit(demo);
              }
              //关闭线程池
              //shutdown : 以一种平和的方式关闭线程池,在关闭线程池之前,会等待线程池中的所有的任务都结束,不在接受新任务
              //shutdownNow : 立即关闭线程池
              pool.shutdown();
          }
      }
      class ThreadPoolDemo implements Runnable{
          /**多线程的共享数据*/
          private int i = 0;
          @Override
          public void run() {
              while(i<=50){
                  System.out.println(Thread.currentThread().getName()+"---"+ i++);
              }
          }
      }
      
  75. Java读取txt文件
    FileReader file=new FileReader("C:\\Users\\Yuyy\\Desktop\\Ego.txt");
    BufferedReader bufferedReader=new BufferedReader(file);
    String line="";
    while((line=bufferedReader.readLine())!=null){
        System.out.println(line);
    }
    
  76. Java写入txt文件
    File file1 = new File("C:\\Users\\Yuyy\\Desktop\\out.txt");
    file1.createNewFile();
    FileWriter fileWriter=new FileWriter(file1);
    BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
    bufferedWriter.write("4545sssafaf");
    bufferedWriter.flush();
    bufferedWriter.close();
    
  77. Orecal分页
    SELECT
        * 
    FROM
        (
        SELECT
            tb1.*,
            ROWNUM ROWNUM1 
        FROM
            ( 
            SELECT * 
            FROM TABLE1 
            WHERE TABLE1_ID = XX 
            ORDER BY GMT_CREATE DESC 
            ) tb1 
        WHERE
            ROWNUM <= 20 ) 
    WHERE ROWNUM1 >= 10;    
    
  78. a*=b+3
    a=a*(b+3)
  79. 对于整数
    有long的运算,结果为long
    没有long,结果为int
  80. 对于浮点数
    有double的运算,结果为double
    没有double,结果为float
  81. 442&545 //按位与运算 按二进制每位进行与运算
    545|122 //按位或运算
    122^545 //按位异或运算
    ~55 //取反码
    true&false //与运算
    true|flase //或运算
    a^b //异或运算 不同为true 相同为false
    true&&true //短路与运算
    flase||true //短路非运算
    位运算 效率高,工作中可用
    a<<1 //a*=2 a<<2 //a*=4 a>>2 //a/=2
  82. a+b 当参数为字符串时 +号变成字符串连接符
    int a=3;            
    int b=4;
    String c="5";
    char d='a'
    sout(a+b+c);  //75
    sout(c+a+b);  //534
    sout(a+d);  //100 将字符转为Unicode码对应的int来算
    
  83. 多用条件运算符,三目运算
    x?y:z
  84. 运算符优先级
    括号
    一元运算符 符号,~,++,--
    算术运算符 *,%,+,-
    位运算 >>,<<
    关系运算符 >,<,=
    位运算 &,^,|
    逻辑运算符 &&,||
    条件运算符 ?:
    赋值运算符 =,+=,-=
  85. 表示范围小的数据类型可以转表示范围大的数据类型
    double a=454L;
  86. 可以将int赋值给short,byte,char,只要不超过其表示范围即可,不需要强制类型转换
  87. Linux中drwxr-xr-x.的意思和文件权限详解
    -:普通文件,
    d:目录文件,
    l:链接文件,
    b:设备文件,
    c:字符设备文件,
    p:管道文件

    r:可读取文件的实际内容
    w:可编辑、新增、修改该文件的实际内容
    x:可被执行

    所有者(属主)有读写权限,
    所有组(属组)有读权限,
    其余人也仅有读权限。

  88. 二分查找

    while(low<=high){        //注意是<=
        count++;
        mid=(low+high)/2;
        mid="<<mid<<endl;
        if(guess==a[mid]){  //成功的条件
            flag=1;
            cout<<"success!比较次数:"<<count<<"次"<<endl;
            break;//查找成功就退出,如果想要继续查找也是可以的
        }
        if(guess>a[mid]){
            low=mid+1;
        }
        if(guess<a[mid]){
            high=mid-1;
        }       
    }
    
  89. GC
    年轻代、年老代、持久代
    Eden、Survivor、Old

    • Eden,对应MinorGc,采用效率高的复制算法,存储了未通过垃圾回收的对象,Eden满了就会触发Minor Gc
    • Survivor存放垃圾回收后的对象,Survivor1、Survivor2,同一时间只使用一块,当对象经历了15次垃圾回收后便进入年老代。
      持久代存放静态文件,如类,方法等,对应方法区
    • Major Gc用于清理年老代
    • Full Gc用于清理年轻代,年老代,成本较高,对系统能产生影响.
    • 回收过程
      1. 新创建的对象,大多数存放在Eden区
      2. 当Eden区满了(达到一定比例),不能创建新对象,则出发MinorGc,清理无用对象,将剩余对象复制到某个Survivor区,同时清空Eden区。
      3. 当Eden区再次满了,会将S1和Eden中不能清空的对象存到S2,清空S1,Eden。
      4. 经历15次未被清理的对象将被复制到年老区
      5. 当Old区满了,触发FullGc
    • Jvm调优很大部分工作都是针对FullGc
      • 触发FullGc的有
      1. 年老代满
      2. 持久代满
      3. System.gc()被显示调用(并不会立刻执行,只是建议jvm执行,执不执行,什么时候执行由jvm控制
      4. 上一次Gc之后Heap的各域分配策略动态变化
  90. 内存泄漏
    1. 创建大量无用对象,例如拼接字符串使用String。
    2. 静态集合类的使用,HashMap、Vector、List之类的,最容易造成内存泄漏,这些静态变量的生命周期与程序的生命周期一致,所有的对象Object不能被释放。
    3. 各种连接对象(IO流对象,数据库连接对象,网络连接对象)未关闭。
    4. 监听器的使用,释放对象时,没删除对应的监听器。
  91. man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。
    man(选项)(参数)
    数字:指定从哪本man手册中搜索帮助;
    关键字:指定要搜索帮助的关键字。
    man是按照手册的章节号的顺序进行搜索的,比如:
    man sleep
    只会显示sleep命令的手册,如果想查看库函数sleep,就要输入:
    man 3 sleep
  92. TCP和UDP
    1. TCP主要的特点:
      1. TCP是面向连接的的运输层协议;
      2. 每一条TCP连接只能有两个端点,每一条TCP只能是点对点的;
      3. TCP提供可靠交付的服务;
      4. tcp提供全双工通信;
      5. 面向字节流。
    2. UDP的主要特点:
      1. udp是无连接的,即发送数据之前不需要建立连接;
      2. udp使用尽最大努力交付,即不保证可靠交付;
      3. udp是面向报文的;
      4. udp没有阻塞控制;
      5. udp支持一对一、一对多、多对一和多对多交互通信;
      6. udp的首部开销小。
    3. tcp和udp各自应用的场合:
      • UDP 适用于不需要可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。
      • UDP 是传输层协议, 服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。
      • TCP是一种面向连接的、可靠的、基于字节流的运输层通信协议,通常由IETF的RFC 793说明。在简化的计算机网络OSI模型中,它完成运输层所指定的功能。一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等
  93. java中的异常是指Java程序在运行过程中所产生的运行错误
  94. 不再使用HttpSession时,应该尽早使用 invalidate() 方法释放。
  95. 如果这个类的成员变量是基本的数据类型,就算声明的时候没有进行初始化,系统也会自动给其初始化一个值,但是方法里面的局部变量则必须要声明一个初值,否则无法通过编译(eclipse中)
  96. 保留字是为java预留的关键字,他们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字。
    1030 想要使定义在该类所在的包外的类不能访问这个类,你应该用什么关键字?不用关键字的话就默认为只能包内的类访问这个类。
  97. 知道jvm gc过程吗?
    • 通过可达性分析的无用的对象,会首先被标记,以确定对象是否需要执行finaliize()方法;之后会进行一次筛选,如果对象覆盖了finalize()方法,同时finalize()没有被其他虚拟机调用,则该对象再次被标记;
    • 通过了第二次标记的对象会加入一个F-Queue的队列,同时等待一个由虚拟机自启的,低优先级的Finalizer线程去执行gc;
    • 执行:这里的执行只能保证触发,并不保证会虚拟机会等待它执行完成
    • 自我拯救:在第一次标记后,线程仍然有机会去和可达性分析可以到达的线程建立联系,来再次使自己免于被回收
  98. 排序算法 时间复杂度计算
  99. 集合相关
  100. 红黑树
  101. 小根堆
  102. 实习遇到的问题,学到了什么
  103. 回答问题要全面和扩展
  104. Ego项目难点
    为了提升效率,对项目做了很多优化。缓存,solr,单点登录,数据库设计,mycat分库,MySQL主从数据库,读写分离
  105. 50道SQL练习题及答案与详细分析
  106. Java面试,如何在短时间内做突击
  107. Java笔试知识点总结(基础)
  108. Java面试宝典导读
  109. Java 面试知识点解析(一)——基础知识篇
作者:Yuyy
博客:https://yuyy.info

评论

  1. MiMonarchRD
    Windows Chrome
    4年前
    2020-1-30 15:25:47
  2. ExoRank
    4年前
    2020-1-31 1:13:42

    Awesome post! Keep up the great work! 🙂

    • Allan
      SEO Affiliate
      iPhone Safari
      4年前
      2020-2-02 0:16:16

      Are you real people?

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇