java综合知识点(一,基础篇 )

基础篇

一、JDK常用的包

 java.lang:这个是系统的基础类,比如String、Math、Integer、System和Thread, 提供常用功能。

 java.io:这里面是所有输入输出有关的类,比如文件操作等

 java.net:这里面是与网络有关的类,比如URL,URLConnection等。

 java.util:这个是系统辅助类,特别是集合类Collection,List,Map等。

 java.sql:这个是数据库操作的类,Connection, Statememt,ResultSet等

二、Get和Post的区别

1.get是从服务器上获取数据,post是向服务器传送数据,

2.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。

3.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

4.在进行文件上传时只能使用post而不能是get。

三、Java多态的具体体现 

面向对象编程有四个特征:抽象,封装,继承,多态。

多态有四种体现形式:

1. 接口和接口的继承。

2. 类和类的继承。

3. 重载。

4. 重写。

其中重载和重写为核心。

重载:重载发生在同一个类中,在该类中如果存在多个同名方

法,但是方法的参数类型和个数不一样,那么说明该方法被重

载了。

重写:重写发生在子类继承父类的关系中,父类中的方法被子

类继承,方法名,返回值类型,参数完全一样,但是方法体不

一样,那么说明父类中的该方法被子类重写了。

四、StringBuffer StringBuilder String区别

String字符串常量   不可变  使用字符串拼接时是不同的2个空间

StringBuffer字符串变量   可变   线程安全  字符串拼接直接在字符串后追加

StringBuilder字符串变量   可变   非线程安全  字符串拼接直接在字符串后追加

1.Stringuilder执行效率高于StringBuffer高于String.

2.String是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象, StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方 法,在原来的基础上进行追加,所以性能比String要高,又因为StringBuffer  是 线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于 StringBuffer.

3.对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder.

五、Hashtable与HashMap的区别

     HashMap不是线程安全的,HashTable是线程安全。

     HashMap允许空(null)的键和值(key),HashTable则不允许。

     HashMap性能优于Hashtable。

Map

1.Map是一个以键值对存储的接口。Map下有两个具体的实现,分别是HashMap和HashTable.

2.HashMap是线程非安全的,HashTable是线程安全的,所以HashMap的效率高于HashTable.

3.HashMap允许键或值为空,而HashTable不允许键或值为空.

111111111111111111

①Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 Java 1.2 引

进的 Map 接口的一个实现。

②Hashtable 的方法是同步的,而 HashMap 的方法不是,因此HashTable 是线程安全的,但是代码的执行效率上要慢于 HashMap。

③HashMap 允许空值和空键,但是 HashTable 不可以。

④HashMap 非同步实现 Map 接口,是一个“链表数组”的数据结构,

最大承载量是 16,可以自动变长,由 Entry[]控制(key,value,next),

hashCode()判断 key 是否重复。

⑤建议需要做同步,使用 ConcurrentHashMap,降低了锁的粒度。在

hashMap 的基础上,ConcurrentHashMap 将数据分为多个 segment,

默认 16 个(concurrency level),然后每次操作对一个 segment 加锁,

避免多线程锁得几率,提高并发效率。这里在并发读取时,除了 key

对应的 value 为 null 之外,并没有使用锁


111111111111

Java中的集合类及关系图

List和Set继承自Collection接口。

Set无序不允许元素重复。HashSet和TreeSet是两个主要的实现类。

List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。

Map也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

111111111111

1).HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。2).HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。3).HashTable有一个contains(Objectvalue)功能和containsValue(Objectvalue)功能一样。4).HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。5).HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。6).哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。

11111111111111111

ArrayList和vector区别

ArrayList和Vector都实现了List接口,都是通过数组实现的。Vector是线程安全的,而ArrayList是非线程安全的。List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

111111111111111111111

ArrayList和LinkedList区别及使用场景

区别ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。LinkedList底层是通过双向链表实现的, LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(),peek(), poll()等方法。使用场景LinkedList更适合从中间插入或者删除(链表的特性)。ArrayList更适合检索和在末尾插入或删除(数组的特性)。

111111111111111

Collection和Collections的区别

java.util.Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。java.util.Collections是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

11111111111111111111111111



六、九大隐式对象

输入/输出对象:  request   response   out

作用域通信对象:session  application  pageContext

Servlet对象:   page   config

错误对象:exception

七、Forword(请求转发)与Redirect(重定向)

1、从数据共享上

Forword是一个请求的延续,可以共享request的数据

Redirect开启一个新的请求,不可以共享request的数据

2、从地址栏

Forword转发地址栏不发生变化

Redirect转发地址栏发生变化

八、JQurey总结  

 jquery是一个轻量级的js框架,具有跨浏览器的特性,兼容性好,

 并且封装了很多工具,方便使用。

 常用的有:选择器 ,dom操作 ,ajax(ajax不能跨域) ,特效,工具类 

九、XML和Json的特点

Xml特点:

  1、有且只有一个根节点;

  2、数据传输的载体

  3、所有的标签都需要自定义

  4、是纯文本文件

Json(JavaScript Object Notation)特点:

  json分为两种格式:

json对象(就是在{}中存储键值对,键和值之间用冒号分隔,

键值对之间用逗号分隔);

json数组(就是[]中存储多个json对象,json对象之间用逗号分隔)

(两者间可以进行相互嵌套)数据传输的载体之一

区别:

  传输同样格式的数据,xml需要使用更多的字符进行描述,

流行的是基于json的数据传输。

xml的层次结构比json更清晰。

共同点:

xml和json都是数据传输的载体,并且具有跨平台跨语言的特性。

十、request.getSession()reqeust.getSession(false)     request.getSession(true)

getSession()/getSession(true):当session存在时返回该session,否则新建一个     session并返回该对象

getSession(false):当session存在时返回该session,否则返回null

十一、Page和PageContext的区别

  Page是servlet对象;使用this关键字,它的作用范围是在同一页面。

PageContext是作用域通信对象;通常使用setAttribute()和getAttribute()来设置和获取存放对象的值。

十二、Ajax总结

    AJAX全称: 异步JavaScript及 XML(Asynchronous JavaScript And XML)

Ajax的核心是JavaScript对象XmlHttpRequest(XHR)。

Ajax的优点:

    提高用户体验度(UE)

    提高应用程序的性能

    进行局部刷新

AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。

2.通过 AJAX,我们的 JavaScript 可使用JavaScript的XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,我们的 JavaScript 可在不重载页面的情况与Web服务器交换数据,即可局部刷新。

3.  AJAX在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面,减轻服务器的负担,提升站点的性能。

AJAX可使因特网应用程序更小、更快,更友好,用户体验(UE)好。

5.  Ajax是基于标准化并被广泛支持的技术,并且不需要插件和下载小程序

十三、JSP9大隐视对象中四个作用域的大小与作用范围

四个作用域从大到小:appliaction>session>request>page

application:全局作用范围,整个应用程序共享.生命周期为:应用程序启动到停止。

session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记              住这个会话状态。

request:请求作用域,就是客户端的一次请求。

page:一个JSP页面。

以上作用范围使越来越小,request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward)。

十四、List,Set,Collection,Collections

1. List和Set都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合。Collection是集合的顶层接口,Collections是一个封装了众多关于集合操作的静态方法的工具类,因为构造方法是私有的,所以不能实例化。

2.List接口实现类有ArrayList,LinkedList,Vector。ArrayList和Vector是基于数组实现的,所以查询的时候速度快,而在进行增加和删除的时候速度较慢LinkedList是基于链式存储结构,所以在进行查询的时候速度较慢但在进行增加和删除的时候速度较快。又因为Vector是线程安全的,所以他和ArrayList相比而言,查询效率要低。

十五、java的基本数据类型

数据类型 大小

byte(字节) 1(8位)

shot(短整型) 2(16位)

int(整型) 4(32位)

long(长整型) 8(32位)

float(浮点型) 4(32位)

double(双精度) 8(64位)

char(字符型) 2(16位)

boolean(布尔型) 1位

附加:

String是基本数据类型吗?(String不是基本数据类型)

String的长度是多少,有限制?(长度受内存大小的影响)

十六、冒泡排序

public class Sort {

public static void sort() {

Scanner input = new Scanner(System.in);

int sort[] = new int[10];

int temp;

System.out.println("请输入10个排序的数据:");

for (int i = 0; i < sort.length; i++) {

sort[i] = input.nextInt();

}

for (int i = 0; i < sort.length - 1; i++) {

for (int j = 0; j < sort.length - i - 1; j++) {

if (sort[j] < sort[j + 1]) {

temp = sort[j];

sort[j] = sort[j + 1];

sort[j + 1] = temp;

}

}

}

System.out.println("排列后的顺序为:");

for(int i=0;i

System.out.print(sort[i]+"   ");

}

}

public static void main(String[] args) {

sort();

}

}

十七、二分查找法

十八、时间类型转换

public class DateFormat {

public static void fun() {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

String newDate;

try {

newDate = sdf.format(new SimpleDateFormat("yyyyMMdd")

.parse("20121115"));

System.out.println(newDate);

} catch (ParseException e) {

e.printStackTrace();

}

}

public static void main(String args[]) {

fun();

}

}

十九、阶乘

public class Multiply {

public static int multiply(int num) {

if (num < 0) {

System.out.println("请输入大于0的数!");

return -1;

} else if (num == 0 || num == 1) {

return 1;

} else {

return multiply(num - 1) * num;

}

}

public static void main(String[] args) {

System.out.println(multiply(10));

}

}

二十、UE和UI的区别

UE是用户体验度

UI界面原型(用户界面)(相当于买房时用的模型)

设计UI的作用:

1、帮助程序员工作(界面已由美工设计完成)

2、提前让用户对项目有个宏观的了解,知道效果是什么样子。

二十一、osi七层模型

第一层:物理层

第二层:数据链路层

第三层:网络层

第四层:传输层

第五层:会话层

第六层:表示层

第七层:应用层

二十二、线程和进程的区别

1.线程(Thread)与进程(Process)

进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应的应用程序。不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间。

2.一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。

3.实现线程的两种方式:继承Thread类,实现Runable接口

二十三、jvm的内存结构

java虚拟机的内存结构分为堆(heap)和栈(stack),堆里面存放是对象实例也就是new出来的对象。栈里面存放的是基本数据类型以及引用数据类型的地址。

对于所谓的常量是存储在方法区的常量池里面。

二十四、内存泄露和内存溢出

内存泄露(memory leak),是指应用程序在申请内存后,

无法释放已经申请的内存空间.一次内存泄露危害可以忽略,

但如果任其发展最终会导致内存溢出(out of memory).

如读取文件后流要进行及时的关闭以及对数据库连接的释放。

内存溢出(out of memory)是指应用程序在申请内存时,

没有足够的内存空间供其使用。

如我们在项目中对于大批量数据的导入,采用分段批量提交的方式。

二十五、单例

单例就是该类只能返回一个实例。

单例所具备的特点:

1.私有化的构造函数

2.私有的静态的全局变量

3.公有的静态的方法

单例分为懒汉式、饿汉式和双层锁式

饿汉式:

public class Singleton1 {

      private Singleton1() {};

      private static Singleton1 single = new Singleton1();

      public static Singleton1 getInstance() {

          return single;

     }

 }

懒汉式:

public class Singleton2 {

      private Singleton2() {}

      private static Singleton2 single=null;

      public tatic Singleton2 getInstance() {

           if (single == null) {  

              single = new Singleton2();

          }  

         return single;

     }

 }

线程安全:

public class Singleton3 {

  private Singleton3() {}

  private static Singleton3 single ;

  public static Singleton3 getInstance() {

if(null == single){

synchronized(single ){

if(null == single){

single = new Singleton3();

}

}

}

return single;

  }

}

参考:

通过双重判断来保证单列设计模式在多线程中的安全性,

并且它在性能方面提高了很多。

synchronized在方法上加锁 (同步锁)

synchronized在代码块内部加锁 (同步代码块)

synchronized(同步锁)

使用synchronized如何解决线程安全的问题?

1.synchronized在方法上加锁

2.synchronized在代码块内部加锁

1.懒汉  2.饿汉 3.双重判断

二十六、解析xml文件的几种技术

1、 解析xml的几种技术

        1.dom4j

        2.sax

        3.jaxb

        4.jdom

        5.dom

1.dom4j        

  dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。

 2.sax

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

  3.jaxb

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

2、dom4j 与 sax 之间的对比:【注:必须掌握!】

dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,

sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml

也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性

所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j

二十七、项目的生命周期

    1.需求分析

2.概要设计

3.详细设计(用例图,流程图,类图)

4.数据库设计(powerdesigner)

5.代码开发(编写)

6.单元测试(junit 白盒测试)(开发人员)

svn版本管理工具(提交,更新代码,文档)

7.集成测试 (黑盒测试,loadrunner(编写测试脚本)(高级测试))

8.上线试运行 (用户自己体验)

9.压力测试(loadrunner)

10.正式上线

11.维护

二十八、OSCache的判断

Object obj = CacheManager.getInstance().getObj("oaBrandList");

//从缓存中取数据

if (null == obj)  {

obj = brandDao.getBrandList();

//如果为空再从数据库获取数据

//获取之后放入缓存中

CacheManager.getInstance().putObj("oaBrandList", obj);

}

return (List)obj;

二十九、经常访问的技术网站

1.csdn(详细步骤的描述)

2.iteye(详细步骤的描述)

3.oschina(开源中国获取java开源方面的信息技术)

4.java开源大全 www.open-open.com(获取java开源方面的信息技术)

5.infoq(对java,php,.net等这些语言的一些最新消息的报道)

三十、项目团队中交流的工具

飞秋(局域网) qq(局域网,外网)

RTX(局域网,外网) 邮箱(局域网,外网)

三十一、平时浏览的书籍

实战经验:

  *** in action(实战)

  ***深入浅出

  ***入门指南

思想基础:

  大话设计模式 重构

三十二、java Exception体系结构

java异常是程序运行过程中出现的错误。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中定义了许多异常类,分为两大类,错误Error和异常Exception。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常(非runtimeException),也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

1、Error与Exception

Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。

这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。

2、运行时异常和非运行时异常      

运行时异常:都是RuntimeException类及其子类异常:     IndexOutOfBoundsException索引越界异常

ArithmeticException:数学计算异常

NullPointerException:空指针异常

ArrayOutOfBoundsException:数组索引越界异常

ClassNotFoundException:类文件未找到异常

ClassCastException:造型异常(类型转换异常)

这些异常是不检查异常(Unchecked Exception),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的。

非运行时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如:

IOException、文件读写异常

FileNotFoundException:文件未找到异常

  EOFException:读写文件尾异常

MalformedURLException:URL格式错误异常

SocketException:Socket异常

SQLException:SQL数据库异常

三十三、session和cookie的区别

session是存储在服务器端,cookie是存储在客户端的,所以安全来讲session的安全性要比cookie高,然后我们获取session里的信息是通过存放在会话cookie里的sessionid获取的。又由于session是存放在服务器的内存中,所以session里的东西不断增加会造成服务器的负担,所以会把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里,然后cookie确切的说分为两大类分为会话cookie和持久化cookie,会话cookie确切的说是,存放在客户端浏览器的内存中,所以说他的生命周期和浏览器是一致的,浏览器关了会话cookie也就消失了,然而持久化cookie是存放在客户端硬盘中,而持久化cookie的生命周期就是我们在设置cookie时候设置的那个保存时间,然后我们考虑一问题当浏览器关闭时session会不会丢失,从上面叙述分析session的信息是通过会话cookie的sessionid获取的,当浏览器关闭的时候会话cookie消失所以我们的sessionid也就消失了,但是session的信息还存在服务器端,这时我们只是查不到所谓的session但它并不是不存在。那么,session在什么情况下丢失,就是在服务器关闭的时候,或者是session过期(默认时间是30分钟),再或者调用了invalidate()的或者是我们想要session中的某一条数据消失调用session.removeAttribute()方法,然后session在什么时候被创建呢,确切的说是通过调用getsession()来创建,这就是session与cookie的区别.

访问HTML页面是不会创建session,但是访问index.JSP时会创建session(JSP实际上是一个Servlet, Servlet中有getSession方法)

三十四、字节流与字符流的区别

stream结尾都是字节流,reader和writer结尾都是字符流

两者的区别就是读写的时候一个是按字节读写,一个是按字符。

实际使用通常差不多。

在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。

只是读写文件,和文件内容无关的,一般选择字节流。

三十五、final,finally,finalize三者区别

Final是一个修饰符:

当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值

当final修饰的变量为静态变量(即由static修饰)时,必须在声明这个变 量的时候给它赋值

当final修饰方法时,该方法不能被重写

当final修饰类时,该类不能被继承

Final不能修饰抽象类,因为抽象类中会有需要子类实现的抽 象方法,(抽 象类中可以有抽象方法,也可以有普通方法,当一个抽象类中没有抽象方 法时,这个抽象类也就没有了它存在的必要)

Final不能修饰接口,因为接口中有需要其实现类来实现的方法

Finally:

Finally只能与try/catch语句结合使用,finally语句块中的语句一定会执行, 并且会在return,continue,break关键字之前执行

finalize:

Finalize是一个方法,属于java.lang.Object类,finalize()方法是GC (garbage collector垃圾回收)运行机制的一部分,finalize()方法是在 GC清理它所从 属的对象时被调用的

三十六、Io流的层次结构

从流的方向

输入流 输出流

从流的类型上

字符流字节流

inputstream和outputstream都是抽象类

它们下面的实现包括

FileInputStream,BufferedInputStream

FileOutputStream,BufferedOutputStream

reader和 writer

FileReader,BufferedReader,StringReader

FileWriter,BufferedWriter,StringWriter,PrintWriter

三十七、JAVA:

Java是面向对象的,跨平台的,它通过java虚拟机来进行跨平台操作,它可以进行自动垃圾回收的【c语言是通过人工进行垃圾回收】,java还会进行自动分配内存。【c语言是通过指定进行分配内存的】,只需要new一个对象,这个对象占用了多少空间,不需要我们来管,java虚拟机负责管这些,用完之后也不需要我们来释放,java虚拟机会自动释放

三十八、JavaSE JavaEE JavaME区别

是什么:

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,EJB,Spring MVC,Struts,hibernate,ibatis等),

用于企业级软件开发,网络开发,web开发。

ME嵌入式开发(手机,小家电,PDA)。[苹果的ios,黑莓]

三者之间的关系:

Java SE(Java Platform, Standard Edition,Java标准版)就是基于JDK和JRE的。

Java SE为Java EE提供了基础。

Java EE除了基于我们这个所谓的Java SE外,还新加了企业应用所需的类库

三十九、JDK  JRE  JVM的区别:

Jdk【Java Development ToolKit】就是java开发工具箱, JDK是整个JAVA的核心里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编译成class文件,java文件是用来运行这个程序的,除此之外,里边还包含了java源生的API,java.lang.integer在rt的jar包里边【可以在项目中看到】,通过rt这个jar包来调用我们的这些io流写入写出等

JDK有以下三种版本:

J2SE,standard edition,标准版,是我们通常用的一个版本

J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序

J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序

Jre【Java  Runtime  Enviromental】是java运行时环境,那么所谓的java运行时环境,就是为了保证java程序能够运行时,所必备的一基础环境,也就是它只是保证java程序运行的,不能用来开发,而jdk才是用来开发的,所有的Java程序都要在JRE下才能运行。

包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。

Jre里边包含jvm

Jvm:【Java Virtual Mechinal】因为jre是java运行时环境,java运行靠什么运行,而底层就是依赖于jvm,即java虚拟机,java虚拟机用来加载类文件,java中之所以有跨平台的作用,就是因为我们的jvm

关系:

 J2se是基于jdk和jre,

 JDK是整个JAVA的核心里边包含了jre,

 Jre里边包含jvm

四十、报错的状态码:

 301 永久重定向

 302 临时重定向

 304 服务端 未改变

 403 访问无权限

 200 正常

 404 路径

 500 内部错误

四十一、协议以及默认的端口号

ftp   21    文件传输协议

Pop3 110  它是因特网 电子邮件 的第一个离线 协议标准

Smtp  25   简单邮件传输协议

http   80   超文本传输协议

oracle 默认端口号1521

mysql默认端口号 3306

四十二、抽象类与接口的区别

1.一个类只能进行单继承,但可以实现多个接口。

2.有抽象方法的类一定是抽象类,但是抽象类里面不一定有抽象方法;

接口里面所有的方法的默认修饰符为public abstract,接口里的成员变 量默认的修饰符为pulbic static final。

  关系

接口和接口继承

接口和抽象类抽象类实现接口

类和抽象类类继承抽象类

类和类继承

11111111111111111111

1.接口和抽象类的区别

①抽象类里可以有构造方法,而接口内不能有构造方法。

②抽象类中可以有普通成员变量,而接口中不能有普通成员变量。

③抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是

抽象的,不能有非抽象的普通方法。

④抽象类中的抽象方法的访问类型可以是 public ,protected 和默认

类型,但接口中的抽象方法只有 public 和默认类型。

⑤ 抽象类中可以包含静态方法,接口内不能包含静态方法。

⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变

量的访问类型可以任意,但接口中定义的变量只能是 public static 类

型,并且默认为 public static 类型。

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

⑧接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的

通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用。


四十三、修饰符的作用

修饰符的作用范围:

private  default  protected public

同一个类中可以 可以 可以    可以

同一个包的类中 可以可以    可以

不同包的子类中 可以可以

不同包的类中    可以

四十四、onready和onload的区别

1.onready比onload先执行

2.onready是在页面解析完成之后执行,而onload是在页面所有元素加载后执行

3.onload只执行最后一个而onready可以执行多个。

参考:

[if !supportLists]1.[endif]执行时间window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行。 $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 $(document).ready()可以同时编写多个,并且都可以得到执行 3.简化写法 window.onload没有简化写法 $(document).ready(function(){})可以简写成$(function(){});另外,需要注意一点,由于在$(document).ready() 方法内注册的事件,只要DOM 就绪就会被执行,因此可能此时元素的关联文件未下载完。例如与图片有关的html 下载完毕,并且已经解析为DOM 树了,但很有可能图片还没有加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。要解决这个问题,可以使用Jquery 中另一个关于页面加载的方法---load() 方法。Load() 方法会在元素的onload 事件中绑定一个处理函数。如果处理函数绑定给window 对象,则会在所有内容( 包括窗口、框架、对象和图像等) 加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。 Jquery 代码如下: $(window).load(function (){ // 编写代码 });等价于JavaScript 中的以下代码 Window.onload = function (){ // 编写代码 }

四十五、switch默认接受几种数据类型

Short, int, byte, char

四十六、request 跟session的区别

1.他们的生命周期不同,

request对应的是一次请求,

session对应的是一次会话

2.request占用资源比较少,相对来说缺乏持续性,

而session资源消耗比较大,所以通常使用request来保存信息

四十七、找到解决svn冲突方法

对于svn冲突,可以采用手工处理将冲突的部分进行整合,

之后备份最新整合后的文件,采用覆盖更新的方式处理完

冲突之后,再把最新整合后的文件进行提交。

四十八、反射的描述

通过字符串可以动态创建java对象,并且可以动态访问方法,

属性等。

我们在项目中的时候封装过数据库jdbc的持久层,

其中就利用反射这项

技术来达到通用

和灵活的目的。

四十七、Set 接口

①HashSet 是 Set 接口的典型实现,HashSet 按 hash 算法来存储元

素,因此具有很好的存取和查找性能。特点:不能保证元素的排列顺

序,顺序有可能发生变化;HashSet 是异步的;集合元素值可以是 null;

当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的

hashCode()方法来得到该对象的 hashCode 值,然后根据该

HashCode 值来确定该对象在 HashSet 中存储的位置。HashSet 还有

一个子类 LinkedHashSet,其集合也是根据元素 hashCode 值来决定

元素的存储位置,但它同时用链表来维护元素的次序,这样使得元素

看起来是以插入的顺序保存的,也就是说,当遍历 LinkedHashSet 集

合元素时,它将会按元素的添加顺序来访问集合里的元素。所以

LinkedHashSet 的性能略低于 HashSet,但在迭代访问全部元素时将

有很好的性能,因为它以链表来维护内部顺序。

②TreeSet 是 SortSet 接口的唯一实现,TreeSet 可以确保集合元素处

于排序状态。TreeSet 不是根据元素插入顺序进行排序的,而是根据

元素的值来排序的。TreeSet 支持两种排序方法:自然排序和定制排

序。

③EnumSet 中所有值都必须是指定枚举类型的值,它的元素也是有序

的,以枚举值在枚举类的定义顺序来决定集合元素的顺序。EnumSet

集合不允许加入 null 元素,否则会抛出 NullPointerException 异常。

EnumSet 类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的 static 方法来创建 EnumSet 对象。

④总结:

A、HashSet 的性能比 Treeset 好,因为 TreeSet 需要额外的红黑树算

法来维护集合元素的次序,只有当需要一个保持排序的 Set 时,才会

用 TreeSet。

B、EnumSet 是性能最好的,但它只能保存枚举值。

C、它们都是线程不安全的。

注:Set 是一种不包含重复的元素的 Collection,即任意的两个元素 e1

和 e2 都有 e1.equals(e2)=false,Set 最多有一个 null 元素。

关于 HashSet,条目数和容量之和来讲,迭代是线性的。因此,如果

迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选得

太大,既浪费空间,也浪费时间。默认的初试容量是 101,一般来讲,

它比你所需要的要多。可以使用 int 构造函数来指定初始容量。要分

配 HashSet 的初始容量为 17: Set s=new HashSet(17);

HashSet 另有一个称作装载因数(load factor)的"调整参数(tuning

parameter)"。

区别:

1. HashSet 是通过 HashMap 实现的,TreeSet 是通过 TreeMap 实现

的,只不过 Set 用的只是 Map 的 key。

2. Map 的 key 和 Set 都有一个共同的特性就是集合的唯一

性.TreeMap 更是多了一个排序的功能.

3. hashCode 和 equal()是 HashMap 用的, 因为无需排序所以只需要关注定位和唯一性即可.

a. hashCode 是用来计算 hash 值的,hash 值是用来确定 hash 表

索引的.

b. hash 表中的一个索引处存放的是一张链表, 所以还要通过

equal 方法循环比较链上的每一个对象 才可以真正定位到键值对

应的 Entry.

c. put 时,如果 hash 表中没定位到,就在链表前加一个 Entry,如果

定位到了,则更换 Entry 中的 value,并返回旧 value

4. 由于 TreeMap 需要排序,所以需要一个 Comparator 为键值进行

大小比较.当然也是用 Comparator 定位的.

a. Comparator 可以在创建 TreeMap 时指定

b. 如果创建时没有确定,那么就会使用 key.compareTo()方法,这

就要求 key 必须实现 Comparable 接口.

TreeMap 是使用 Tree 数据结构实现的,所以使用 compare 接口就可

以完成定位了

四十八、Java IO 和 NIO 区别

①NIO 操作直接缓存区,直接与 OS 交互,Selector IO 复用机制。

IO NIO

面向流 面向缓冲

阻塞 IO 非阻塞 IO

无 选择器Selector:Java NIO 的选择器允许一个单独的线程来监视多个输入通

道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程

来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准

备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多

个通道。

②NIO 与 Netty:A、NIO 的类库和 API 复杂,使用麻烦,需要熟练使

用 Selector、ServerSocketChannel、SOcketChannel、ByteBuffer 等。

B、NIO 涉及到 Reactor 模式,需要了解 Java 多线程和网络编程。C、

JDKNIO Bug-epoll bug 容易导致 Selector 空轮询,最终导致 CPU100%

占用,虽然 JDK1.6 update18 修复了这个问题,但是直到 JDK1.7 问题

依然存在,只是降低了发生的概率。

③Netty 的优点:A、API 简单,开发门槛低;B、功能强大,预置了

多种解码功能,支持多种主流协议;C、可以通过 ChannelHandler 对

通信框架进行灵活的扩展;D、性能高,Netty 的综合性能是最好的;

E、Netty 修复了一经发现了所有的 JDKNIO BUG,成熟,稳定。

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用

户线程发起 IO 请求后需要等待或者轮询内核 IO 操作完成后才能继

续执行;而异步是指用户线程发起 IO 请求后仍继续执行,当内核 IO

操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

引申:

Java 中 IO 的种类和应用场景:

A、同步阻塞式:BIO。用于连接数目较小且固定的架构,对服务器资源占用高。

B、伪异步 IO 变成:线程池和任务队列。

C、NIO 编程:a、缓冲徐 ByteBuffer;b、通道 channel 全双工,同时

用于读写;c、多路复用器 selector。用于连接数目多且较短的架构,

如聊天服务器等,但是编程复杂,存在 epoll bug,导致 Selector 空轮

询,直至 CPU 占用达到 100%,虽然在 JDK1.6 update18 中有对这个

bug 的修复,但是在 JDK1.7 中依然可能会出现这个问题,只是降低

了 bug 出现的概率。

D、AIO 编程:用于连接数目多且较长的架构,如相册服务器等,充

分调用 OS 参与并发操作,基于 JDK1.7。

阻塞和非阻塞的概念描述的是用户线程调用内核 IO 操作的方式:阻

塞是指 IO 操作需要彻底完成后才返回到用户空间;而非阻塞是指 IO

操作被调用后立即返回给用户一个状态值,无需等到 IO 操作彻底完

成。

四十九、Java IO 和 NIO 区别

Java 锁机制

①synchronized:把代码块声明为 synchronized,有两个重要后果,

通常是指该代码具有 原子性和可见性。作用:

A、当两个并发线程

访问同一个对象 object 中的这个 synchronized(this)同步代码块时,

一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程

执行完这个代码块以后才能执行该代码块。

B、当一个线程访问 object

的一个 synchronized(this)同步代码块时,另一个线程仍然可以访问该object 中的非 synchronized(this)同步代码块。C、尤其关键的是,当

一个线程访问 object 的一个 synchronized(this)同步代码块时,其他

线程对 object 中所有其它 synchronized(this)同步代码块的访问将被

阻塞。

A、原子性:原子性意味着个时刻,只有一个线程能够执行一段代码,

这段代码通过一个 monitor object 保护。从而防止多个线程在更新共

享状态时相互冲突。

B、可见性:可见性则更为微妙,它要对付内存缓存和编译器优化的

各种反常行为。它必须确保释放锁之前对共享数据做出的更改对于随

后获得该锁的另一个线程是可见的。

C、volatile 只保证可见性和禁止重排序,不保证原子性。

②synchronized 限制:

A.它无法中断一个正在等候获得锁的线程;

B.也无法通过投票得到锁,如果不想等下去,也就没法得到锁;

C.同步还要求锁的释放只能在与获得锁所在的堆栈帧相同的堆栈帧

中进行,多数情况下,这没问题(而且与异常处理交互得很好),但

是,确实存在一些非块结构的锁定更合适的情况。

③java.util.concurrent.lock:

ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发

性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候

的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。

用 sychronized 修饰的方法或者语句块在代码执行完之后锁自动释放,而是用 Lock 需要我们手动释放锁,所以为了保证锁最终被释放(发生

异常情况),要把互斥区放在 try 内,释放锁放在 finally 内。

④ReentrantWriteReadLock 中的 ReadLock 和 WWriteLock,在全为读

时实现并发读,并发读写或并发写时候加锁。

总结:synchronized 是 Java 原语,阻塞的,竞争锁机制;新锁更加面

向对象,并且支持中断和支持公平锁。

五十、Java 反射

反射机制指的是程序在运行时能够获取自身的信息。

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动

态与静态的概念,

静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥

了 java 的灵活性,体现了多态的应用,有以降低类之间的藕合性。

一句话,反射机制的优点就是可以实现动态创建对象和编译,体

现出很大的灵活性,特别是在 J2EE 的开发中

它的灵活性就表现的十分明显。

作用:①首先得根据传入的类的全名来创建 Class 对象。

②获得类方

法的方法。③ 获得类中属性的方法。

缺点:

①性能第一:反射包括了一些动态类型,所以 JVM 无法对这些

代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。

我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用

反射。

②安全限制:使用反射技术要求程序必须在一个没有安全限制

的环境中运行。如果一个程序必须在有安全限制的环境中运行,如

Applet。

③内部暴露:由于反射允许代码执行一些在正常情况下不被

允许的操作(比如访问私有的属性和方法),所以使用反射可能会导

致意料之外的副作用--代码有功能上的错误,降低可移植性。反射

代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可

能也随着变化。

五十一,重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。重写:发生在父子类中,方法名、参数列表必须相同,返回值类型小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。

五十二、构造器Constructor是否可被override

构造器不能被重写,不能用static修饰构造器,只能用publicprivate protected这三个权限修饰符,且不能有返回语句。

五十三、hashCode和equals方法的关系

equals相等,hashcode必相等;hashcode相等,equals可能不相等

五十四.自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型;Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

五十五.什么是泛型、为什么要使用以及泛型擦除

泛型,即“参数化类型”。创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下:1).将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。2).移除所有的类型参数。

五十六、HashMap实现原理

五十七、Concurrenthashmap实现原理

五十八、Java中如何实现代理机制(JDK、CGLIB)

JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。

CGLIB动态代理:代理类是目标类的子类,用到MethodInterceptor接口。

五十九,synchronized如何使用

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:1).修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;2).修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;3).修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;4).修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

 synchronized和Lock的区别

主要相同点:Lock能完成synchronized所实现的所有功能主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。Lock的锁定是通过代码实现的,而synchronized是在JVM层面上实现的,synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。Lock锁的范围有局限性,块范围,而synchronized可以锁住块、对象、类。

 多线程如何进行信息交互

void notify()唤醒在此对象监视器上等待的单个线程。void notifyAll()唤醒在此对象监视器上等待的所有线程。void wait()导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。void wait(long timeout)导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量。void wait(long timeout, int nanos)导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

 sleep和wait的区别(考察的方向是是否会释放锁)

sleep()方法是Thread类中方法,而wait()方法是Object类中的方法。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态,在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。

 多线程与死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。产生死锁的原因:一.因为系统资源不足。二.进程运行推进的顺序不合适。三.资源分配不当。

 如何才能产生死锁

产生死锁的四个必要条件:一.互斥条件:所谓互斥就是进程在某一时间内独占资源。二.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。三.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。四.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

 死锁的预防

打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。一.打破互斥条件。即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。二.打破不可抢占条件。即允许进程强行从占有者那里夺取某些资源。就是说,当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。三.打破占有且申请条件。可以实行资源预先分配策略。即进程在运行前一次性地向系统申请它所需要的全部资源。如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。四.打破循环等待条件,实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。

 什么叫守护线程,用什么方法实现守护线程

守护线程是为其他线程的运行提供服务的线程。setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为守护模式,false为用户模式。

六十 、volatile关键字

用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。

volatile很容易被误用,用来进行原子性操作。

Java语言中的volatile变量可以被看作是一种“程度较轻的synchronized”;

与synchronized块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。锁提供了两种主要特性:互斥(mutualexclusion)和可见性(visibility)。

互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的,如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。

Volatile变量具有synchronized的可见性特性,但是不具备原子特性。这就是说线程能够自动发现volatile变量的最新值。要使volatile变量提供理想的线程安全,必须同时满足下面两个条件:对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中。

第一个条件的限制使volatile变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而volatile不能提供必须的原子特性。实现正确的操作需要使x 的值在操作期间保持不变,而volatile变量无法实现这点。每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。


java综合知识点(一,基础篇 )_第1张图片

read and load从主存复制变量到当前工作内存use and assign执行代码,改变共享变量值store and write用工作内存数据刷新主存相关内容其中use andassign可以多次出现,但是这一些操作并不是原子性,也就是在read load之后,如果主内存count变量发生修改之后,线程工作内存中的值由于已经加载,不会产生对应的变化,所以计算出来的结果会和预期不一样。

六十 一Java中的NIO,BIO,AIO分别是什么

BIO:

同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO:

同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

IO和NIO区别

一.IO是面向流的,NIO是面向缓冲区的。

二.IO的各种流是阻塞的,NIO是非阻塞模式。

三.Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

六十 二,  序列化与反序列化

把对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:一.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

二.在网络上传送对象的字节序列。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

六十三,  内存溢出和内存泄漏的区别

内存溢出和内存泄漏的区别

内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out ofmemory。

内存泄漏是指分配出去的内存不再使用,但是无法回收。

用什么工具可以查出内存泄漏

一. MemoryAnalyzer-是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于EclipseRCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。二. JProbe-分析Java的内存泄漏。三.JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中,GUI可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。四. JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。五. YourKit-.NET & Java Profiling业界领先的Java和.NET程序性能分析工具。六.AutomatedQA-AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft,Borland, Intel, Compaq 和 GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。七.Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块

六十四、servlet生命周期及各个方法

六十五、JSP的动态include和静态include

(1)动态include用jsp:include动作实现,如,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。会先解析所要包含的页面,解析后和主页面合并一起显示,即先编译后包含。(2)静态include用include伪码实现,不会检查所含文件的变化,适用于包含静态页面,如<%@include file="qq.htm" %>,不会提前解析所要包含的页面,先把要显示的页面包含进来,然后统一编译,即先包含后编译。

六十六、Hibernate/Ibatis两者的区别

 六十七、Spring如何实现AOP和IOC(推荐看Spring的源码)

六十八、Spring的事务管理 

spring事务的传播特性

六十九、springmvc原理

springmvc用过哪些注解

七十、Restful有几种请求

Restful好处

(1)客户-服务器:客户-服务器约束背后的原则是分离关注点。通过分离用户接口和数据存储这两个关注点,改善了用户接口跨多个平台的可移植性;同时通过简化服务器组件,改善了系统的可伸缩性。(2)无状态:通信在本质上是无状态的,改善了可见性、可靠性、可伸缩性.(3)缓存:改善了网络效率减少一系列交互的平均延迟时间,来提高效率、可伸缩性和用户可觉察的性能。(4)统一接口:REST架构风格区别于其他基于网络的架构风格的核心特征是,它强调组件之间要有一个统一的接口。

七十一、Restful有几种请求memcached和redis的区别

(1)性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。(2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。(3)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

七十二、hash算法及常用的hash算法

七十三、队列、栈、链表、树、堆、图

七十四、linux常用命令

七十五、TCP和UDP区别

http://www.cnblogs.com/bizhu/archive/2012/05/12/2497493.html

你可能感兴趣的:(java综合知识点(一,基础篇 ))