Entry

Java 集合系列之三:Set基本操作

ⅰ亾dé卋堺 提交于 2021-02-01 01:45:21
1. Java Set 1. Java Set 重要观点 Java Set接口是Java Collections Framework的成员。 Set不允许出现重复元素-----------无重复 Set不保证集合中元素的顺序---------无序 Set允许包含值为null的元素,但最多只能有一个null元素。 Set支持泛型(类型的参数化),我们应尽可能使用它。将Generics与List一起使用将在运行时避免ClassCastException。 先去看Map,Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,LinkedHashSet是通过LinkedHashMap来实现的)。 2. Java Set类图 Java Set接口扩展了Collection接口。Collection接口 externs Iterable接口。 一些最常用的Set实现类是HashSet,LinkedHashSet,TreeSet,SortedSet,CopyOnWriteArraySet。 AbstractSet提供了Set接口的骨干实现,以减少实现List的工作量。 3. Java Set 方法 boolean add(E e) // 如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。 boolean

Java常用工具——java集合

烈酒焚心 提交于 2021-01-31 23:25:17
一、ArrayList package com.imooc.set; import java.util.ArrayList; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { // 用ArrayList存储编程语言的名称,并输出。 // 名称包括”Java”、”C”、”C++“、”Go”和”Swift” List list= new ArrayList(); list.add( "Java" ); list.add( "C" ); list.add( "C++" ); list.add( "Go" ); list.add( "Swift" ); // 输出列表中元素的个数 System.out.println("列表中元素的个数:"+ list.size()); // 遍历输出所有编程语言 System.out.println("==========================" ); for ( int i=0;i<list.size();i++ ) { System.out.print(list.get(i) +" " ); } System.out.println(); // 移除列表中的C++ System.out.println("=

TreeMap详解

*爱你&永不变心* 提交于 2021-01-30 13:36:55
原文链接 http://zhhll.icu/2021/01/14/java%E5%9F%BA%E7%A1%80/%E9%9B%86%E5%90%88/TreeMap%E8%AF%A6%E8%A7%A3/ TreeMap详解 TreeMap是Map接口的一个实现类,底层基于红黑树的实现 从继承机构可以看到TreeMap除了继承了AbstractMap类,还实现了NavigableMap接口,而NavigableMap接口是继承自SortedMap接口的,所以TreeMap是可以进行排序的 关键变量 // 比较器,根据比较器来决定TreeMap的排序,如果为空,按照key做自然排序(最小的在根节点) private final Comparator<? super K> comparator; // 根节点 private transient Entry<K,V> root; /** * The number of entries in the tree * 树的大小 */ private transient int size = 0; /** * The number of structural modifications to the tree. * 修改次数 */ private transient int modCount = 0; // Entry为TreeMap的内部类

Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同

风流意气都作罢 提交于 2021-01-30 10:54:14
《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。 这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳。 本文参考 http://cmsblogs.com/?p=599 HashSet 定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。其中AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。 ==Set接口是一种不包括重复元素的Collection,它维持它自己的内部排序,所以随机访问没有任何意义。== 本文基于1

java的foreach(增强for循环)

拜拜、爱过 提交于 2021-01-29 09:15:45
今天接触了一个以前看到过但完全朦胧的东西->那就是foreach循环,网上查阅后得到语法如下 for(元素类型 元素名称 : 遍历数组(集合)(或者能进行迭代的)){   语句 } 由于for括号内没有逻辑表达式,所以它适用于循环次数不知道的情况下会使得代码更加简便(暂时这么理解,具体与for循环之间的效率的区别未知) 这个增强的for循环,对map类的键值对,也可以使用,例子如下: 1 public class Test{ 2 public static void main(String[] args) { 3 Map<String,Integer> testmap = new LinkedHashMap<String, Integer> (); 4 // 这里的Integer不能替换为int(似乎这里的类型定义不能使用基本类型,只能使用基本类型的包装类) 5 testmap.put("s1",1 ); 6 testmap.put("s2",2 ); 7 testmap.put("s3",3 ); 8 // Map.Entry<String,Integer>可以算是一个类型,表明这个键值对集合里键值对的类型 9 for (Map.Entry<String,Integer> s : testmap.entrySet()){ 10 System.out.println("'" + s

Java中的锁分类

≯℡__Kan透↙ 提交于 2021-01-28 04:00:55
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于Synchronized而言,也是一种非公平锁。由于其并不像ReentrantLock是通过AQS的来实现线程调度,所以并没有任何办法使其变成公平锁。 可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。 对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。 对于Synchronized而言,也是一个可重入锁

ConcurrentMap原理详解

流过昼夜 提交于 2021-01-27 09:53:41
ConcurrentMap原理详解 jdk1.8 数据结构 数组+链表+红黑树 Node<K,V>{} static class Node<K,V> implements Entry<K,V> { final int hash; final K key; volatile V val; volatile Node<K,V> next; 如何线程安全 数组桶值设置和更新使用CAS算法 tabAt(Node<K,V>[] tab, int i) casTabAt(Node<K,V>[] tab, int i, Node<K,V> c, Node<K,V> v) setTabAt(Node<K,V>[] tab, int i, Node<K,V> v) 针对链表和树更新使用Synchronize 设置putVal(K key, V value, boolean onlyIfAbsent) 1、数组为空,先初始化 2、tabAt获取桶位置元素,如果为空,则casTabAt(),期望值为null,新值为新节点 3、桶位置如果存在数据,说明hash冲突了,如果当前节点hash为MOVED说明在扩容,则当前线程辅助扩容 4、如果hash值>=0,说明是链表结构 4.1循环覆盖链表所有key一样节点 4.2循环至链表尾结点时(next为null)则追加到尾结点 5

Python-GUI|Tkinter模块

谁说我不能喝 提交于 2021-01-26 08:19:14
01 Tkinter Tkinter模块是 Python 的标准Tk GUI工具包的接口,它并不是必须掌握的,但是 掌握一个Python的标准图形库还是非常有意思的一件事 。 它可以跨平台运行在 Windows,Linux和Mac等系统上。 这篇文章不会介绍如何灵活地运用Tkinter,而是阐述Tkinter这个库包括什么,它能干什么! 02 第一个Tk-GUI from tkinter import * root=Tk() root.title('first tk gui') root.geometry('500x200') x = Label(root,text='Hello',bg='green',font=('Arial',12),width=15,height=2) x.pack() x.mainloop() 首先导入tkinter 模块,这个模块包括了所需要的所有的类和函数 然后,需要创建一个(根)窗口,它是一个普通的窗口,带有标题栏、最小化按钮、最大化按钮等,即:root = Tk() ,调用title接口,geometry分别设置根窗口的标题,大小。 然后我们就可以在该窗口上创建一个Label,即贴一个标签,这个Label可以显示文本、图标、图像等等。我们这里使用text来指定要显示的文本,而第一个参数root,表明x的父控件是root

Python模块:tkinter

情到浓时终转凉″ 提交于 2021-01-26 08:09:05
最近我同学在做一个聊天程序,服务器已经全部完成了,客户端也已经使用CMD版本的进行过测试了,为了做的好一点,需要弄一个图形用户界面的客户端,Python编写图形界面的模块有好多,这里使用的是Python内置的模块——tkinter。 首先来大概看一下tkinter的描述,依旧是先导入然后使用使用help查看,如图所示。 我稍微翻译一下DESCRIPTION下面那几段。 Tkinter模块提供允许显示,位置安排和控制控件的类。顶层控件是Tk和Toplevel两个类,其他控件是框架、标签、条目、文本、画布、按钮、单选按钮、检查按钮、缩放、列表框、滚动条、选项菜单、旋转框标签框架和窗格窗口。 控件的属性用关键字参数来指定。关键字参数与Tk下的相应资源同名。 通过Place,Pack,Grid三个 几何管理器 的 某一个 类,控件被放置。这些管理器可以通过在每一个控件里都有的place,pack,grid三个方法被调用。 行为通过资源(关键字参数)或者方法被绑定到事件中。 下面是一个例子,这个例子太简单了,我就不做解释了,我们跳到下面PACKAGE CONTENTS,如图所示。 通过这个大家应该可以发现,更准确的说,tkinter不是一个模块,而是一个包,这个包下面还有好多个模块和一个包。有些人就觉得见鬼了,既然tkinter是包,包就是文件夹,在其中必须有一个__init__.py

如何定量分析前端主流的构建工具(Webpack/Rollup/Parcel/Browserify+Gulp)?

断了今生、忘了曾经 提交于 2021-01-25 05:40:59
Mom, I Can't Learn Anymore(《妈妈,我学不动了!》) 是一系列关于计算机领域程序最新时事的文章(偏向于前端领域),在该系列会从不同的角度讨论领域内的实践和进展。 前言 注意,我期望你带着问题看全文,我们是如何定量分析构建工具?衍生的问题是,学习这类知识的核心是什么? 周日在家看 web.dev 的 2020 三天 live,发现不少有意思的东西,其中有一项是关于 building tool 的,也就是我们常说的前端构建工具,当天的主播是 Jake Archibald(chrome team 成员,个人非常喜欢的技术专家)。 其实,刚开始了解到 tooling.report 来自于我非常喜欢的一位开源作者 Evan You(Vuejs 的作者)的推特: 这篇简单的推文引起了我的兴趣,尽管业内存在各种分析前端构建工具的文章,但这些文章往往质量参差不齐,大部分分析不够全面,偏向于定性分析,有些甚至加入了个人的主观臆想。 因此,为什么不对各大主流的构建工具进行定量分析它们呢(利用类似于 benchmark 的测试)? 这很明显是一个对普通开发者非常有用的需求,但到现在还缺乏相对应权威的东西可能是因为: 前端发展到现在,各大构建工具已经非常的复杂,业界之前有一句笑话,“现在是面向 webpack 配置编程”。同时精通所有的构建工具是需要很大的耐心和技术水平的