Java SE、Java EE、Java ME区别
是什么:
Java SE=Java Standard Edition=J2SE= Java标准版
Java EE=Java Enterprise Edition=J2EE= Java企业版
Java ME=Java Mobile Edition=J2ME = Java移动版
特点:
SE主要用于桌面程序(Swing),控制台开发(main程序)。
EE企业级开发(JSP,Struts,Spring,Hibernate,EJB,iBATIS等),用于企业级软件开发,网络开发,Web开发。
ME嵌入式开发(手机,小家电,PDA)。[苹果的IOS,黑莓]
三者之间的关系:
Java SE就是基于JDK和JRE的。
Java SE为Java EE提供了基础。
Java SE包括用于开发Java Web的类库
Java EE除了基于我们这个所谓的Java SE外,还新加了企业应用所需的类库
Java EE技术的基础就是核心Java SE或J2SE
JDK、JRE、JVM的区别
JDK[Java Development Kit]就是Java开发工具箱, JDK是整个Java的核心里边包含了JRE,它除了包含JRE之外还包含了一些javac的工具类,把Java源文件编译成class文件,Java文件是用来运行这个程序的,除此之外,里边还包含了Java源生的API,java.lang.Integer在rt.jar包里边[可以在项目中看到],通过rt.jar这个架包来调用我们的这些IO流写入写出等
JDK有以下三种版本:
Java SE,Standard Edition,标准版,是我们通常用的一个版本
Java EE,Enterpsise Edtion,企业版,使用这种JDK开发J2EE应用程序
Java ME,Mobile Edtion,移动版,主要用于移动设备、嵌入式设备上的Java应用程序
JRE[Java Runtime Enviromental]是Java运行时环境,那么所谓的Java运行时环境,就是为了保证Java程序能够运行时,所必备的一基础环境,也就是它只是保证Java程序运行的,不能用来开发,而JDK才是用来开发的,所有的Java程序都要在JRE下才能运行。
包括JVM和Java核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。
JRE里边包含JVM
JVM:[Java Virtual Mechinal],Java虚拟机,因为JRE是Java运行时环境,Java运行靠什么运行,而底层就是依赖于JVM,即Java虚拟机,Java虚拟机用来加载类文件,Java中之所以有跨平台的作用,就是因为拥有JVM
关系:
Java SE是基于JDK和JRE,
JDK是整个Java的核心里边包含了JRE,
JRE里边包含JVM。
抽象类和接口的区别
含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果在子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1. 抽象类中可以有普通成员变量、静态成员变量,且静态成员变量的访问类型可以任意。但接口中定义的变量只能是public static final类型的,没有普通成员变量。
2. 抽象类可以有构造方法,接口中不能有构造方法。
3. 抽象类中可以包含非抽象的普通方法、静态方法。抽象方法的访问类型可以是public,protected的。但接口中的所有方法必须都是抽象的,不能有非抽象的普通方法、不能包含静态方法、抽象方法只能是public类型的,而且默认即为public abstract类型。
4.一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
public abstract class BaseServlet extends HttpServlet{ public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { //记录访问日志,进行权限判断 if(具有权限){ try{ doService(request,response); } catch(Excetpion e) { //记录异常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException{ //注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的 } } public class MyServlet1 extends BaseServlet { protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { //本Servlet只处理的具体业务逻辑代码 } }
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
内存泄露和内存溢出
内存泄露 (Memory Leak),是指应用程序在申请内存后,无法释放已经申请的内存空间。一次内存泄露危害可以忽略,但如果任其发展最终会导致内存溢出(Out Of Memory)。如读取文件后流要进行及时的关闭以及对数据库连接的释放。内存溢出(Out Of Memory)是指应用程序在申请内存时,没有足够的内存空间供其使用。如我们在项目中对于大批量数据的导入,采用分段批量提交的方式。
线程和进程的区别
1.线程(Thread)与进程(Process)
进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应的应用程序。不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间。
一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。实现线程的两种方式:继承Thread类,实现Runable接口
sleep()和wait()有什么区别
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
sleep就是正在执行的线程主动让出CPU,CPU去执行其他线程,在sleep指定的时间(以毫秒计)过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了CPU,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态,程序可以再次得到锁后继续向下运行。
同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
List、Set、Map三个接口,存取元素时,各有什么特点
首先,List与Set具有相似性,它们都是单列元素的集合,继承了共同的父接口,Collection。
List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合,还可以获得所有的value的结合,还可以获得key和value组合成的Map.Entry对象的集合。
List 单列数据集合,以特定次序来持有元素(有顺序),可有重复元素。Set 单列数据集合,内部排序,没有重复元素。Map双列数据集合, 保存key-value值,没有顺序,key不可重复,value可重复。
HashSet按照hashcode值的某种运算方式进行存储,而不是直接按hashCode值的大小进行存储。例如,"abc" ---> 78,"def" ---> 62,"xyz" ---> 65在HashSet中的存储顺序不是62,65,78。HashSet按插入的顺序存储,那被存储对象的hashcode方法还有什么作用呢?想想!hashset集合比较两个对象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new 两个Student插入到HashSet中,看HashSet的size,实现hashcode和equals方法后再看size。
同一个对象可以在Vector中加入多次。往集合里面加元素,相当于集合里用一根绳子连接到了目标对象。往HashSet中却加不了多次的。
UE和UI的区别
UE(User Experience)是用户体验度
UI(User Interface)是用户界面,界面原型(相当于买房时用的模型)
UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由、充分体现软件的定位和特点。 在人和机器的互动过程(Human Machine Interaction)中,有一个层面,即我们所说的界面(Interface)。从心理学意义来分,界面可分为感觉(视觉、触觉、听觉等)和情感两个层次。用户界面设计是屏幕产品的重要组成部分。界面设计是一个复杂的有不同学科参与的工程,认知心理学、设计学、语言学等在此都扮演着重要的角色。用户界面设计的三大原则是:置界面于用户的控制之下;减少用户的记忆负担;保持界面的一致性。所以如果我们将来要建网站,就一定要把握好人机交互,在第一时间赢得客户。
设计UI的作用:
1、帮助程序员工作(界面已由美工设计完成)
2、提前让用户对项目有个宏观的了解,知道效果是什么样子。