`
lgsun592
  • 浏览: 53719 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

个人java基础总结

    博客分类:
  • Java
阅读更多

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

  1. string stringbuffer stringbuilder 的区别

String:

是对象不是原始类型.

为不可变对象, 一旦被创建, 就不能修改它的值.

对于已经存在的String 对象的修改都是重新创建一个新的对象, 然后把新的值保存进去.

 

String final, 即不能被继承.

  public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];
...

 

StringBuffer

是一个可变对象, 当对他进行修改的时候不会像String 那样重新建立对象

它只能通过构造函数来建立,

StringBuffer sb = new StringBuffer();

对象被建立以后, 在内存中就会分配内存空间, 并初始保存一个null.StringBuffer

中付值的时候可以通过它的append 方法.

 

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大

Stringbuffer 底层是用char[] 实现的,默认长度16 ,默认增长长度(value.length + 1) * 2

 

StringbufferStringBuilder 唯一区别即增加synchronized 关键字,所以是线程安全的;

 

  1. 说一下 Error Exception RuntimeException 并举例开发中是怎么用的。

Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error Exception

Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

Exception :表示可恢复的例外,这是可捕捉到的。

 

Java 提供了两类主要的异常 :runtime exception checked exception checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。

但是另外一种异常: runtime exception ,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run() 抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常 ,或者是通过对异常的处理显式的控制程序退出。

异常处理的目标之一就是为了把程序从异常中恢复出来 。

  1. Java 内存溢出与泄漏,举例说明

原因有很多种,比如:

 

1. 数据量过于庞大;死循环 ;静态变量和静态方法过多;递归;无法确定是否被引用的对象;例如:读大文件

 

2. 虚拟机不回收内存(内存泄漏);例如:数据库连接不关闭

  1. Java 的垃圾回收机制

Java 的垃圾回收机制是Java 虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。

需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,问到这个问题的时候,70% 以上的人回答的含义是回收对象,实际上这是不正确的。

System.gc()

Runtime.getRuntime().gc()

上面的方法调用时用于显式通知JVM 可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。

  1. Xml 有哪些解析技术,区别是什么

Javaxml4 中解析技术,其中2 种是基本的解析技术domxas

DOM 是基于XML 文档树结构的解析,一次性全部读入内存

Sax 是基于事件流的解析

DOM4J 是一个非常非常优秀的Java XML API ,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,hibernate 就是使用的此种技术

JDOM :为减少DOM SAX 的编码量,出现了JDOM ;优点:极大减少了代码量

  1. List map set 都继承自 collection 接口吗?说出其异同

List 中的元素可以重复,而set 中的元素不可以重复

LinkedList 是用内部类实现的双向链表

private static class Entry< E > {

E element;

Entry< E > next;

Entry< E > previous;

 

Entry( E element, Entry< E > next, Entry< E > previous) {

this .element = element;

this .next = next;

this .previous = previous;

}

}

ArrayList 是以Object[] elementData 数组的形式实现的,初始长度为10.

默认增长newCapacity = (oldCapacity * 3)/2 + 1;

 

CopyOnWriteArrayList 线程安全的集合,为jdk1.5新增的类

也是采用Object[] 实现的,但是初始长度为0

它是采用Array.copy技术实现的数组增长,所以不存在默认增长长度问题

 

HashSet 采用哈希技术,TreeSet 虽然存入的顺序跟存储的顺序不同,但是存储是按照排序存储的。

HashMap 是线程不安全的,HashTable 是线程安全的,TreeMap 是排序的

 

ConcurrentHashMap 也是线程安全的,为jdk1.5新增加的类,

HashTable在同步过程中会锁定整个hashtable,效率较低

而ConcurrentHashMap将整个hashtable分成16个桶,同步过程中只锁定目标桶即可,所以允许最多16个进程同时操作,比HashTable效率要高

 

1.spring的3种注入方式:接口,构造函数,set方法

2.注解的原理

3.aop

4. 

  1. Oracle 的事物隔离级别

  ANSI/ISO SQL92 标准定义了一些数据库操作的隔离级别:

            未提交读(read uncommitted

            提交读(read committed

            重复读(repeatable read

            序列化(serializable

           通过一些现象,可以反映出隔离级别的效果。这些现象有:

            更新丢失(lost update ):当系统允许两个事务同时更新同一数据是,发生更新丢失。

            脏读(dirty read ):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

            非重复读(nonrepeatable read ):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data.  )

            幻像(phantom read ):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition.  )

           下面是隔离级别及其对应的可能出现或不可能出现的现象

 

Dirty Read 

NonRepeatable Read 

Phantom Read 

Read uncommitted

Possible

Possible

Possible

Read committed

Not possible

Possible

Possible

Repeatable read

Not possible

Not possible

Possible

Serializable

Not possible

Not possible

Not possible

 

 

ORACLE 的隔离级别

 

           ORACLE 提供了SQL92 标准中的read committed serializable ,同时提供了非SQL92 标准的read-only

            read committed

           这是ORACLE 缺省的事务隔离级别。

           事务中的每一条语句都遵从语句级的读一致性。

  • 保证不会脏读;但可能出现非重复读和幻像。

            serializable

           简单地说,serializable 就是使事务看起来象是一个接着一个地顺序地执行。

           仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。

           保证不会出现非重复读和幻像。

           Serializable 隔离级别提供了read-only 事务所提供的读一致性(事务级的读一致性),同时又允许DML 操作。

           如果有在serializable 事务开始时未提交的事务在serializable 事务结束之前修改了serializable 事务将要修改的行并进行了提交,则serializable 事务不会读到这些变更,因此发生无法序列化访问的错误。(换一种解释方法:只要在serializable 事务开始到结束之间有其他事务对serializable 事务要修改的东西进行了修改并提交了修改,则发生无法序列化访问的错误。)

            read-only

           遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。

           不允许在本事务中进行DML 操作。

           read only serializable 的子集。它们都避免了非重复读和幻像。区别是在read only 中是只读;而在serializable 中可以进行DML 操作。

           Export with CONSISTENT = Y sets the transaction to read-only.

            read committed serializable 的区别和联系:

           事务1 先于事务2 开始,并保持未提交状态。事务2 想要修改正被事务1 修改的行。事务2 等待。如果事务1 回滚,则事务2 (不论是read committed 还是serializable 方式)进行它想要做的修改。如果事务1 提交,则当事务2 read committed 方式时,进行它想要做的修改;当事务2 serializable 方式时,失败并报错“Cannot serialize access” ,因为事务2 看不见事务1 提交的修改,且事务2 想在事务一修改的基础上再做修改。

  1. statement preparedstatement callablestatement 有什么区别

  1. 数据库命令分类

Ddl 数据定义语言:create alter drop

Dml 数据控制语言:insert update delete

Dcl 数据库控制语言:授权、角色控制等grant revoke

Tcl 事务控制语言:commit rollback

  1. Get set 的区别

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

2. get 是把参数数据队列加到提交表单的ACTION 属性所指的URL 中,值和表单内各个字段一一对应,在URL 中可以看到。post 是通过HTTP post 机制,将表单内各个字段与其内容放置在HTML HEADER 内一起传送到ACTION 属性所指的URL 地址。用户看不到这个过程。

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

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

建议:

1get 方式的安全性较Post 方式要差些,包含机密信息的话,建议用Post 数据提交方式;

2 、在做数据查询时,建议用Get 方式;而在做数据添加、修改或删除时,建议用Post 方式;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics