<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
-
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
Stringbuffer 比StringBuilder 唯一区别即增加synchronized 关键字,所以是线程安全的;
-
说一下 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 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常 ,或者是通过对异常的处理显式的控制程序退出。
异常处理的目标之一就是为了把程序从异常中恢复出来 。
-
Java 内存溢出与泄漏,举例说明
原因有很多种,比如:
1. 数据量过于庞大;死循环 ;静态变量和静态方法过多;递归;无法确定是否被引用的对象;例如:读大文件
2. 虚拟机不回收内存(内存泄漏);例如:数据库连接不关闭
-
Java 的垃圾回收机制
Java 的垃圾回收机制是Java 虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,问到这个问题的时候,70% 以上的人回答的含义是回收对象,实际上这是不正确的。
System.gc()
Runtime.getRuntime().gc()
上面的方法调用时用于显式通知JVM 可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。
-
Xml 有哪些解析技术,区别是什么
Java 中xml 有4 中解析技术,其中2 种是基本的解析技术dom 、xas
DOM 是基于XML 文档树结构的解析,一次性全部读入内存
Sax 是基于事件流的解析
DOM4J 是一个非常非常优秀的Java XML API ,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,hibernate 就是使用的此种技术
JDOM :为减少DOM 、SAX 的编码量,出现了JDOM ;优点:极大减少了代码量
-
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.
-
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 想在事务一修改的基础上再做修改。
-
statement preparedstatement 与 callablestatement 有什么区别
-
数据库命令分类
Ddl 数据定义语言:create 、alter 、drop
Dml 数据控制语言:insert 、update 、delete
Dcl 数据库控制语言:授权、角色控制等grant 、revoke
Tcl 事务控制语言:commit 、rollback
-
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 方法好。
建议:
1 、get 方式的安全性较Post 方式要差些,包含机密信息的话,建议用Post 数据提交方式;
2 、在做数据查询时,建议用Get 方式;而在做数据添加、修改或删除时,建议用Post 方式;
相关推荐
【Java基础总结大全】 Java是世界上最流行的编程语言之一,其跨平台特性主要依赖于Java虚拟机(JVM)。JVM是Java的核心组成部分,它解析并执行编译后的Java字节码,确保Java程序可以在任何支持JVM的操作系统上运行...
这份"Java基础加强-个人总结doc"文档,结合了张孝祥老师的PPT,为我们提供了全面而深入的学习材料。以下是这份文档可能涵盖的一些核心知识点: 1. **基础知识**:这部分涵盖了Java语言的基础语法,包括变量、数据...
### Java基础知识总结(绝对经典) #### 一、Java概述 - **起源与发展**:Java语言始于1991年Sun公司的James Gosling等人所开发的Oak语言,原计划用于控制嵌入式设备如有线电视交换盒和个人数字助理(PDA)。1994年...
本文档是基于毕向东老师的java基础视频和张孝祥老师的高薪技术视频和银行管理系统以及交通灯管理系统的视频所做的笔记。 知识主要包括:Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多...
传智博客的JAVA基础笔记个人总结是一份全面的学习资源,旨在帮助初学者或有一定基础的开发者巩固和提升Java编程技能。这份笔记是基于传智播客的课程内容,结合了牛牧老师和水镜老师的讲解精华,提供了27天的学习计划...
### Java基础知识总结 #### 一、Java概述 Java是由Sun Microsystems公司(现已被Oracle收购)在1991年由James Gosling(詹姆斯·高斯林)领导的一个团队开始开发的一种面向对象的编程语言。最初被命名为Oak,目标...
Java基础是编程学习的重要起点,本篇将对Java的基础知识进行深入探讨,涵盖从编程步骤、Java技术架构、开发环境配置到语法基础等关键概念。 首先,编程过程分为四个主要步骤:明确需求、分析思路、确定步骤和代码...
### Java基础知识总结 #### 一、Java概述 Java是一种广泛使用的高级编程语言,它由Sun Microsystems公司的James Gosling等人在1991年开始开发,并最初命名为Oak。Oak旨在用于控制嵌入式设备如有线电视交换盒和个人...
Java技术总结 非常全面
以上只是Java基础知识的一部分,实际学习中还需要深入理解反射、注解、枚举、泛型、设计模式等高级主题。通过阅读提供的文档"JAVA-介绍.doc"和"JAVA 网络.doc",可以更全面地掌握这些概念并实践应用。"java集合"文件...
### Java基础知识总结(超级经典) #### 一、Java概述 - **起源与发展**:Java语言始于1991年Sun公司的James Gosling等人发起的Oak项目,最初目标是为了控制嵌入式设备,如有线电视交换盒和个人数字助理(PDA)。...
### Java基础知识总结(超级经典) #### 一、Java概述 - **起源与发展**:Java语言始于1991年Sun公司的James Gosling等人发起的Oak项目,最初目标是为了控制嵌入式设备,如有线电视交换盒和个人数字助理(PDA)。...
### Java基础总结——核心知识点详解 #### 一、Java概述 - **起源与发展**:Java 语言最初由 Sun 公司的 James Gosling 等人在 1991 年开发,当时命名为 Oak,目的是为了控制有线电视交换盒和个人数字助理(PDA)等...
这份"JAVA学习历程(基础知识个人总结1,2,3)"的文档集合,显然是一位热情的学习者在探索JAVA世界时,逐步积累并整理出的心得体会。这些文档可能包含了从入门到进阶的各类关键知识点,旨在帮助读者构建全面的JAVA...
本资源“毕向东Java基础源码+总结”提供了一套全面的Java基础知识的源代码示例,帮助初学者深入理解Java的核心概念。 1. **基本语法与数据类型** Java提供了八种基本数据类型:byte, short, int, long, float, ...
老毕个人总结,java android总结,对基础部分很有帮助!
最后,《java基础总结大全(笔记).doc》可能包含了一些实战经验或者读者个人的理解,比如: 1. **项目实践**:如何将学到的基础知识应用于实际的小项目,如简单的计算器、图书管理系统等。 2. **面试高频问题**:...
### 个人Java总结笔记 #### Class对象概述 - **概念**:`Class`对象表示一个类或接口。每个被加载的类都会对应一个唯一的`Class`对象。 - **创建时机**:`Class`对象由Java虚拟机(JVM)在需要使用到该类时自动...
"Java基础各章节个人总结代码"是一个针对Java初学者或有经验的开发者的学习资源,它涵盖了Java SE(标准版)的基础知识。在这个压缩包中,你可能会找到关于变量、数据类型、控制流、类和对象、封装、继承、多态性...
java基础面试复习集个人总结版