13. JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try 块中可以抛出异常吗?
JAVA异常处理:
Java通过面向对象的方法进行异常处理,把不同的异常进行分类,并提供了良好的接口。Java中,每个异常就是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常时就会抛出一个异常对象,该对象包含异常信息,调用这个对象的方法可以捕捉这个异常并进行处理。
异常处理五个关键字:throws,throw,try,catch,finally
try 用来指定一块预防所有“异常”的程序;
catch 子句紧跟在try 块后面,用来指定你想要捕捉的“异常”的类型;
throw 语句用来明确地抛出一个“异常”;
throws 用来标明一个成员函数可能抛出的各种“异常”;
Finally 为确保一段代码不管发生什么“异常”都被执行一段代码;
一般情况下是用try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省(默认)处理器来处理;
可以在一个成员函数调用的外面写一个try 语句,在这个成员函数内部写另一个try 语句保护其他代码。每当遇到一个try 语句,“异常”的框架就放到堆栈上面,直到所有的try 语句都完成。如果下一级的try 语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try 语句。
14. 运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
15. 最常见到的RuntimeException
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的父类。
(1)ArithmeticException
当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
int i=10/0;

(2)ArrayStoreException
试图将错误类型的对象存储到一个对象数组时抛出的异常。例如,以下代码可生成一个 ArrayStoreException:
Object x[] = new String[3];
x[0] = new Integer(0);

(3)ClassCastException
当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException:
Object x = new Integer(0);
String s= (String)x;

(4)illegalArgumentException
抛出的异常表明向方法传递了一个不合法或不正确的参数
(5)IndexOutOfBoundsException
指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出
(6)NegativeArraySizeException
如果应用程序试图创建大小为负的数组,则抛出该异常。
(7)NoSuchElementException
由 Enumeration(枚举) 的 nextElement 方法抛出,表明枚举中没有更多的元素。
(8)NullPointerException
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
-调用 null 对象的实例方法。
-访问或修改 null 对象的字段。
-将 null 作为一个数组,获得其长度。
-将 null 作为一个数组,访问或修改其时间片。
-将 null 作为 Throwable 值抛出。
应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用。
16. final, finally, finalize 的区别
final
修饰符(关键字);
如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承,因此一个类不能既被声明为abstract的,又被声明为final 的;
将变量或方法声明为final,可以保证它们在使用中不被改变;被声明为final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改;被声明为final 的方法也同样只能使用,不能重载。
finally
在异常处理时提供finally 块来执行必须最后都要执行的操作,有没有异常。finall常进行最后开辟空间的关闭;
finalize
方法名;Java 技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object 类中定义的,因此所有的类都继承了它。子类覆盖finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
17. 已知 类Example A 继承Exception,类ExampleB 继承Example A;
有如下代码片断:
package com.senchen.test;
class ExampleA extends Exception{}
class ExampleB extends ExampleA{}
public class A {
public static void main(String[] args) {
try{
throw new ExampleB();
}catch(ExampleA a1){
System.out.println("ExampleA");
}catch(Exception e){
System.out.println("Exception");
}
}
}
输出的内容应该是:(A)
A:ExampleA
B:Exception
C:b
D:无

18. JAVA 中的Collection FrameWork(及如何写自己的数据结构)
Collection 单列集合
├List: 有序、重复的集合
│ ├LinkedList : 线程不安全。增删速度快。 底层数据结构是列表结构
│ ├ArrayList : 线程不安全,查询速度快。底层数据结构是数组结构
│ └Vector : 线程安全,但速度慢,已被ArrayList替代。底层数据结构是数组结构
└Set: 无序、不可重复的集合 取出元素的方法只有迭代器
├HashSet : 线程不安全,存取速度快。###### └TreeSet: 线程不安全,可以对Set集合中的元素进行排序。
Map: 双列集合 具有映射关系
├Hashtable : 线程安全,速度快。底层是哈希表数据结构。是同步的
├HashMap: 线程不安全,速度更快。底层也是哈希表数据结构。是异步的
└TreeMap: 可以用来对Map集合中的键进行排序.
最常用的集合类是List 和Map。List 的具体实现包括ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
19. 说出ArrayList,Vector, LinkedList 的存储性能和特性?
ArrayList 和Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
Vector 由于使用了synchronized 方法(线程安全),通常性能上较ArrayList 差。
而LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
20. Collection 和Collections 的区别?
Collection 是java.util 下的接口,它是各种集合的父接口,继承于它的接口主要有Set 和List;
Collections 是个java.util 下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
21. HashMap 和Hashtable 的区别?
共同点:都实现了Map 接口,是将惟一键映射到特定的值上;
区别:
1) HashMap 没有排序,允许一个null 键和多个null 值,而Hashtable 不允许;
2) HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey,因为contains 方法容易让人引起误解;
3) Hashtable 继承自Dictionary 类,HashMap 是Map 接口的实现类;
4) Hashtable 的方法是Synchronize (线程安全)的,而HashMap 不是,在多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。Hashtable 和HashMap 采用的hash/rehash 算法大致一样,所以性能不会有很大的差异。
22. Arraylist 与Vector 区别?
1)同步性:
Vector 是线程安全的(同步),而ArrayList 是线程序不安全的(异步);
2)数据增长:
当需要增长时,Vector 默认增长一倍,而ArrayList 却是一半。
24. List、Map、Set 三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。
Set 无法拥有重复元素,内部排序。
Map 保存key-value 值,value 可多值。
25. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set 里的元素是不能重复的,用equals ()方法来区分重复与否。覆盖equals()方法用来判断对象的内容是否相同,而”==”判断地址是否相等,用来决定引用值是否指向同一对象
26. java中==和equals的区别详解
1. ==:
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true。
2. equals:
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断;
String类对equals的重写:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String类中equals方法不仅可以用==判断对象的内存地址是否相等,相等则返回true。如果前面的判断不成立,接着判断括号内的对象上是否是String类型,接着判断两个字符串对象的的长度是否相等,最后判断内容是否相等,如果相等则返回true。
27. 用程序给出随便大小的10 个数,序号为1-10,按从小到大顺序输出,并输出相应的序号.
方法一:
public class A {
public static void printRandomBySort() {
Random random = new Random(); // 创建随机数生成器
List list = new ArrayList();
// 生成10 个随机数,并放在集合list 中
for (int i = 0; i < 10; i++) {
list.add(random.nextInt(10));
}
Collections.sort(list); // 对集合中的元素进行排序
Iterator it = list.iterator();
int count = 0;
while (it.hasNext()) { // 顺序输出排序后集合中的元素
System.out.println(++count + ": " + it.next());
}
}
public static void main(String[] args) {
new A().printRandomBySort();
}
}

方法二:随机数均匀一点
public class A {
public static void printRandomBySort1() {
List list= new ArrayList();
for (int i = 0; i < 10; i++) {
int a=(int) (Math.random()*10+1); //随机生成1-10存入集合
list.add( a );
}
Collections.sort(list); // 对集合中的元素进行排序
for (int i = 0; i < list.size(); i++) {
System.out.println(i+1+":"+list.get(i));
}
}
public static void main(String[] args) {
new A().printRandomBySort1();
}
