解内存中的栈(stack)、堆(heap)和方法区(method area)
栈:基本数据类型的变量,对象的引用,函数调用的现场。
堆:new关键字和构造器创建的对象,垃圾收集器管理的主要区域
方法区:jvm加载的类信息、常量、编译后的代码等
常量池:直接书写的数字,字符串和常量都放在常量池中。
说明:垃圾收集器采用分代收集算法,所以堆空间分为新生代和老生代。方法区和堆是各个线程共享的内存区域。栈速度快但空间小,栈空间占满会引发栈溢出:StackOverFlowError。常量池空间不足会引发outofMemoryError。
String 类是final类,不可以被继承。
String和StringBuilder、StringBuffer的区别?
这个问题真是老生常谈。string与其它两个的区别:strin字符串是不可改变的,而其他二者是可以改变的。但是对于后面两个那个线程安全大家肯定老是记不住:所以请记住我拿buff安全(红buff,蓝buff),所以StringBuffer线程安全。
说明:StringBuilder单线程,没有被sychronized修饰。
重载(Overload)和重写(Override)的区别
重载:与方法的返回值类型无关,只与函数的参数个数、类型、顺序有关。
重写:用于子父类之间,子类重写父类的方法,同名,同参,同返回值。
char能存储一个汉字吗?
Java采用unicode的编码方式,char类型占两个字节(16位),刚好可以存一个字节。
抽象类和接口有什么异同
抽象类:abstract class。可以定义抽象方法,构造函数,具体方法,其内部成员可以是protected,默认,public,private。
接口:只能定义方法申明,而无具体实现。成员都只能有public修饰。
说明:二者都不能进行实例化,抽象类的继承者,或者接口的实现者都必须对其中的所有抽象方法进行具体的实现。
静态变量和实例变量的区别。
静态变量:用static修饰,称为类变量,属于类。一个类不管创建几个对象,同一类变量只有一个。
实例变量:依存与实例,需要创建对象,通过对象才能访问。
说明:静态变量也可以实现让多个对象共享内存。
String str1 = new String("aaa")创建了两个对象。
首先系统去常量池查找有没有aaa字符串,没有进行创建,否则不创建,这是其一。另一个就是用new在堆上创建的对象。
接口可以继承多个接口extends。抽象类也可以继承抽象类。
一个源文件(.java)
最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。其他类可以有多个。
final关键字的修饰。
类:该类不能被继承;
方法:该方法不能被重写;
变量:此变量只能一次赋值以后值不能被修改,即:常量。
Error和Exception
Error:表示系统级的错误和程序不必处理的异常
Exception:表示需要捕捉或者需要程序进行处理的异常
关键字:throws、throw、try、catch、finally分别如何使用?
try必须和catch或者finally配套使用
throw:自定义异常
throws:和try catch 的功能相同可以进行替换。

结果:

有return,在finally对值进行了修改,其返回值是多少?
这是我一直以来的一个疑问??为什么值在finally中没有被修改。

上一条中的错误避免出现做出如下设置(eclipse)

关于异常始末图解

对象的克隆
实现Cloneable接口并重写Object类中的clone()方法;
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
数据类型之间的转换

将GB2312编码的字符串转换为ISO-8859-1编码的字符串

java中集合图解

ArrayList、Vector、LinkedList
ArrayList (非线程安全)和Vector都是使用数组方式存储数据,故:索引数据快而插入数据慢。
Vector是线程安全的容器。
LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。非线程安全。
Collection和Collections的区别
Collection是一个接口
Collections是个一个工具类,如图

输出结果:

List、Map、Set三个接口各自特点
List以特定索引来存取元素,可以有重复元素
Set不能存放重复元素
Map键值对的形式。键是唯一的。
说明:Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。
Thread类的sleep()方法和对象的wait()方法
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态。
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

线程的sleep()方法和yield()方法
sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态
sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常。
sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
启动一个线程是调用start()方法
事务的ACID是指什么
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。JDBC能否处理Blob和Clob大对象
Blob是指二进制大对象(Binary Large Object)
Clob是指大字符对象(Character Large Objec)
注意:JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。
反射
Class.forName(map.get(key)).newInstance();
map.get(key)获取类具体路径。
eg:com.cn.Dao.GetReader。
未完待续。。。





