Wilder's Blog.

每月一牛客-Java篇(2)

字数统计: 3.7k阅读时长: 13 min
2018/08/01 Share

Java 题目

2018.8.1

  • 通过HttpServletRequest.getParameter获取的参数由客户端浏览器和Web容器配置共同决定编码
  • 方法的重写两同两小一大原则:
    • 方法名相同,参数类型相同
    • 子类返回类型小于等于父类方法返回类型
    • 子类抛出异常小于等于父类方法抛出异常
    • 子类访问权限大于等于父类方法访问权限

2018.8.2

  • ArrayList 的构造函数总共有三个:

    • ArrayList() 构造一个初始容量为10的空列表
    • ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排
    • ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
  • DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。DBMS对数据库的保护通过4个方面来实现:

    • 数据库的恢复
    • 数据库的并发控制
    • 数据库的完整性控制
    • 数据库的安全性控制

    DBMS中实现事务持久性的子系统是恢复管理子系统。可以这么理解:要想事务具有持久性,就得在事务出错时及时恢复

  • 包装类的 “==” 运算在不遇到算术运算的情况下不会自动拆箱

    包装类的 equals() 方法不处理数据转型

  • Servlet的生命周期一般可以用三个方法来表示:

    1. init():仅执行一次,负责在装载Servlet时初始化Servlet对象
    2. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。
    3. destory():在停止并且卸载Servlet时执行,负责释放资源

    初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的

2018.8.3

  • 1
    2
    3
    4
    5
    6
    7
    byte b1=1,b2=2,b3,b6,b8;
    final byte b4=4,b5=6,b7;
    b3=(b1+b2); /*语句1*/
    b6=b4+b5; /*语句2*/
    b8=(b1+b4); /*语句3*/
    b7=(b2+b5); /*语句4*/
    System.out.println(b3+b6);

    ————知识点————

    Java表达式转型规则由低到高转换

    1、所有的byte,short,char型的值将被提升为int型;

    2、如果有一个操作数是long型,计算结果是long型;

    3、如果有一个操作数是float型,计算结果是float型;

    4、如果有一个操作数是double型,计算结果是double型;

    5、被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。

    ————–解析————–

    语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;

    语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型;

    语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);

    语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变

2018.8.4

  • 接口 只能用 public abstract 修饰。only public & abstract are permitted

    内部接口 only public, protected, private, abstract & static are permitted

  • full GC触发的条件
    除直接调用System.gc外,触发Full GC执行的情况有如下四种。

    1. 旧生代空间不足
      旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
      java.lang.OutOfMemoryError: Java heap space
      为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。
    2. Permanet Generation空间满
      PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:
      java.lang.OutOfMemoryError: PermGen space
      为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。
    3. CMS GC时出现promotion failed和concurrent mode failure
      对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。
      promotionfailed是在进行Minor GC时,survivor space放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。
      应对措施为:增大survivorspace、旧生代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。对于这种状况,可通过设置-XX:CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。
    4. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
      这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。
      例如程序第一次触发MinorGC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。
      当新生代采用PSGC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。
      除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过- java-Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

都是Throwable的子类:

1.Exception(异常):是程序本身可以处理的异常。

2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。

3.检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。

2018.8.6

  • 几种数组复制的方法:(1)for循环逐一复制;(2)System.arraycopy ;(3)Array.copyOf;(4)使用clone方法

    效率对比:System.arraycopy > Array.copyOf > 使用 clone 方法 > for 循环逐一复制

    • System.arraycopy 方法调用的是本地native方法,效率最高
    • Array.copyOf 源码中调用的是 System.arraycopy 方法,自然效率低于前者

2018.8.7

  • finally 语句的有关说法

    • 不管 catch 是否异常,finally 语句块都是要被执行的
    • 在 try 语句块或 catch 语句块中执行到 System.exit(0) 直接退出程序
    • finally 块中的 return 语句会覆盖 try 块中的 return 返回
    • finally 语句块在 catch 语句块的 return 语句之前执行
  • 下面程序的运行结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void main(String args[]) {
    Thread t=new Thread(){
    public void run(){
    dianping();

    }
    };
    t.run();
    System.out.print("dazhong");
    }
    static void dianping(){
    System.out.print("dianping");
    }

    运行结果为:dianpingdazhong

    因为现在只是创建了线程并没有调用 start( ) ,只是声明了线程,所以说是按照顺序执行

2018.8.10

  • 关于类的一些叙述
    • 类不可以多继承但是可以多实现
    • 抽象类和接口都不可以定义成员变量,但是他们可以定义静态成员变量,接口的静态成员变量需要用 public static final 进行修饰
    • 抽象类和接口都不能被实例化
  • Java 异常处理的叙述
    • final 可以用来声明属性和方法,分别表示属性的不可变和方法的不可重写
    • throws 是用来声明一个成员方法可能抛出的各种非运行异常情况
    • throw 是用来明确地抛出一个异常情况

2018.8.13

  • JSP 内置对象及方法

    • request对象: 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
  • response对象:response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
  • session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
  • out对象:out对象是JspWriter类的实例,是向客户端输出内容常用的对象
  • page对象:page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
  • application对象:application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
  • exception对象:exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
  • pageContext对象:pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
  • config对象:config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
  • 关于JDK中的一些工具

    • javac.exe 是编译 .java 文件
    • java.exe 是执行编译好的 .class 文件
    • javadoc.exe 是生成 java 说明文档
    • jdb.exe 是 java 调试器
    • javaprof.exe 是剖析工具
  • 关于计算机的编码

    了解ANSI和ASCII、Unicode 和 UTF-8的区别

2018.8.14

  • Java 提供的事件处理模型是一种人机交互模型,它有三个基本要素:

    • 事件源:即事件发生的场所,就是指各个组件,如按钮等,点击按钮就是组件上发生的一个事件;
    • 事件:事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
    • 事件监听器:负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件
  • 会话跟踪技术描述:

    • Cookie 是 Web 服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端
    • 关闭浏览器意味着临时会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期
    • 在禁用cookie时可以使用URL重写技术跟踪会话

    URL重写技术跟踪session(1)

    URL重写技术跟踪session(2)

    • 隐藏域在页面中对于用户(浏览器)是不可见的,在表单中插入隐藏域的目的在于收集或发送信息,以利于被处理表单的程序所使用。浏览者单击发送按钮发送表单的时候,隐藏域的信息也被一起发送到服务器。

2018.8.19

  • 方法重载和重写的描述
    • 方法重载:1、必须是同一个类;2、方法名一样;3、参数类型不一样或参数数量不一样
    • 方法重写:1、方法名相同,参数类型相同;2、子类返回类型小于等于父类方法返回类型;3、子类抛出异常小于等于父类方法抛出的异常;4、子类访问权限大于等于父类方法访问权限

2018.8.31

  • 对 final 关键字的说法
    • final 是 java 中的修饰符,可以修饰类、方法和属性,但不能修饰接口和抽象类,因为抽象类和接口一般都是要被继承的,被final修饰后就不能被继承了
    • 被 final 修饰的方法不能被重写,但是可以被重载
    • final 修饰的类不能被继承
    • final 修饰的变量就是一个常量了,因此不能修改常量的值
  • java 中的package
    • 定义在一个package中的类可以不经过import而直接相互引用
    • 为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包。Java中的包一般均包含相关的类,java是跨平台的,所以java中的包和操作系统没有任何关系,java的包是用来组织文件的一种虚拟文件系统
CATALOG
  1. 1. Java 题目
    1. 1.1. 2018.8.1
    2. 1.2. 2018.8.2
    3. 1.3. 2018.8.3
    4. 1.4. 2018.8.4
    5. 1.5. 2018.8.6
    6. 1.6. 2018.8.7
    7. 1.7. 2018.8.10
    8. 1.8. 2018.8.13
    9. 1.9. 2018.8.14
    10. 1.10. 2018.8.19
    11. 1.11. 2018.8.31