treemap

拜托,学妹,别再问我怎么自学 Java 了!和盘托出

旧巷老猫 提交于 2021-01-03 11:38:58
假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白。我想自学 Java,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习状态当中,并且每天的学习时间至少在 12 个小时以上。 即便是这样,我敢肯定,找到的工作肯定不会太好,勉强能够维持生活吧,毕竟是零基础入门啊。 如果想更进一步,真正成为一名不可或缺的高级 Java 工程师,时间需要更久,两年、三年、五年,直到秃的那天。 想着想着,我就觉得有必要为那一天做点准备,以备不时之需。 (无中生妹。。。。。。) 01、第一个阶段,环境和工具准备 准备一台电脑,要能联网 下载、安装 JDK,配置 Java 开发环境 下载、配置 Maven 下载、安装 IntelliJ IDEA 准备一个 GitHub 仓库(或者码云),管理 Java 源代码 Java 是一门计算机编程语言,学它的话,连台电脑都没有,学个屁。我有个亲戚家的孩子想学编程,就只看书,家里连台电脑都不配,说什么“先打好理论基础,再实操”,我真的是有点醉。 有了电脑,还得联网,自学的过程中肯定会遇到很多问题,遇到问题的时候先问搜索引擎,推荐谷歌和必应;实在没有答案的话,也可以来找我,申请加入技术交流群,问问群里面的大佬们。 既然要学 Java,JDK 是必须要先安装的,否则 Java 程序就没法编译和执行

JAVA集合—Collection

[亡魂溺海] 提交于 2020-12-26 00:59:21
Collection接口 接口: 是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象, 内部定义了操作方法。 实现(类): 是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。 算法: 是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。 Collection实现类(可用类) LinkedList 该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构, ArrayList 该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。 HashSet 该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。 TreeSet 该类实现了Set接口,可以实现排序等功能。 HashMap HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 该类实现了Map接口,根据键的HashCode值存储数据

Java 中 Comparable 和 Comparator 比较

坚强是说给别人听的谎言 提交于 2020-12-25 17:49:34
本文,先介绍Comparable 和Comparator两个接口,以及它们的差异;接着,通过示例,对它们的使用方法进行说明。 Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。 此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。 Comparable 定义 Comparable 接口仅仅只包括一个函数,它的定义如下: package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T o); } 说明: 假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。 Comparator 简介 Comparator 是比较器接口。

JAVA自学笔记18

耗尽温柔 提交于 2020-12-19 08:03:29
JAVA自学笔记18 1、Map接口: 1)功能: 2) Map<String,String>m=new HashMap<String,String>(); //添加元素,元素无序 System.out.println( "map.put(" cc "," coco "));//null //替换键值,返回该键的上一个值,若键不存在,返回null System.out.println(map); //cc=coco,左边是键,右边是值 //map.clear();//清除所有元素 //System.out.printn(map.remove("cc"));//coco。若键存在,则删除该键,返回该键的键值。若不存在,返回null System.out.println(map.containsKey( "cc" ));true. //集合存在该键,则返回true。若不在,则返回false System.out.println(map.containsKey(map.isEmpty())); //集合为空,则返回false System.out.println(map.containsKey(map.size); //返回集合中键的数目 //获取功能 System.out.println((map.get(cc)); //coco。将获取该键的键值,若键不存在,将返回null Set

写代码有这16个好习惯,可以减少80%非业务的bug

混江龙づ霸主 提交于 2020-12-16 15:28:00
前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ github地址,感谢每颗star ❝ https://github.com/whx123/JavaHome ❞ 公众号: 「捡田螺的小男孩」 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误哦~ 所以,如果你的需求是在原来接口上修改,,尤其这个接口是对外提供服务的话,一定要考虑接口兼容

写代码有这16个好习惯,可以减少80%非业务的bug

99封情书 提交于 2020-12-16 15:27:30
前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误哦~ 所以,如果你的需求是在原来接口上修改,,尤其这个接口是对外提供服务的话,一定要考虑接口兼容。举个例子吧,比如dubbo接口,原本是只接收A,B参数,现在你加了一个参数C,就可以考虑这样处理。 //老接口 void oldService

写代码有这16个好习惯,可以减少80%非业务的bug

梦想与她 提交于 2020-12-16 13:53:50
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨捡田螺的小男孩 来源丨捡田螺的小男孩 前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ github地址,感谢每颗star ❝ https://github.com/whx123/JavaHome ❞ 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的

Java集合框架

守給你的承諾、 提交于 2020-12-16 06:56:30
一、ArrayList与LinkedList的异同 1、都不保证线程安全的 2、底层数据结构不同。ArrayList是数组,LinkedList是双向链表。 3、插入和删除的时间复杂度与元素位置有关。ArrayList在尾部增删时时间复杂度为O(1),在非尾部操作时时间复杂度为O(n-i)。LinkedList增删操作时时间复杂度为O(1)。 4、ArrayList支持快速随机访问(使用get(int index)方法),LinkedList不支持快速随机访问 5、内存空间占用方面。ArrayList造成的空间浪费体现在list列表结尾会预留一定的空间,而LinkList空间花费体现在每个元素要比ArrayList多消耗直接前驱和后驱的空间。 补充:RandomAccess接口 表示实现这个接口的类具有随机访问的功能 二、ArrayList与Vector的区别 1、ArrayList不是线程安全的,Vector所有的方法都是线程安全的。 2、二者的底层数据结构都是数组。当ArrayList空间不够时,默认增长50%,当Vector空间不够时,默认增长一倍。 3、Vector可以设置容量增加的参数,ArrayList不可以。 三、HashMap与HashTable的区别 1、HashMap不是线程安全的,HashTable是线程安全的。 2、效率

Java集合框架中的数据结构

社会主义新天地 提交于 2020-12-15 11:55:17
一、Java集合框架概述   集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。   数组与集合的区别如下:   1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。   2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。   Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。   其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。   上图中淡绿色背景覆盖的是集合体系中常用的实现类,分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等实现类。 二、Java集合常见接口及实现类 Collection接口常见方法

ConcurrentHashMap 1.7/1.8

纵饮孤独 提交于 2020-12-13 10:49:24
https://www.cnblogs.com/study-everyday/p/6430462.html JDK1.7的实现 ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成 每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样 HashEntry大小的计算也是2的N次方(cap <<=1) Segment实现了 ReentrantLock ,也就带有锁的功能, 当执行put操作时,会进行第一次key的hash来定位Segment的位置 这里要进行两次Hash去定位数据的存储位置 计算ConcurrentHashMap的元素大小是一个有趣的问题 第一种方案他会使用不加锁的模式去尝试多次计算ConcurrentHashMap的size,最多三次, 比较前后两次计算的结果,结果一致就认为当前没有元素加入,计算的结果是准确的 第二种方案是如果第一种方案不符合,他就会给每个Segment加上锁,然后计算ConcurrentHashMap的size返回 JDK1.8的实现 直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作 JDK1.8中还能看到Segment的数据结构,但是已经简化了属性, 只是为了兼容旧版本