1、HashMap:依赖于Hashcode和equals方法,保证键值的唯一性;
当自定义对象作为键值时,不保证唯一性时,重写hashCode()和equals()方法。
LinkedHashMap:依赖于Hashcode和链接链表,保证元素的唯一性和有序性。
TreeMap基于红黑树结构的Map接口的实现
掌握根据条件通过比较器排序(常用)或者自然排序从大到小或者从小到大排序。
2、
面试题、HashMap集合和Hashtable的区别?
共同点:都是map接口的实现类,都是基于哈希表的实现类
HashMap集合线程不安全的类,不同步,执行效率高(允许键和值是null的)
Hashtable集合线程安全的类,同步,执行效率低(不允许有null键和null值)
线程安全的类:
StringBuffer :字符串缓冲区
Vector :List集合
Hashtable :Map集合的
3、掌握HashMap的嵌套和HashMap与ArrayList的嵌套
掌握用HashMap和数组结合遍历字符串并计数
代码如下:
package liuxiaofan; import java.util.HashMap; import java.util.Scanner; import java.util.Set; /** *需求: * 字符串:比如: aaaaabbbbcccddddee ,最终控制台要出现的结果:a(5)b(4)c(3)d(3)e(2) *思路: * 1)改进:键盘录入一个字符串 * 2)创建一个HashMap集合key:Character,Value:Integer * 3)将录入的字符串转换成字符数组 * 4)遍历可以获取每一个字符 * 5)将元素添加到对应的HashMap集合中 * 使用的put(key,value): 通过判断值是否null ,如果是null表示第一次存储 * 集合对象.put(ch,1) ; * 否则,不是null * Integer那个值++; * 集合对象.put(ch,变量Integer值) ; * 6)遍历HashMap集合即可 */ public class Test { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); //接收数据 System.out.println("请输入一个字符串:"); String line = sc.nextLine() ; //创建一个HashMap集合来存储对应的字符和值 HashMap<Character, Integer> hm = new HashMap<Character,Integer>() ; //将字符串转换成字符串 char[] chs = line.toCharArray() ; //遍历字符数组,获取到每一个字符 for(char ch:chs) { //获取到每一个字符 Integer i = hm.get(ch) ; //肯定要把值获取到 System.out.println(i); //通过put方法添加元素,看这个值是否为null if(i==null) { //第一次存储,元素在第一次存储时显示为null,第二次存储时,输出显示上一个元素 hm.put(ch, 1); }else { //不是null,存储了多次 i ++ ; hm.put(ch, i) ; } } //创建一个字符串缓冲区对象 StringBuilder sb = new StringBuilder() ; //遍历HashMap集合 Set<Character> set = hm.keySet() ; for(Character key :set) { //获取值 Integer value = hm.get(key) ; System.out.println(value); sb.append(key).append("(").append(value).append(")") ;//运用缓冲区拼接字符串 } String str = sb.toString() ; System.out.println("str:"+str); } }
4、Collection和Collections的区别:
Collection:顶层次单列集合的根接口,它是一个集合,是一个接口
Collections:是针对集合操作的工具类,有一些功能:随机置换,集合里面的二分查找,将集合的元素进行反转
public static <T> int binarySearch(List<T> list, T key):集合的二分查找--> 针对的集合元素必须有序
static T max(Collection coll):获取集合中的最大值
public static void reverse(List<?> list):将集合中的元素顺序反转
public static void shuffle(List<?> list):将集合中的元素打乱(打乱牌,玩斗地主)
public static void sort(List<T> list)
Collections:是针对集合操作的工具类,有一些功能:随机置换,集合里面的二分查找,将集合的元素进行反转
public static <T> int binarySearch(List<T> list, T key):集合的二分查找--> 针对的集合元素必须有序
static T max(Collection coll):获取集合中的最大值
public static void reverse(List<?> list):将集合中的元素顺序反转
public static void shuffle(List<?> list):将集合中的元素打乱(打乱牌,玩斗地主)
public static void sort(List<T> list)
二1、异常概述(Exception)
throwable 类是 Java 语言中所有错误或异常的超类
Throwable : error、 exception
Throwable : error、 exception
error: 属于严重问题,内存溢出了
----->
不抗力因素
exception 编译时期异常:只要出现的不是运行时期异常,统称为编译时期 编译时期异常:开发者必须处理!
运行时期异常:RuntimeException,编译通过了,但是开发者代码不严谨(NullPointerExceptino等等...)
2、异常的处理分为两种:
(1)try...catch...finally (标准格式) :捕获异常
(2)throws ... 抛出异常
(1)try...catch...finally (标准格式) :捕获异常
(2)throws ... 抛出异常
变形格式:try...catch... try...catch...catch.. catch....
try{
一些 包含了可能会出现问题的代码
try里面的代码越少越好
}catch(异常类 异常类对象){
try出现异常了,描述的异常刚好就是catch的异常类,就会执行catch里面代码
//处理异常
}
3、处理多个异常
try{
可能出现问题的代码
}catch(异常类 对象名){
处理异常的代码
}
try{
可能出现问题的代码
}catch(异常类 对象名){
处理异常的代码
}
可能出现问题的代码
}catch(异常类名1 对象名1){
//异常处理
}catch(异常类名2 对象名2(){
//异常处理
}
//异常处理
}catch(异常类名2 对象名2(){
//异常处理
}
Jdk7以后出现另一种方式处理多个异常
try{
//可能出现问题的代码;
}catch(异常类名1 | 异常类名2 |... 对象名){
// 处理异常
}
try{
//可能出现问题的代码;
}catch(异常类名1 | 异常类名2 |... 对象名){
// 处理异常
}
4、编译时期异常和运行时期异常的区别?
编译时期:开发者必须进行显示处理,不处理,编译不能通过,
运行时期异常:无需进行显示处理,可以像编译时期一样进行处理
处理异常的第二种方式:使用throws 抛出异常 (跟在方法的后面)
xxx 返回值 方法名() throws 异常类名{
}
运行时期异常:无需进行显示处理,可以像编译时期一样进行处理
处理异常的第二种方式:使用throws 抛出异常 (跟在方法的后面)
xxx 返回值 方法名() throws 异常类名{
}
5、标准格式 try{ ... }catch(异常类 对象){ // 异常处理 } 执行try里面的代码 ,如果出现了问题,它会通过代码的问题创建一个异常对 象,然后通过异常对象和catch里面的异常类是否一致
如果一致的情况,就会出现catch里面的代码,执行Throwable里面的方法
public String getMessage() :消息字符串
public String toString(): 异常的简短描述 ": ":由冒号和空格组成
public void printStackTrace():返回值void 直接调用, 包含了消息字符串,还有": "
信息描述,具体出现异常的代码定位以及定位的源码上
如果一致的情况,就会出现catch里面的代码,执行Throwable里面的方法
public String getMessage() :消息字符串
public String toString(): 异常的简短描述 ": ":由冒号和空格组成
public void printStackTrace():返回值void 直接调用, 包含了消息字符串,还有": "
信息描述,具体出现异常的代码定位以及定位的源码上
6、final,finally,finalize的区别?
final :可以修饰类,该类不能被继承;可以修饰变量,该变量是常量;可以修饰成员方法,该方法重写
finalize : gc():运行垃圾回收器,实际是调用finalize()方法,和垃圾回收器有关系
finally : 在io,数据库中以及后面对数据库操作(DBUtuls/c3p0/Hibernate/MyBatis)里面中释放资源的
finalize : gc():运行垃圾回收器,实际是调用finalize()方法,和垃圾回收器有关系
finally : 在io,数据库中以及后面对数据库操作(DBUtuls/c3p0/Hibernate/MyBatis)里面中释放资源的
finally中代码:只有在一种情况下,它不会执行,在指向finally语句之前,jvm退出了
7、throw:表示也是抛出异常,抛出的一个异常对象 (throw new 异常类名() :匿名对象的方式)
面试题 :
throws和throw的区别?
throws:也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间逗号开
举例:
public void show() throws IoException,ClassNotFoundException{...}
在方法上抛出,由调用者处理
它表示抛出异常的可能性
throw:抛出的一个异常对象
在语句体中抛出的,由语句体进行处理
它表示抛出异常的肯定性
面试题 :
throws和throw的区别?
throws:也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间逗号开
举例:
public void show() throws IoException,ClassNotFoundException{...}
在方法上抛出,由调用者处理
它表示抛出异常的可能性
throw:抛出的一个异常对象
在语句体中抛出的,由语句体进行处理
它表示抛出异常的肯定性
try...catch...finally -----> finally语句体是一定会执行的,除非是Jvm退出了
面试题:
如果catch里面有return语句,finally中的代码还会执行,是在return语句之前执行还是return后执行?
finally中代码是一定会执行的,是在return前
finally中代码是一定会执行的,是在return前
代码如下:
public class FinallyTest { public static void main(String[] args) { System.out.println(getInt()); } private static int getInt() { int a ; try { a = 10 ; System.out.println(a/0); a = 20 ; }catch(Exception e) { a= 30 ; return a ; /** * try的代码出现问题了,执行catch中的语句,30赋值a, * return 30(已经形成了一个回路径)finally代码一定会执行(除非Jvm) a = 40 ,在fianlly外面 * 有return a: a记录回路径的那个a,返回30 */ }finally { //除非jvm退出了 a = 40 ; } return a;//30 } }
8、如何自定义异常类,两种方式
1)自定义一个类,这个继承自Exception
2)继承RuntimeException
1)自定义一个类,这个继承自Exception
2)继承RuntimeException
子类继承父类的时候的注意事项
1)子类重写父类的方法的时候,子类的方法的抛出的异常必须要么是父类的方法异常一样,要么是父类方法异常的子类
2)子类重写父类方法的时候,如果父类中的这个方法没有抛出异常,那么子类重写的这个方法也不能抛出异常,只能try...catch