java开发笔记

1.       什么是Java jvm ?jdk 和jre区别是什么?

JVMJava Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。

JDK : Java Development ToolKit(Java开发工具包)JDK是整个JAVA的核心,包括了Java运行环境(JavaRuntime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即JavaAPI包括rt.jar)。

 

JRE:Java Runtime Enviromental(java运行时环境)。也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVMJAVA核心类库和支持文件。

 

JDK是Java的开发工具,它不仅提供了Java程序运行所需的JRE,还提供了一系列的编译,运行等工具,如javac,java,javaw等。JRE只是Java程序的运行环境,它最核心的内容就是JVM(Java虚拟机)及核心类库。

2.是否可以在Static环境中访问非Static变量?

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

 

3.JAVA支持的数据类型有哪些?什么是自动拆装箱?

基本数据类型:

整数值型:byte,short,int,long,

字符型:char

浮点类型:float,double

布尔型:boolean

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。

4.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

5.接口和抽象类的区别是什么?

 

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类

类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

 

Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

6.什么是值传递?什么是引用传递?

引用传递:1.传递的是内存地址,修改后会改变内存地址对应储存的值

值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递的对象的栈中对象的拷贝。

在方法实体中,无法给原变量重新赋值,也无法改变它的值。

7.进程和线程的区别是什么?

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

 

8.创建线程有几种不同的方式?你喜欢哪一种?为什么?

有三种方式可以用来创建线程:

继承Thread类

实现Runnable接口

应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

9.概括的解释下线程的几种可用状态。

 

线程在执行过程中,可以处于下面几种状态:

 

就绪(Runnable):线程准备运行,不一定立马就能开始执行。

 

运行中(Running):进程正在执行线程的代码。

 

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

 

睡眠中(Sleeping):线程被强制睡眠。

 

I/O阻塞(Blocked on I/O):等待I/O操作完成。

 

同步阻塞(Blocked on Synchronization):等待获取锁。

 

死亡(Dead):线程完成了执行。

10什么是死锁(Deadlock)?

两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

11.Java集合类框架的基本接口有哪些?

Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:

Collection:代表一组对象,每一个对象都是它的子元素。

Set:不包含重复元素的Collection。

List:有顺序的collection,并且可以包含重复元素。

Map:可以把键(key)映射到值(value)的对象,键不能重复。

12.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

 

下面列出了Array和ArrayList的不同点:

 

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

 

Array大小是固定的,ArrayList的大小是动态变化的。

 

ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

 

对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

13.ArrayList和LinkedList有什么区别?

 

ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

 

ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

 

相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

 

LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

14.HashSet和TreeSet有什么区别?

HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。

另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。

垃圾收集器(Garbage Collectors)

 

15.Comparable和Comparator接口是干什么的?列出它们的区别。

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

16.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

 

17.System.Gc()和Runtime.Gc()会做什么事情?

这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。

18.Finalize()方法什么时候被调用?析构函数(Finalization)的目的是什么?

在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中释放对象持有的资源。

19.什么是servlet?简述生命周期?

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。

Servlet生命周期分为三个阶段:

1.实例化(就是创建servlet对象,调用构造器)
2,初始化阶段 :调用init()方法
3,响应客户请求阶段:调用service()方法
4,终止阶段:调用destroy()方法

20.ServletAPIforware()redirect()区别?

a、浏览器显示

     重定向会改变URL地址,请求转发不会改变URL地址。

b、资源共享

     重定向不可以资源共享,请求转发可以。

c、功能

    重定向可以用URL绝对路径访问其他Web服务器的资源,而请求转发只能在一个Web应用程序内进行资源转发,即服务器内部的一种操作。

d、效率

    重定向效率低,相当于再一次请求;请求转发效率相对较高,跳转仅发生在服务器端。

21、什么情况下调用doGet()和doPost()?

答:默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法;为get的时候,调用deGet()方法。

7、request.getParameter()和request.getAttribute()的区别?

 

a、request.getParameter()获取的类型是String;

   request.getAttribute()获取的类型是Object

b、request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;

    request.getAttribute()获取的是对象容器中的数据值/对象

setAttribute()和getAttribute()的传参原理:

    setAttribute()是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另外一个页面时,

    应用服务器会把这块内存拷贝到另一个页面所对应的那块内存中。这个就可以通过getAttribute()获取到相应的参数值或者对象。

22、JSP中动态include和静态include的区别?

答 : a、静态include:语法:<%@ include file="文件名" %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。

        b、动态include:语法:,能够自动检查被包含文件,当客户端对JSP文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。

23、get和post的区别?

a、get是用来从服务器上获取数据,而post是用来向服务器传递数据;

b、get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者用"?"连接,变量之间用"&"连接;

而post是将表单中的数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL。

c、get是不安全的,因为在传输过程中,数据是被放在请求的URL中;而post的所有操作对用户来说都是不可见的。

d、get传输的数据量小,这主要应为受url长度限制;而post可以传输大量的数据,所有上传文件只能用post提交。

e、get限制form表单的数据集必须为ASCII字符;而post支持整个IS01 0646字符集。

f、get是form表单的默认方法。

 

24、JSP的四种范围?

a、page是代表一个页面相关的对象和属性。一个页面由一个编译好的java servlet类(可以带有include指令,但不可以带有include动作)表示。这既包括servlet又包括编译成servlet的jsp页面。

      b、request是代表与web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个web组件(由于forware指令和include动作的关系)

      c、session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个web回话也可以经常跨域多个客户机请求。

      d、application是代表与整个web应用程序相关的对象和属性。这实质上是跨域整个web应用程序,包括多个页面、请求和回话的一个全局作用域。

 

25、cookie和session的作用、区别、应用范围。

a、cookie数据保存在客户端,session数据保存在服务端。

     b、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,相当重要的数据,应该使用session保存到服务端。

     c、session会在一定时间内保持在服务器上,但是会占用内存资源,当访问的用户过多,会加重服务器的负载,考虑到减轻服务器的压力,可以将不重要的数据放在cookie中持久的保存。

     d、单个cookie保存的数据不能超过4k,很多浏览器都限制站点最多保存20个cookie。

26、几种回话跟踪技术?

答:cookie、url重写、hidden表单隐藏域、session

43、EL表达式的功能,为什么要用EL表达式?(Expression Language)

功能:

a、从四个域对象中取出数据数据显示。

b、取出请求参数数据显示。

原因:

在页面中用jsp脚本和jsp表达式来获取数据显示比较麻烦

a、需要判断

b、可能需要强转

 

44、JSTL的功能,为什么要用JSTL?(JavaServer Pages Standard Tag Library)

功能:主要用于基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。

原因:在jsp页面做条件判断或者循环操作并输出时,比较费力。

45、过滤器的用法?(对客户端的请求统一编码和对客户端进行验证)

实现Filter接口,同时重写Filter接口的三个方法:

     init(FilterConfigconfig)    用于获取FilterConfig对象

    doFilter(ServletRequestrequest,ServeltResponse response,FilterChain chain)   进行过滤处理一些业务

destroy()   销毁Filter

编程:用伪代码写冒泡排序

假设有N个数,可以想象成所有的数分成两部分:上部和下部,上部的是排好序的,下部的没有。
外层循环N-1次(i0N-2{ //每循环一次就能让一个下部数中最大的冒到上部来
内层循环从0开始,循环到j(j=N-i){ //保证下部的每个位置都进行一次冒泡判断
如果当前的数比它上面的一个数大,就互换位置(冒上来一次)。
/*
这是互换代码
if(array[j]>array[j+1])

{
int tmp=array[j];
array[j]=array[j+1];
array[j+1]=tmp;
}
*/
//可以想象,如果足够大,该数会一直更新位置,一直往上冒,到达合适位置。
}

}

外层循环结束后就排好序了。

伪代码:

 

bubblesort(A)
{
   fori = 1 to length[A]
   {
       for j = length[A]  to  i+1
       {
           if A[j] < A[j-1]
           {
                exchane A[j] and A[j-1];
           }
       }
   }
}

你可能感兴趣的:(java,jsp,java综合笔记)