牛客练习笔记-JAVA 10/5

目录

题目:

1. StringBuffer类对象创建之后可以再修改和变动.

2. 以下是java concurrent包下的4个类,选出差别最大的一个()

3. 下面赋值语句中正确的是()

4. 以下哪一个不是赋值符号?

5. 下面有关 JAVA 异常类的描述,说法正确的有()

6.下面哪个选项没有实现 java.util.Map 接口?

7.类方法中可以直接调用对象变量?

8.给定includel.isp文件代码片段,如下:  <% pageContext.setAttribute(“User”,”HAHA”);%>______ // 此处填写代码  给定include2.jsp文件代码片段如下:  <%=pageContext.getAttribute(“User”)%>  要求运行include1.jsp时,浏览器上输出:HAHA

9.在java中,下列对继承的说法,正确的是( )

10.下面有关java类加载器,说法正确的是?

11.下面有关forward和redirect的描述,正确的是() ?

12.Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(    )

知识点总结:

1、String能被继承吗?为什么用final修饰?(北京)

2、String buffer和String builder区别

3.关于异常

4.List 的三个实现类:ArrayList,LinkedList,Vector的区别

5.Java中的类加载器

引导类加载器(bootstrap class loader):

扩展类加载器(extensions class loader):

系统类加载器(system class loader):

6.什么是自动拆装箱? int和Integer有什么区别?以及以下程序运行结果。

7.深拷贝与浅拷贝的理解

8.谈谈你对反射的理解


题目:

1. StringBuffer类对象创建之后可以再修改和变动.

A 正确

B 错误

正确答案:A

1.String对象不可变、StringBuffer对象可变的含义:

举个例子:

String str = "aa"; str = "aa"+"bb"; 此时str的值为"aabb",但是"aabb"不是在开始的字符串"aa"后面直接连接的"bb",而是又新生成了字符串"aabb",字符串"aa"一旦被初始化,那么它的值不可能再改变了。

StringBuffer strb = StringBuffer("aa"); strb.append("bb"); 此时的strb的值也为"aabb",但是"aabb"是直接在开始的字符串"aa"后面连接的“bb”,并没有生成新的字符串。


2. 以下是java concurrent包下的4个类,选出差别最大的一个()

A Semaphore

B ReentrantLock

C Future

D CountDownLatch      正确答案:C

A、Semaphore:类,控制某个资源可被同时访问的个数;

B、ReentrantLock:类,具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大;

C、 Future:接口,表示异步计算的结果;

D、 CountDownLatch: 类,可以用来在一个线程中等待多个线程完成任务的类

3. 下列哪种异常是检查型异常,需要在编写程序时声明?

A NullPointerException

B ClassCastException

C FileNotFoundException

D IndexOutOfBoundsException

正确答案:C    你的答案:B

参考答案:java中的异常通常分为编译时异常和运行异常。编译时异常需要我们手动的进行捕捉处理,也就是我们用try....catch块进行捕捉处理。对于运行时异常只有在编译器在编译运行时才会出现,这些不需要我们手动进行处理。对于A、 B、 D来说都是运行时异常,因此答案为C

3. 下面赋值语句中正确的是()

A double d=5.3e12;

B float f=11.1;

C int i=0.0;

D Double oD=3;

正确答案:

A: ava中整型默认的是int,浮点默认的是double. 5.3e12表示5.3乘以10的12次方,正确

B: double类型的11.1 转成 float,是需要强制转换的

C: double类型的0.0 转成 int,也是需要强制转换的

D: int 转为 封装类型Double,是无法编译的

    Double oD = 3.0, 会把double类型的3.0自动装箱为Double,没有问题

4. 以下哪一个不是赋值符号?

A  +=

B  <<=

C  <<<=

D  >>>=

A.很明显是赋值符号
B.<<=左移赋值
C.不是
D.>>>= 右移赋值,左边空出的位以0填充

5. 下面有关 JAVA 异常类的描述,说法正确的有()

A 异常的继承结构:基类为 Throwable,Error 和 Exception 。实现 Throwable, RuntimeException 和 IOException 等继承 Exception

B 非 RuntimeException 一般是外部错误(不考虑Error的情况下),其可以在当前类被 try{}catch 语句块所捕获

C Error 类体系描述了 Java 运行系统中的内部错误以及资源耗尽的情形,Error 不需要捕捉

D RuntimeException 体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须 被 try{}catch 语句块所捕获

正确答案:ABC

6.下面哪个选项没有实现 java.util.Map 接口?

A Hashtable

B HashMap

C Vector

D IdentityHashMap

正确答案:C

参考答案:答案:C A,B,D都实现了Map接口,其中A与B的区别是一个是线程安全的,一个是线程不安全的 C中Vector是实现了List接口,是一个线程安全的List

7.类方法中可以直接调用对象变量?

A 正确

B 错误

正确答案:B

静态方法中不能调用直接对象的变量,因为静态方法在类加载时就初始化,对象变量需要在新建对象后才能使用

8.给定includel.isp文件代码片段,如下:
  <% pageContext.setAttribute(“User”,”HAHA”);%>
______ // 此处填写代码
  给定include2.jsp文件代码片段如下:
  <%=pageContext.getAttribute(“User”)%>
  要求运行include1.jsp时,浏览器上输出:HAHA

A <jsp:include page=”include2.jsp” flash=”true”>

B <%@include file=”include2.jsp”%>

C <jsp:forward page=”include2.jsp”>

D <% response.sendRedirect(“include2.jsp”); %>

正确答案:B

你的答案:D

参考答案:答案:B B选项是静态包含,相当于不include2.jsp页面内容拷贝到此处,因此可以输出User属性值 D选项是转发重定向,转发的时候pageContent内的属性值不能被传递,因此得不到User属性值

A选项使用了jsp中动作标签的包含标签,这里是动态包含。原理是包含与被包含的页面单独翻译成不同的java文件,然后运行时合并在一起。因为是存在域中的数据,故刚开始就直接翻译数据还不存在,因此浏览器上不能显示出HAHA。

B选项使用了jsp三大指令中的包含指令,这里是静态包含。原理是直接把包含与被包含页面的内容先合并在一起,然后翻译成一个java源文件,最后编译执行。故可以在浏览器上显示出HAHA。

C和D选项分别使用了跳转和重定向,我们知道jsp中有四个域对象,从小到大分别为:

  • page域:在同一个jsp页面中数据有效
  • request域:在同一个请求中数据有效
  • session域:在用一个会话中数据有效
  • application域:在同一个网站中数据有效

题中使用的是page域对象:pageContext,而C选项应该使用request域对象:HttpServletRequest,而D选项应该至少使用session域对象:HttpSession(如果处于同一会话中)

9.在java中,下列对继承的说法,正确的是( )

A 子类能继承父类的所有成员

B 子类继承父类的非私有方法和状态

C 子类只能继承父类的public方法和状态

D 子类只能继承父类的方法

正确答案:A

子类是继承了父类的私有方法的(不管是否是final),只是直接调用父类的私有方法是不可以的,但是利用反射的方式可以调用。

10.下面有关java类加载器,说法正确的是?

A 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的

B 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。

C 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类

D tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用

正确答案:ABCD

你的答案:BCD

参考答案:

jvm classLoader architecture :

a、Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.

B、Extension ClassLoader/扩展类加载器 主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作

C、System ClassLoader/系统类加载器 主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.

D、 User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类) 在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.

11.下面有关forward和redirect的描述,正确的是()

A forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求

B 执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址

C 执行redirect时,服务器端告诉浏览器重新去请求地址

D forward是内部重定向,redirect是外部重定向

E redirect默认将产生301 Permanently moved的HTTP响应

正确答案:BCD

A选项是错误的,forward并不是将控制权转交给另一个内部服务器对象,而是将请求转发给另一个资源进行处理。

E选项是错误的,redirect默认会产生302 Found的HTTP响应,而不是301 Permanently moved。

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

12.Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(    )

A Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下

B 通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法

C 通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成员

D Java反射机制提供了字节码修改的技术,可以动态的修剪一个类

E Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多

F Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率

正确答案:ADF

A Class类在java.lang包

B 动态代理技术可以动态创建一个代理对象,反射不行

C 反射访问私有成员时,Field调用setAccessible可解除访问符限制

D CGLIB实现了字节码修改,反射不行

E 反射会动态创建额外的对象,比如每个成员方法只有一个Method对象作为root,他不胡直接暴露给用户。调用时会返回一个Method的包装类

F 反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化。

知识点总结:

1、String能被继承吗?为什么用final修饰?(北京)

不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。

  • String 类是最常用的类之一,为了效率,禁止被继承和重写(线程安全的)。
  • 为了安全。String 类中有native关键字修饰的调用系统级别的本地方法,调用了操作系统的 API,如果方法可以重写,可能被植入恶意代码,破坏程序。Java 的安全性也体现在这里。
  • b. String不继承任何类,StringBuffer、StringBuilder继承⾃AbstractStringBuilder

2、String buffer和String builder区别

1StringBuffer StringBuilder 中的方法和功能完全是等价的,

2)只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 

3)在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低

3.关于异常

   http://uploadfiles.nowcoder.com/images/20151010/214250_1444467985224_6A144C1382BBEF1BE30E9B91BC2973C8

1. 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 Checked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.

2. 绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除...

3. 而声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。

4.List 的三个实现类:ArrayListLinkedListVector的区别

ArrayListLinkedList区别如下

1ArrayList是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。 2)对于随机访问getsetArrayList效率优于LinkedList,因为LinkedList要移动指针。

3)对于新增和删除操作addremoveLinkedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的(不需要扩容的情况下)。若只对单条数据尾部插入或删除, ArrayList的速度反而优于LinkedList

Vector 是一个 古老 的集合。大多数操作与ArrayList相同,区别之处在于Vector 线程安全的。 所以在各种List中,一般把ArrayList作为默认选择 。当插入、删除频繁时,使用LinkedListVector 是比ArrayList慢,所以尽量避免使用。

Vector是老式的集合类,内部基于动态数组实现,容量扩充为原来的2倍,Vector是线程安全的实现 ArrayListJDK1.2之后新增的List集合的实现,内部也是基于动态数组实现,容量扩展为原来的1.5倍,ArrayList是线程不安全的实现(效率高),数据查询较快,修改较慢 LinkeadListJDK1.2之后新增的List集合的实现,内部是基于双向链表实现,也是线程不安全的实现,在进行数据修改方面比较快,数据查询较慢

5.Java中的类加载器

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:


引导类加载器(bootstrap class loader):

它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。主要负责jdk_home/lib目录下的核心api 或 -Xbootclasspath 选项指定的jar包装入工作(其中的jdk_home是指配置jdk环境变量是java_home的配置路径,一般是jdk/jre所在目录)。

扩展类加载器(extensions class loader):

它用来加载 Java 的扩展库。Java虚拟机的实现会提供一个扩展库目录,扩展类加载器在此目录里面查找并加载 Java 类,主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。

系统类加载器(system class loader):

它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。主要负责CLASSPATH/-Djava.class.path所指的目录下的类与jar包装入工作.


除了系统提供的类加载器以外,开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,从而进行动态加载class文件,以满足一些特殊的需求,这体现java动态实时类装入特性。

除了引导类加载器之外,所有的类加载器都有一个父类加载器,通过getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。下图中给出了一个典型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。

6.什么是自动拆装箱? int和Integer有什么区别?以及以下程序运行结果。

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特bai征,不能调用方法。

装箱:将基本类型转换成包装类对象

拆箱:将包装类对象转换成基本类型的值

java为什么要引入自动装箱和拆箱的功能?主要是用于java集合中,List<Inteter> list=new ArrayList<Integer>();

list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。

实现原理:javac编译器的语法糖,底层是通过Integer.valueOf()Integer.intValue()方法实现。

区别:

(1)Integer是int的包装类,int则是java的一种基本数据类型

(2)Integer变量必须实例化后才能使用,而int变量不需要

(3)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值

(4)Integer的默认值是null,int的默认值是0

  1. package com.softeem.interview.chapter03;  
  2.   public class Test01 {  
  3.     public static void main(String[] args){  
  4.         Integer a = 127;  
  5.         Integer b = 127;  
  6.         Integer c = 128;  
  7.         Integer d = 128;  
  8.         System.out.println(a==b); //true  
  9.         System.out.println(c==d); //false  
  10.     }  

}  

7.深拷贝与浅拷贝的理解

深拷贝和浅拷贝就是指对象的拷贝,一个对象中存在两种类型的属性,一种是基本数据类型,一种是实例对象的引用。

1.浅拷贝是指,只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会复制一份引用地址所指向的对象,也就是浅拷贝出来的对象,内部的类属性指向的是同一个对象

2.深拷贝是指,既会拷贝基本数据类型的值,也会针对实例对象的引用地址所指向的对象进行复制,深拷贝出来的对象,内部的类执行指向的不是同一个对象

8.谈谈你对反射的理解

(1)反射机制:

所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。

Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;

其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。

(2)Java反射的作用:

在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

(3)Java 反射机制提供功能

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值