Java基础总结3

1、^异或运算符

  

 2、SpringMVC工作原理图

  

 3、形参与实参

  比如定义一个函数void add(int a, int b),这里的a和b就是形参。

  当进行函数调用的时候,add(1, 2),这里的1和2就是实参。

 4、获取今天之后的第15天
 public static String getTimeLateFifteen() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, +15);
        String endDate = DateFormatUtils.format(calendar.getTime(), "yyyy-MM-dd");
        return endDate;
    }

5、枚举被设计成是单例模式,即枚举类型会由JVM在加载的时候,实例化枚举对象,你在枚举类中定义了多少个就会实例化多少个,JVM为了保证每一个枚举类元素的唯一实例,是不会允许外部进行new的,所以会把构造函数设计成private,防止用户生成实例,破坏唯一性。

6、

<!-- 配置实体类的别名,配置实体类别名的目的是为了在引用实体类时可以使用实体类的别名来代替实体类,达到简写的目的 -->
    <typeAliases>
        <package name="me.gacl.domain"/>
    </typeAliases>

  <package name="me.gacl.domain"/>就表示为这个包下面的所有实体类设置别名。MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名,比如me.gacl.domain.User这个实体类的别名就会被设置成User。

7、  (1) 当 lenth = 2n 时,X % length = X & (length - 1);

  (2) 对于 Map 集合,我们可以选取Java中的基本类型,还有引用类型 String 作为 key,因为它们都按照规范重写了 equals 方法和 hashCode 方法。但是如果你用自定义对象作为 key,那么一定要覆写 equals 方法和 hashCode 方法,不然会有意想不到的错误产生;

    (3) 输出:把程序(内存)中的内容输出到磁盘、光盘等存储设备中

    

 

         输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
    
  (4) 存储字母、数字:无论什么字符集都占有 1 个字节。
     存储汉字:GBK 家族占有 2 个字节,UTF-8 占有 3 个字节。不能使用单字节的字符集(ASCII/ISO-8859-1)来存储中文
  (5) http://start.spring.io/  使用Spring Boot构建Maven项目。
  (6) 关于有参构造器参数为String类型情况下内存分配问题:
     参考孤傲苍狼关于static关键字的博客  http://www.cnblogs.com/xdp-gacl/p/3637407.html
  (7) Java类的加载问题
  (8) 使用?通配符可以引用其他各种参数化的具体类型,?通配符定义的变量主要用作引用,可以调用与参数无关的方法,不能调用与参数有关的方法;
     T通配符则可以引用各种抽象类型,可以调用与参数有关的方法。
  (9) 在mybatis的mapper文件中,对于传递的参数我们一般是使用#和$来获取参数值。当使用#时,变量是占位符,就是一般我们使用javajdbc的PrepareStatement时的占位符,所以可以防止sql注入;当使用$时,变量就是直接追加在sql中,一般会有sql注入问题。参考我没有三颗心脏博客:http://www.cnblogs.com/wmyskxz/p/9056776.html
  mapper文件中#和$的区别,参考:https://blog.csdn.net/nuaazhaofeng/article/details/53614062
  (12) 关于Spring面试的一些问题:http://www.importnew.com/15851.html#spring_framework

8、将二进制数(10.10101)2转化为十进制数。(10.10101)2=(1x21+0x20+1x2-1+0x2-2+1x2-3+0x2-4+1x2-510=(2+0+0.5+0+0.125+0+0.03125)10=(2.65625)10

 将二进制数(10.10101)2转化为十六进制数。(10.10101)2=(0010.1010 1000)2=(2.A8)16

 将十进制数(93)10转换成二进制数。

    93/2=46……….1      

    46/2=23……….0

    23/2=11……….1

    11/2=5…………1

    5/2=2…………...1

    2/2=1……………0

    1/2=0……………1

   (93)10=(1011101)2

 将十进制数(0.3125)10转换成二进制数。

    0.3125x2 = 0 . 625

    0.625x2 = 1 .25

    0.25x2 = 0 .5

    0.5x2 = 1 .0

   (0.3125)10=(0.0101)2

   将十进制数(93)10转换成十六进制数。

    93/16=5…………13(D)

   (93)10=(5D)16

 将十进制数(0.3125)10转换成十六进制数。

    0.3125x16 = 5 .0

   (0.3125)10=(0.5)16

 将十六进制数(A7)16转换成二进制数。

  (A7)16=(A 7)16=(1010 0111)2=(10100111)2

 将十六进制数(0.D4)16转换成二进制数。

  (0.D4)16=(0. D 4)16=(0. 1101 0100)2=(0.110101)2

   将十六进制数(A7)16转换成十进制数。

  (A7)16=(10x161+7x16010=(160+7)10=(167)10

   将十六进制数(0.D4)16转换成十进制数。

  (0.D4)16=(0+13x16-1+4x16-210=(0+0.8125+0.015625)10=(0.828125)10

9、ClassLoader:https://blog.csdn.net/briblue/article/details/54973413

双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是这样,最终都应该传送到顶层的启动类加载器中,只有当父类反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

 使用双亲委派模型来组织类加载器之间的关系,有一个显而易见测好处就是Java类随着它的类加载器一起具备了一种带有优先级的层次关系。

能不能自己写一个类叫java.lang.String?

答案:不可以。原因就是因为JVM的类加载器采用的这种双亲委派模型,当我们写了一个类叫java.lang.String时,类加载器发现已经加载过一个同样的类了,不用加载了,直接使用就可以了。所以自己写的这个java.lang.String这个类可以编译通过,但是无法被加载运行。

实现双亲委派的代码集中在java.lang.ClassCloader的loadClass()方法中,首先检查自己是否已经被加载过,如果没有加载则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父加载器加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

10、final关键字

  修饰类:  当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

    修饰方法:    以防任何继承类修改它的含义。

    修饰变量: 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

11、Class.forName()和ClassLoader.loadClass()区别

  Class.forName():将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块;

  ClassLoader.loadClass():只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

  注:  Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。

12、三次握手和四次挥手

  参考我没有三颗心脏博客:http://www.cnblogs.com/wmyskxz/p/9056776.html

  参考一江水博客:https://www.cnblogs.com/rootq/articles/1377355.html  

13、SQL语言的分类

  SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

    DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块: SELECT <字段名表>  FROM <表或试图名>    WHERE <查询条件>   

    DML主要有三种形式:插入:INSERT  更新:UPDATE  删除:DELETE

    DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:CREATE / DROP / TRUNCATE TABLE  /  VIEW  /  INDEX  /  SYN  /  CLUSTER

    DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:

      1) GRANT:授权。

      2) ROLLBACK TO :回退到某一点。回滚---ROLLBACK  SQL>ROLLBACK;

      3) COMMIT :提交。(1) 显式提交  SQL>COMMIT;(2) 隐式提交  ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,

      DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。(3) 自动提交  SQL>SET AUTOCOMMIT ON;

14、JSP静态导入:<%@include file="被包含的页面的路径"%>   最终得到一个class文件

  JSP动态导入:<jsp:include page="被包含页面的路径"></jsp:include>  最终得到两个class文件

15、(1)servlet的请求流程  参考我没有三颗心脏博客:http://www.cnblogs.com/wmyskxz/p/8804447.html

   (2)JSP的生命周期:1)翻译: jsp->java文件 
          2)编译: java文件->class文件(servlet程序) 
          3)构造方法(第1次访问) 
          4)init方法(第1次访问):_jspInit() 
          5)service方法:_jspService() 
          6)destroy方法:_jspDestroy()

    注:Servlet的service方法会自动调用HttpJspBase的_jspService方法, init会自动调用HttpJspBase的_jspInit()方法,所以jsp生命周期中调用的是_jspService()而不是servlet中service()。

    总结:当访问一个 JSP 页面时,该页面请求将会讲给服务器中的 JSP 引擎去处理,它负责解释和执行 JSP 页面,每个 JSP 页面在第一次被访问时,JSP 引擎就会将它翻译成一个继承自 org.apache.jasper.runtime.HttpJspBase类的 Servlet 源程序,接着再编译成 class 类文件,再由 Web 容器像调用普通 Servlet 程序一样的方式来装载和解释执行这个由 JSP 页面翻译成的 Servlet 程序。

  (3)JSP九大内置对象、JSP四大作用域:参考我没有三颗心脏博客:http://www.cnblogs.com/wmyskxz/p/8805498.html

  (4)EL表达式中${msg}等价于<%=pageContext.findAttribute("msg")==null ? "" : pageContext.findAttribute("msg") %>

16、转发与重定向的区别:

  转发(forward):request.getRequestDispatcher(path).forward(request, response);  path:上下文路径/资源路径

    (1)地址栏中的地址不会改变,通常看作是服务端的跳转。

    (2)只有一个请求。

    (3)资源是共享的,也就是说在两个servlet中可以共享请求的资源。request.setAttribute(String str,Object obj);    request.getAttribute(str);

    (4)可以访问WEB-INF中的资源。

    (5)请求转发不能跨域访问,所谓同域,是指域名、协议、端口均相同。

  重定向(redirect):response.sendRedirect(String location);

    (1)地址栏中的地址会发生改变,通常看作是客户端跳转。

    (2)有两个请求。

    (3)在两个servlet中不可以共享请求中的数据。

    (4)最终的响应由重定向后的servlet来决定,和发送请求的servlet没有关系。

    (5)不可以访问WEB-INF中的资源。

    (6)重定向能够跨域访问,就像是网页中点开了新的链接一样。

17、关于时间类型和字符串之间的转换问题:

  使用org.apache.commons.lang3.time.DateFormatUtils和org.apache.commons.lang3.time.DateUtils两个包。

  DateUtils.parseDate(str, parsePatterns);

  DateFormatUtils.format(date, pattern);

  创建自定义的转换类:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringAndDateUtil {
    private static ThreadLocal<DateFormat> threadLocal=new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };
    public static Date parseString(String dateStr) throws ParseException {
        return threadLocal.get().parse(dateStr);
    }

    public static String formatDate(Date date) {
        return threadLocal.get().format(date);
    }
}对于调用threadLocal中关于initialValue()方法时,实际上调用的都是StringAndDateUtil类重写的initialValue()方法。

18、sleep() 与 wait()的区别

  sleep 方法:是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话

  wait 方法:是 Object 的方法,必须与 synchronized 关键字一起使用,线程进入阻塞状态,当 notify 或者 notifyall 被调用后,会解除阻塞。但是,只有重新占用互斥锁之后才会进入可运行状态。睡眠时,释放互斥锁。

  

posted @ 2018-03-21 10:16  祎丫丫  阅读(354)  评论(0编辑  收藏  举报