day15--HashMap/HashTree/collections/Exception

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)
二1、异常概述(Exception)
   throwable 类是 Java 语言中所有错误或异常的超类
   Throwable : error、 exception
   error: 属于严重问题,内存溢出了 -----> 不抗力因素

  exception        编译时期异常:只要出现的不是运行时期异常,统称为编译时期       编译时期异常:开发者必须处理!
                         运行时期异常:RuntimeException,编译通过了,但是开发者代码不严谨(NullPointerExceptino等等...)
2、异常的处理分为两种:
(1)try...catch...finally (标准格式) :捕获异常
(2)throws ...  抛出异常

 变形格式:try...catch...                           try...catch...catch..                           catch....
 
 try{
    一些 包含了可能会出现问题的代码
    try里面的代码越少越好
   }catch(异常类 异常类对象){
     try出现异常了,描述的异常刚好就是catch的异常类,就会执行catch里面代码
    //处理异常
  }


3、处理多个异常
  try{
       可能出现问题的代码
   }catch(异常类 对象名){
        处理异常的代码
   }
 
try{
   可能出现问题的代码
    }catch(异常类名1 对象名1){
      //异常处理
   }catch(异常类名2 对象名2(){
    //异常处理
  }

Jdk7以后出现另一种方式处理多个异常  
  try{
       //可能出现问题的代码;
   }catch(异常类名1 | 异常类名2 |... 对象名){
      // 处理异常
  }

4、编译时期异常和运行时期异常的区别?

     编译时期:开发者必须进行显示处理,不处理,编译不能通过,
     运行时期异常:无需进行显示处理,可以像编译时期一样进行处理
     处理异常的第二种方式:使用throws 抛出异常 (跟在方法的后面)
         xxx 返回值  方法名() throws  异常类名{
           }
5、标准格式 try{ ... }catch(异常类 对象){ // 异常处理 } 执行try里面的代码 ,如果出现了问题,它会通过代码的问题创建一个异常对       象,然后通过异常对象和catch里面的异常类是否一致
    如果一致的情况,就会出现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)里面中释放资源的
              finally中代码:只有在一种情况下,它不会执行,在指向finally语句之前,jvm退出了

7、throw:表示也是抛出异常,抛出的一个异常对象 (throw new 异常类名() :匿名对象的方式)
 
  面试题 :
   throws和throw的区别?
   throws:也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间逗号开
     举例:
         public void show() throws IoException,ClassNotFoundException{...}
         在方法上抛出,由调用者处理
         它表示抛出异常的可能性
         throw:抛出的一个异常对象
         在语句体中抛出的,由语句体进行处理
         它表示抛出异常的肯定性

 try...catch...finally   ----->  finally语句体是一定会执行的,除非是Jvm退出了


面试题:
   如果catch里面有return语句,finally中的代码还会执行,是在return语句之前执行还是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

9、异常中的注意事项:
   子类继承父类的时候的注意事项
    1)子类重写父类的方法的时候,子类的方法的抛出的异常必须要么是父类的方法异常一样,要么是父类方法异常的子类
    2)子类重写父类方法的时候,如果父类中的这个方法没有抛出异常,那么子类重写的这个方法也不能抛出异常,只能try...catch

猜你喜欢

转载自blog.csdn.net/liuxiaofan_/article/details/80320042
今日推荐