一、关于java多态

多态的存在有三个前提:

  1. 要有继承关系
  2. 子类要重写父类的方法
  3. 父类引用指向子类对,

二、观察Set中的add源码(扩容)

调试了一下,发现set底层接触到了hashmap,hashmap的扩容方法resize(),每次扩容,都是原来大小的两倍,里头具体的代码没去深究,知道有这么个事儿。

定义初始容量大小(table数组的大小,缺省值为16),定义负载因子(缺省值为0.75)的形式

三、for-each循环set

集合类可以用for-each形式输出整个集合,也可以用Iterator.

for-each注意点:

  1. 要使用for-each语法,必须是数组,或者该类必须实现Iterable接口才可以
  2. foreach循环的内部实现也是依靠Iterator进行实现的
for(T t : Iterable) { .... } 

如果查看编译后的字节码,会发现foreach最终被编译器转为对iterator.next()的调用,这些jdk给隐藏起来了

注意:

  • foreach循环只适用于实现了Iterable<T>接口的对象。由于所有内置Collection类都实现了java.util.Collection接口,已经继承了Iterable,所以为了解决上述问题,可以选择简单地让CustomCollection实现Collection接口或者继承AbstractCollection

四、比较器实现一个Comparator

在idea中代码如下:

 1 public class Test<T> {
 2
 3     public static void main(String[] args){
 4         System.out.println("It's for String");
 5        CompareBoth<String> sg = new CompareBoth<String>();
 6         System.out.println(sg.compare("asd", "asd"));
 7         System.out.println(sg.compare("a", "d"));
 8         System.out.println("It's for Integer");
 9         CompareBoth<Integer> in = new CompareBoth<Integer>();
10         System.out.println(in.compare(1,2));
11         System.out.println(in.compare(1,1));
12         System.out.println(in.compare(2,1));
13     }
14
15     private static class CompareBoth<T> implements Comparator<T>{
16
17         public int compare(T o1, T o2) {
18             if (o1 instanceof String){
19                 if(o1.equals(o2))return 0;
20             }
21             if (o1 instanceof Integer){
22                 if (((Integer) o1).intValue()==((Integer)o2).intValue())return 0;//int a = A.valueOf()可以将Integer的A转换成int23                 if ((Integer)o1>(Integer) o2)return 1;
24             }
25             return -1;
26         }
27     }
28 }

五、线性表概念

首先补充一个概念,集合分为:1、规则集(Set) 2、线性表(List)3、队列(queue)

线性表:线性表主要由顺序表示或链式表示。

  • ArrayList是通过数组实现的顺序存储线性表
  • LinkedList是通过链表实现的链式存储线性表。

六、Entry

Entry是Map中用来保存一个键值对的,而Map实际上就是多个Entry的集合,Entry是Map实现类的内部类。

Entry是为了输出的方便,一般情况下,要输出Map中的key 和 value 是先得到key的集合,然后再迭代(循环)由每个key得到每个value,而Entry可以一次性获得这两个值

其中的主要方法有:

  1. entrySet():返回一个包含图中条目的规则集,也就是获得了Map所有的Key与value的集合。Set<Map.Entry<K,V>>
  2. keySet():返回包含图中键值的一个规则集,也就是获得key的集合。Set<K>
  3. values():返回包含图中值的集合。Collection<V>

代码部分:

 1 public class Test {
 2     public static void main(String[] args){
 3         Map<String,Integer> map = new HashMap<>();
 4         map.put("小明",1);
 5         map.put("小丽",2);
 6         map.put("小张",3);
 7         Set<Map.Entry<String,Integer>> entry = map.entrySet();
 8         Iterator<Map.Entry<String,Integer>> it = entry.iterator();
 9         while(it.hasNext()){
10             Map.Entry<String,Integer> e= it.next();                      System.out.println("name:"+e.getKey()+";value:"+e.getValue());
11         }
12 //获取键值来获取Value
13         Set<String> names = map.keySet();
14         Iterator itName = names.iterator();
15         while(itName.hasNext()){
16             String v = (String) itName.next();
17             System.out.println("name:"+v+";value:"+map.get(v));
18         }
19 //直接获取values值的集合
20         Collection<Integer> values = map.values();
21         Iterator itValue = values.iterator();
22         while(itValue.hasNext()){
23             System.out.println(itValue.next());
24         }
25     }
26 }

注意点:

entrySet和KeySet方法返回的都是一个Set的集合

values()返回的是一个Collection的集合

Iterator<Map.Entry<String,Integer>> it = entry.iterator();必须指定迭代器的泛型,不然会出现如下的提示

Incompatible types.

Required:java.util.Map.Entry<java.lang.String,java.lang.Integer>

Found:java.lang.Object>

这个情况可以使用强制类型转换,不过最好还是在前面迭代器就定义好泛型。

参考链接:http://kingdelee.iteye.com/blog/1580463

七、去除正则表达式中的空格

\s表示的是空格,那么可以这样写

 1 public class Test<T> {
 2     public static void main(String[] args){
 3        String regex = "\\s+";
 4        String str = " asd asd asdas   asd asd   sad ";
 5        str = str.trim();//去掉开头结尾空格
 6        String str1 = str.replaceAll(regex," ");//将字符串中多个空格转为一个空格
 7        String str2 = str.replaceAll(regex,"");//将字符串中空格删除
 8        System.out.println(str1);
 9        System.out.println(str2);
10     }
11 }

八、优先队列PriorityQueue

优先队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。PriorityQueue是从JDK1.5开始提供的新的数据结构接口。

如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列。

如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口。

PriorityQueue有四种构造方法

  1. 无参数构造方法PriorityQueue():创建一个初始容量为11的默认优先队列
  2. PriorityQueue(initialCapacity:int):创建一个带指定容量的默认优先队列
  3. PriorityQueue(c:Collection<? extends E>):创建一个带指定集合的优先队列
  4. PriorityQueue(initialCapacity:int,comparator:Comparator<? super E>):创建一个带指定初始容量和比较器的优先队列

今天主要尝试了后两种,第三种的代码如下:

 1 public class Test {
 2     public static void main(String[] args){
 3      Queue<Fruit> queue = new PriorityQueue<>(new Fruit());
 4      queue.offer(new Fruit("小明",0));
 5      queue.offer(new Fruit("小美",3));
 6      queue.offer(new Fruit("小智",2));
 7      queue.offer(new Fruit("小丽",1));
 8      for (Fruit f:queue){
 9          System.out.println(f.getName());
10      }
11     }
12
13     private static class Fruit implements Comparator<Fruit>{
14         private String name;
15         private int priority;
16         public Fruit(){}
17         public Fruit(String name,int priority){
18             this.name = name;
19             this.priority = priority;
20         }
21
22
23         public String getName() {
24             return name;
25         }
26
27         public int getPriority() {
28             return priority;
29         }
30
31         public int compare(Fruit o1, Fruit o2) {
32             int first = o1.getPriority();
33             int last = o2.getPriority();
34             if (first>last){
35                 return 1;
36             }else if (first==last){
37                 return 0;
38             }else {
39                 return -1;
40             }
41         }
42
43     }
44 }

第四种代码是使用匿名内部类自定义一个比较器然后放到priorityQueue中:

 1 Comparator<Fruit> comparator =  new Comparator<Fruit>(){
 2  public int compare(Fruit o1, Fruit o2) {
 3      int numbera = o1.getPopulation();
 4      int numberb = o2.getPopulation();
 5     if(numberb > numbera)
 6    {
 7      return 1;
 8     }
 9      else if(numberb<numbera)
10    {
11        return -1;
12     }
13     else
14    {
15     return 0;
16     }
17 }
    Queue<Fruit> priorityQueue =  new PriorityQueue<Fruit>(11,comparator); 

参考链接:http://blog.csdn.net/hiphopmattshi/article/details/7334487

九、关于Vector

1. Vector & ArrayList

  1. Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
  2. 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

2. Hashtable & HashMap

  • Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。

代码部分:

 1 public class Test {
 2     public static void main(String[] args){
 3      Vector vector = new Vector();
 4      long begin = System.currentTimeMillis();
 5      for (int i = 0;i<100000;i++)
 6          vector.add(i);
 7         System.out.println("Vector花费的时间");
 8         System.out.println(System.currentTimeMillis()-begin);
 9      List list = new ArrayList();
10      long lbegin = System.currentTimeMillis();
11      for (int i = 0;i<100000;i++)
12          list.add(i);
13         System.out.println("ArrayList花费的时间");
14         System.out.println(System.currentTimeMillis()-lbegin);
15     }
16 }

转载于:https://www.cnblogs.com/shigeng/p/8537881.html

基础知识巩固四(问题部分)相关推荐

  1. HTML/CSS基础知识(四)

    WEB标准和W3C的理解与认识 Web标准是一系列标准的集合. 网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior). 对应的标准也分三方面:结 ...

  2. 前端基础知识第四章---CSS

    前言 ❤️ 生活中总有一些惊喜值得期待,只要我们一直保持着热爱 ❤️ 前端基础知识第四章---CSS 一.CSS 第四章 (1)浮动(float) 1.1 传统网页布局的三种方式 1.2 标准流(普通 ...

  3. JAVA基础知识(四)面向对象基础

    文章目录 JAVA基础知识(四)面向对象基础 1. 类 2. 访问权限修饰符 3. `static`修饰符 3.1 静态代码块 4. `new`一个对象 5. 方法 5.1 `this` 5.2 方法 ...

  4. linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)

    以下主要介绍我的***次安装Linux系统遭遇,以及怎么度过这个遭遇的,希望对大家有所帮助.不喜欢的可以略过.以下接<Linux 系统硬件管理的基础知识(三)>. 四.关于存储设备的不同的 ...

  5. 多实例多进程网络编程PHP,php socket网络编程基础知识(四):多进程

    标签:status   传递   windows   返回   修改   队列   _for   响应   关联 说明 php在web编程时是不需要考虑多进程的,但整个php流程是涉及到多进程的,只不 ...

  6. python 四足机器人运动学_【基础知识】四足机器人的站立姿态控制原理

    理解本文所需要掌握的基础知识为:姿态的欧拉角表示方法 变换矩阵的含义与使用 概述 四足机器人运动过程中,身体部分的姿态会不断地发生变化.假如机器人的足端一直保持与地面接触且相对位置不发生变化,此时的身 ...

  7. 计算机基础知识第四章测试,第四章计算机基础知识.ppt

    第四章计算机基础知识.ppt 第四章 计算机基础知识 一.Word的启动与退出 (1)从"开始"菜单启动.选择"开始"→"程序"→" ...

  8. 山东专升本计算机基础知识(四)

    山东专升本计算机基础知识四 微型计算机系统 1.微机的主要性能指标 2.微机主板 1.总线 2.总线标准 3.新一代信息技术 微型计算机系统 1.微机的主要性能指标 ①主频:即时钟频率,是指CPU在单 ...

  9. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息 ...

  10. 信息安全基础知识(四)KDC、公用密钥加密和证书:

    KDC(密钥分发中心)          针对密钥管理问题最流行的解决方案就是公用密钥加密(public key cryptography,PKC).不过也存在一种只使用到目前为止所讨论的工具来解决密 ...

最新文章

  1. 安装zeromq以及zeromq的python示例
  2. asp.net如何在用户关闭浏览器时执行Session_End方法
  3. 【渝粤教育】国家开放大学2019年春季 8042-22T养殖业基础 参考试题
  4. 转载:tcpdump抓包和Wireshark解包
  5. 13个非常实用的JavaScript小技巧
  6. waf 防火墙限制_Web攻击分类有哪些?防火墙WAF可以抵御哪些攻击?
  7. sql 二进制文件的导入导出
  8. 【MATLAB统计分析与应用100例】案例017:matlab读取Excel数据,进行变量系统聚类分析
  9. 中国电信物联网正式平台设置订阅地址
  10. 堆密度测定的意义_什么叫真密度_真密度的测定_真密度和表观密度、堆积密度-仪器网...
  11. 阿里云服务器申请免费ssl证书
  12. 移动开发需要关心的热门技术(1)
  13. 校内校园网络技术标书(三少原创)
  14. 计算机如何调成音乐,如何调出适用于我的均衡器设置?
  15. bch verilog代码_基于FPGA的多进制BCH编码
  16. 虚幻4地形怎么增加层_虚幻周报20200407 | 在家也要好好工作呀~
  17. Python进程池apply_async的callback函数不执行的解决方案
  18. 这次生日我想写点什么
  19. shell逐行读取excel并执行sql
  20. 微信的url服务器接收微信信息的配置

热门文章

  1. Android WebView 致安卓应用闪退,mPaaS 助你规避这波 Bug
  2. 同学,你有一份来自支付宝AI学姐的面试锦囊待查收
  3. 小姐姐亲身体验:在阿里数据库科研团队实习是种怎样的体验?
  4. 如何解决分布式系统中的“幽灵复现”?
  5. 如何提升代码可读性?阿里发布16条设计规约
  6. Riot美术师经验分享:好设计是改出来的
  7. 浅谈二次元场景特征和绘制手法
  8. 9个让2D游戏创作更轻松的工具
  9. 王者荣耀最难选择题2选1,刺痛cos虞姬,还是北极星露脸?我选一
  10. 真正的云主机到底是什么样的?