黑马程序员--Java--重要知识点1

来源:互联网 发布:电脑杀毒软件知乎 编辑:程序博客网 时间:2024/06/06 12:40

------<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:equals
  2、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()
0 0
原创粉丝点击