牛客网错题本之JAVA_第一期

来源:互联网 发布:gta5淘宝搜不到 编辑:程序博客网 时间:2024/04/30 13:53

1.ThreadLocal

ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立
由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,变量被彻底封闭在每个访问的线程中,保证线程间数据安全,保证数据不会被其他线程破坏
ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本
主要用于线程内共享一些数据,避免通过参数来传递
对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方(时间慢)式,而ThreadLocal采用了“以空间换时间”的方式(时间快)
线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收



2.bean:id

bean:define:定义新字符串常量
<bean:define id="stringBean" value="helloWorld"/>定义了一个id为stringBean的字符串
<bean:write name="stringBean"/>:该标签将指定的bean的属性值写到当前的JspWriter中,并且可以对输出进行格式化。可在jsp页面中通过bean:write将name属性输出
<%String myBean=(String)pageContext.getAttribute("stringBean",PageContext.PAGE_SCOPE);%>:pageContext是PageContext类的实例,使用pageContext可以访问page、request、session、application范围的变量


3.volatile

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

2)禁止进行指令重排序。

而对该变量的修改,volatile并不提供原子性的保证
每次从内存中取值,不从缓存中取值
多线程下的计数器必须使用锁保护


4.JVM堆溢出

简单的来说 java的堆内存分为两块:permantspace(持久带) 和heap space
持久带中主要存放用于存放静态类型数据,如 Java Class, Method 等, 与垃圾收集器要收集的Java对象关系不大。
而heapspace分为年轻带和年老带 
年轻代的垃圾回收叫 Young GC, 年老代的垃圾回收叫 Full GC。
在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象
年老代溢出原因有  循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存
持久代溢出原因  动态加载了大量Java类而导致溢出


5.ArrayList与Vector

Vector支持线程的同步,也就是内部加锁的,但是效率低,因此在新版jdk中加入线程不安全的ArrayList


6.Servlet

doGet/doPost 则是在 javax.servlet.http.HttpServlet中实现的
service方法时在servlet生命周期中的服务期,根据HTTP请求方法(GRT、POST等),将请求分发到doGet、doPost等方法
创建Servlet的实例是由Servlet容器来完成的,且创建Servlet实例是在初始化方法init()之前
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化(init()):调用init方法初始化,在Servlet的整个生命周期类,init()方法只被调用一次。
(4)处理客户请求(service()):每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载(destroy()):调用destroy方法让servlet自己释放其占用的资源,也是只调用一次,在卸载的时候调用
JSP会先解释成Servlet源文件,然后编译成Servlet类文件
javax是Sun公司提供的一个扩展包,算是对原 JAVA 包的一些优化处理,Servlet的程序开发而不是java包。




7.Map与线程安全

HashMap,TreeMap 未进行同步考虑,是线程不安全的
TreeMap和TreeSet都是线程不安全的
HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List  list = Collections.synchronizedList(new ArrayList());
Set  set = Collections.synchronizedSet(new HashSet());


8.字符串的不可变性

Java中String类型变量是immutable(不可变的)
尽管 change()方法中的str与sv.str都是新的对象实例成员变量值"6"的引用, 由于String类型的 不可变 性,change()方法中的str="10"语句实际上是将传入的str副本引用指向了一个值为“10”的新的内存地址,但 原数据引用 sv.str的引用值(也就是“6”的内存地址) 并没有发生改变,因此sv.str指向的值仍旧为6.



9.线程安全的容器类

并在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器

Quene:队列,线程安全

StringBuffer:线程安全



10.重写方法时访问修饰符的限制

一大两小原则:
子类访问权限于等于父类方法访问权限。
子类抛出异常小于等于父类方法抛出异常,
子类返回类型小于等于父类方法返回类型,



11.JVM内存

运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器

虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 返回地址 ,在编译期间完成分配。

堆区 , JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。

方法区 :所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。

程序计数器 线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。

静态变量肯定是共享的啊,怎么可能是线程隔离的呢



12.static方法,类方法

类方法中没有this指针
类方法中除了可以调用本类的类方法,还可以调用其他类的类方法
类方法中可以有实例方法,只要在类方法中有对象被实例化即可


13.值传递和引用传递

向方法中传递基本数据类型是值传递,无论在方法中对该值进行如何更改,实际参数的值都不会改变
向方法中传递对象传递的是对象的引用,在方法中无法改变改引用的地址,但是却可以更改该引用指向的对象的内容
引用类型作为形参传递会改变实参的值,但是String是特殊的引用类型,作为形参传递不会影响实参的值。



14.包装类的比较

包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱,比较的只是引用的地址
包装类的equals()方法不处理数据转型


15.Socket与ServerSocket

ServerSocket (int port)
服务器端socket的创建只需要端口号即可
Socket(InetAddress address, int port)
客户端创建socket既需要ip地址,又需要端口号


16.HttpSession

HttpSession session = request.getSession(false) 与HttpSession session = request.getSession(true)的区别是当传入为true的时候,查找请求中是否有关联的session id,如果有则返回这个号码所对应的session对象,如果没有则生成一个新的session对象。所以说,通过此方法是一定可以获得一个session对象。 
传入为false的时候,查找请求中是否有关联的session id,如果有则返回这个号码所对应的session对象,如果没有则返回一个null


17.try...catch...finally

若是try中有抛出异常,那么跳转到catch中,如果catch中有返回语句,那么跳转到fianlly中,执行完finally中的代码就结束啦,finally语句块 
若finally里也有return语句则覆盖try或catch中的return语句直接返回。



18.同包访问权限

Default是同包的访问权限,protect不是,当子类跟父类不在一个包里的时候,protect仍然具有访问权限



19.c++虚类和Java接口的比较

C++中的虚类就等于Java中的抽象类
C++中的纯虚类等于Java中的接口


20.Servlet过滤器的配置问题

Servlet过滤器的配置包括两部分:
第一部分是过滤器在Web应用中的定义,由<filter>元素表示,包括<filter-name>和<filter-class>两个必需的子元素
第二部分是过滤器映射的定义,由<filter-mapping>元素表示,可以将一个过滤器映射到一个或者多个Servlet或JSP文件,也可以采用url-pattern将过滤器映射到任意特征的URL。



25

2.


1 0
原创粉丝点击