------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
本篇文章主要讲解了Java语言中异常 String类 集合中的一些问题.
异常
1.1 Error和Exception 区别
Throwable:|——Error:错误,一般情况下不便携针对性的代码进行处理,需要对程序代码进行修正。
属于编译时的错误,编译不通过就不会有相应的class文件
|——Exception:异常,可以有针对性代码进行处理。
1.2 throw和throws的区别
throw:是在函数内抛出异常对象,当抛出的异常不是RuntimeException子类时,需要在函数名上throws。throws:是在函数上抛出异常类,可以抛出多个异常类,类与类之间用逗号隔开。
ps:无论是throw,还是throws 都是希望调用者去处理异常的。
1.3 编译时被检查的异常和运行时的异常区别
1、编译时被检查的异常:只要是Exception及其子类都是编译时被检测的异常。编译时的异常必须在函数内抛出,在函数上声明,否则编译失败
声明的原因是需要调用者去处理。
2、运行时的异常:其中Exception有一个特殊的子类RuntimeException,他和它的子类是运行时异常,是编译时不被检测的。
运行时的异常在函数内抛出,不需要再函数名上声明,
不声明的原因是:不需要调用者处理,运行时异常发生了,程序就停止了,调用者必须对代码进行修改。
1.4 对于异常什么时候try,什么时候throws呢?
功能内部出现异常,内部可以处理,就用try。如果功能内部处理不了,就必须throws声明出来,让调用者处理。1.5 子类对父类异常的操作
1、当子类覆盖父类的方法时,父类的方法抛出异常,那么子类的方法要么try要么抛出此异常和改异常的子类,不能抛出其他异常。2、如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类异常的子集。
3、如果父类或者接口中没有抛出异常,那么子类不可以抛出异常,此时出现了异常只能try。如果try解决不了,就可以throw抛出RuntimeException异常或其子类。
1.6 常见异常
IndexOutOfBoundsException:角标越界NullPointerException:空指针异常
ClassCastException:转换异常
InterruptedException:中断异常
UnsupportedOperationException:不支持操作异常
多线程
2.1 为什么有Runnable类
类通过实现Rnnable类覆盖run方法,可在主线程中创建线程。Runnable接口避免了单继承的局限性。2.2 同步代码块和同步函数的区别
同步代码块的锁是任意的,而同步函数的是this,静态同步函数的锁是类对应的字节码对象(类名.class)在一个类中只有一个需要同步,可以使用同步函数,当有多个同步时,就需要用同步代码块,通过不同的锁控制,所以同步代码块更灵活。
2.3 延迟加载的单例模式
懒汉式,当出现多个多个线程访问时,需要加同步,来解决安全性问题。但效率不高,所以通过双重判断来解决。2.4 多线程通讯的思路
1、将资源封装成对象。2、将线程执行的任务也封装成对象。
2.5 sleep和wait的区别
wait:可以指定时间也可以不指定时间,不指定时间由对应的notify或者notifyAll来唤醒。线程会释放执行权,而且线程会释放锁
sleep:必须指定时间,由时间到来空间被冻结的线程转成运行状态
线程会释放执行权,但线程不会释放锁
2.6 如何让线程结束
不能使用已经过时的stop方法。第一种:定义循环结束标记。
第二种:如果线程处于冻结状态,是不肯能读到标记的。这时就需要通过Thread类中interrupt方法,将冻结状态强制清楚,让线程回复执行资格状态,让线程可以读到标记,并结束。
String类
3.1 为什么字符串一旦被初始化就不可被改变。
应为字符串,一旦被初始化就存放到方法区中的常量池中,把相应的地址值给了栈内存中的变量名。3.2 String s1 = "abc" 和 String s2 = new String("abc") 为什么不同
第一个内存中只存在一个对象abc,而第二个内存中存在了两个对象。3.3 "=="和"equals"在比较两个String中的区别
"==":是比较两个字符串的地址值"equals":是比较两个字符串内容是否相同
集合
1.1 集合和数组的区别
1、数组的长度是一定的,集合的长度是可变的2、数组可以存储基本数据类型,也可以存储引用数据类型。但集合只能存储引用数据类型。
3、数组存储的元素必须是同一种类型。集合存储的对象可以是不同数据类型。
2.2 各种集合判断元素是否存在的方法:
1、ArrayList:equals2、HashSet:hashCode和equals
3、TreeSet:compareTo或自定义的compare
2.3使用集合的技巧:
1、Array就是数组结构,有角标,查询速度很快。2、link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
3、hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
4、tree就是二叉树,就要想到排序,就想要用到比较。
比较的两种方式:
一个是Comparable:覆盖compareTo方法;
一个是Comparator:覆盖compare方法。
LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。
2.4 集合什么时候用?
当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。保证唯一,就用Set。不保证唯一,就用List。
2.5 Collection和Collections
Collection是java.util下的一个借口,实现它的是相应的List和Set集合。Collections是java.util下的一个类,其中都是静态方法。实现了对集合的查找、排序、替换、线程安全化等操作。
2.6 集合和数组怎么转换
1、数组转集合:Arrays.asList()String s = {"abc","def","ghi"};
List<String> l = Arrays.asList(s);
2、集合变数组:Collection接口中的toArray()