Java中的比较

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、提前让用户对项目有个宏观的了解,知道效果是什么样子。

时间: 2024-07-30 10:09:16

Java中的比较的相关文章

java中的三元运算符详解

最近在带领实习生中遇到很多新手问与三元运算符有关的java题目,多数为代码结果题,少数为应用题.鉴于很多资料上对于java三元运算的讲解过于简单,网上的资料与题目也不是很完善,对于结果答案分析不一,故在此总结,当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 什么是java三元运算符呢?无疑其操作元有三个,第一个是条件表达式,剩余两个为值,条件表达式为真时运算取第一个值,为假时取第二个值. 其示例代码如下:boolean a = 20 < 45 ? true : false

java中BigDecimal的学习

干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习. 最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉不能再拖了. BigDecimal,从名字来看就是进行大数运算的,不光这样,还广泛用于小数的精确运算. 当你接触到和钱有关的计算的时候,这个类还是很有用滴. 先来看一个例子 1 package com.tuhooo.bigdecimal; 2 3 /** 4 * Created by tuhooo

Java 中几个重要的关键字

Java中的关键字特别多,大致如下: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements interface native new static strictfp synchronized transient volatile 程序控制 break continue return do while if else for instanceof switch case default 异常

深入剖析Java中的装箱和拆箱

阅读目录 一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的三.面试中相关的问题 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 回到顶部 一.什么是装箱?什么是拆箱? 我们知道 Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成

JAVA中只有值传递

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:"引用传递!",并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟

Java中如何优雅正确的终止线程

Java中终止线程的方式主要有三种: 1.使用stop()方法,已被弃用.原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的"残疾"数据,不符合完整性,所以被废弃.So, forget it! 2.使用volatile标志位 看一个简单的例子: 首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行 public class MyRunnable i

Java中I/O流之数据流

Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗?    转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. 现在,Java 中的数据流能够很好的解决这个问题(不需要转换,直接写进去) 1. DataInputStream 与 DataOutputStream 分别继承自 InputStream.OutputStream, 它属于处理流,需要分别套接在 InputStream.OutputStream 类

java中Random随机种子使用

在java中,通过Random生成随机数时,如果设置随机种子,则相同的种子,产生的随机数相同.若不设置则每次随机的不同. Random rnd = new Random(); rnd.setSeed(10);//用于设置种子. rnd.nextInt();// 用于产生随机数. rnd.nextInt(10); // 产生(0-9)数字.

java中的反射机制和javaBean

反射 反射:就是通过一个类加载进方法区时加载到栈内存中的Class字节码文件对这个类进行解剖 通过反射可以获取到一个类的构造方法,成员方法,成员变量 反射将一个类的各个部分映射成相应的类 反射获取构造方法 Class类中方法 Constructor<?>[] getConstructors() 返回当前字节码文件对象的所有public修饰的构造方法 Constructor<T> getConstructor(Class<?>...parameterTypes)返回指定了

JAVA中的继承

1.什么是继承 基于一个已存在的类,创建一个新的类.已存在的类即父类,新的类即子类,继承就是子类继承并拥有父类的属性和方法,同时,子类还有拥有父类所不具有的属性和方法. 父类,也称为基类.超类(superclass):子类,也称为派生类. 2.JAVA中"继承"的特点 JAVA中一个类只能继承一个父类.不像C++等语言那样,可以继承多个类.这也是JAVA比较容易学的一方面 只能继承父类中非private成员属性和方法,private是父类所特有的不能继承 3.JAVA中的"继