Day21

把昨天的3、4题通过面向百度编程,做出来了。坚持了21天的学习,每天基本都有收获,感觉自己逐渐对Java有一定的了解了,开始用生锈的大脑记东西了。加油OVO

Day21

 

栈是后进先出(一叠书),队列是先进先出(超市排队买东西)。

 

 

今日小问题

1.Map存储数据的特点是什么?并指明key、value、entry存储数据的特点。

双列数据,存储key-value对数据。

key:无序的,不可重复的。--->Set存储

value:无序的,可重复的。--->Collections存储。

key-value :无序的、不可重复的 --->Set存储。

 

2. 描述HashMap的底层实现原理(jdk8版)

有数组,链表,红黑树。

 

3.Map中常用实现类有哪些?各自有什么特点?

HashMap:Map的主要实现类。线程不安全,效率高,可以存储null的key和value。

--------LinkedHashMap:保证在遍历Map时,能按添加的存储数据的顺序实现遍历。

原因:在原有的HashMap的基础上多了一对指针,可以指向前一个和后一个元素。对于频繁的遍历操作 LinkedHashMap效率高于HashMap

TreeMap:保证按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序或定制排序,底层使用红黑树。

Hashtable : 作为古老的实现类,线程安全,效率低,不能存储null的key和value

--------Properties:常用来处理配置文件。key和value都是String类型。

4. 如何遍历Map中key-value对,代码实现。

public class test {
   @Test
   public void test1(){
       HashMap map =new HashMap();
       map.put("aa",11);
       map.put("bb",22);
       map.put("cc",33);
       Set set1 =map.keySet();
       Iterator iterator = set1.iterator();
       while(iterator.hasNext()){
           Object key = iterator.next();
           Object value = map.get(key);
           System.out.println(key +""+value);
      }
  }
}

 

 

5. Collecion 和Collections区别

Collection是一个接口,

Collections是一个工具类,操作collction和map的工具类

 

面试题:负载因子值的大小,对HashMap有什么影响

 

负载因子的大小决定了HashMap的数据密度。

负载因子越大密度越大,发生碰撞的几率越高,数组中的链表越容易长,造成查询或插入时的比较次数增多,性能会下降。

负载因子越小,就越容易触发扩容,数据密度也越小,意味着发生碰撞的几率越小,数组中的链表也就越短,查询和插入时比较的次数也越小,性能会更高。但是会浪费一定的内容空间。而且经常扩容也会影响性能,建议初始化预设大一点的空间。

按照其他语言的参考及研究经验,会考虑将负载因子设置为0.7~0.75,此时平均检索长度接近于常数。

 

泛型

 

//这里继承了Order<Integer>,所以SubOrder不用定义泛型了。这里的SubOrder就是个普通类了。不是泛型类。
public class SubOrder extends Order<Integer>{
}

区别:👆 👇。

 //SubOrder1<T>:仍然是泛型类。
public class SubOrder1<T> extends Order<T>{
}

 

package com.sorrymaker.Generics;

import org.junit.Test;

import java.util.*;

/**
* 在集合中使用泛型
* 总结:
*     1.集合接口或集合类在jdk5.0时都修改为带泛型的结构
*     2.在实例化集合类时,可以指明具体的泛型类型。
*     3.指明完后,在集合类或接口中凡事定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化时泛型的类型
*       比如:add(E e)---->实例化后:add(Integer e)
*     4.注意点,泛型的类型必须是类,不能是基本数据类型,需要用到基本数据类型的位置,拿包装类来替换。
*     5.如果实例化时,没有指明泛型的类型,默认类型为java.lang.Object类型。
*
* 如何自定义泛型结构:泛型类、泛型接口:泛型方法。
*
*
*/

public class day01 {
   //在集合中使用泛型之前的情况:以ArrayList为例
   @Test
   public void test1(){
       ArrayList list = new ArrayList();
       list.add(456);
       list.add(123);
       list.add(789);

       //问题一:类型不安全
       //添加数字的时候,可以随意添加数据类型。
       //list.add("tom");
       //这里混进了不安全的数据,不能让list混进其他变量。
       for(Object score:list){
           //问题二:强转时,可能会出现ClassCastException
           int stuScore =(Integer)score;
           System.out.println(stuScore);
      }
  }
   //在集合中使用泛型的情况:
   @Test
   public void test2(){
       //不能时基本数类型,只能用包装后
       ArrayList<Integer> list = new ArrayList<Integer>();
       list.add(456);
       list.add(1223);
       list.add(45);
       //能够在编译时,保证数据的安全,在编译时就会进行类型检查,保证数据的安全
       //list.add("sss");
       //方式一:
       for (Integer score:list){
           //避免的强转操作
           int stuScore =score;
           System.out.println(stuScore);
      }
       //方式二:
       //iterator()方法里面定义了Integer,所以可以这样子。
       Iterator<Integer> iterator = list.iterator();
       while (iterator.hasNext()){
           Integer stuScore = iterator.next();
           System.out.println(stuScore);
      }

  }
   //在集合中使用泛型之前的情况:以HashMap为例
   @Test
   public void test3(){
       Map<String, Integer> map = new HashMap<>();
       map.put("tom",213);
       map.put("bin",315);
       map.put("shy",600);
       //泛型的嵌套
       Set<Map.Entry<String, Integer>> entry = map.entrySet();
       Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
       while (iterator.hasNext()){
           Map.Entry<String, Integer> e = iterator.next();
           String key = e.getKey();
           Integer value = e.getValue();
           System.out.println(key+"---->"+value);

      }
  }
}
posted @ 2021-04-01 21:56  独眼龙  阅读(107)  评论(0)    收藏  举报