天道酬勤,学无止境

3-Java类集总结

Java的类集

目的

普通的对象数组的最大问题在于数组中的元素个数是固定的(集合表示一组对象,一个对象即一个元素 ),不能动态的扩充大小。最早可以通过链表实现一个动态对象数组,但是太过于复杂,故java中为了方便用户操作各个数据结构,引入了类集的概念(JDK1.2 后引入)——可以把类集称为 java对数据结构的实现
类集中最大的几个操作接口:Collection(单值)、Map(键/值对)、Iterator(迭代)。所有类集操作的接口或类都在java.util 包。
在这里插入图片描述
集合框架 是一个用来代表和操纵集合的统一架构。所有的集合框架都包含:
1)接口:是代表集合的 抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
2)实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的 数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
3)算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序等 。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

集合

1、Collection(接口)

Collection接口是在整个Java类集中 保存单值 的最大操作父接口(集合层次结构中的 根接口),每次操作时只能保存一个对象的数据。

该接口为了使类集操作更加安全,实现了泛型技术(JDK 1.5后)。Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。后为了清楚区分集合中是否允许有重复元素,推广List(值不唯一)与Set(值唯一)的使用,这是其两个重要子接口。

本接口共定义15个方法,其子类或子接口将全部继承这些方法。方法:
在这里插入图片描述
这些方法在实现类使用时可能会引起以下的异常:

  1. UnsupportedOperationException - 如果此集合不支持该操作 ,如add、remove
  2. ClassCastException -如add(E e)等,指定元素的类阻止将其添加到此集合中;如remove​(Object o)等,指定元素一个或多个元素的类型与此集合不兼容
  3. NullPointerException -如果指定的元素(集合、数组)为null(集合包含一个或多个null元素,或集合、数组为null)且此collection不允许null元素
  4. IllegalArgumentException -如果元素的某些属性阻止将其添加到此集合中
  5. IllegalStateException - 如果由于插入限制而无法在此时添加元素
  6. ArrayStoreException - 如toArray(),此集合中任何元素的运行时类型不能分配给指定数组的 runtime component type

1.1 List(接口)——内容可重复

List 接口存储一组 不唯一有序(按插入顺序)的对象。允许有相同的元素(通过元素的equals方法比较),所有元素是以一种线性方式进行存储,使用此接口能够精确的控制每个元素插入的位置,能够通过其 索引 (元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,习惯性地会将实现了List接口的对象称为List集合。
此接口上依然使用了泛型技术,对Collection接口来说,有以下扩充方法(有些方法名一样,但参数列表与父接口方法不一样,所以对这些方法来说,是重载而非重写):
在这里插入图片描述

1.1.1 ArrayList(使用率占比:95%)

ArrayList是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList (抽象类,适配器设计模式),并实现了 List 接口。ArrayList 集合数据存储的是数组结构,元素增删慢,查找快,日常开发使用最多的功能为查询数组、遍历数组,所以最常使用。(性能较高,采用 异步处理 ——线程不安全)
一般操作(方法名):增——add、删——remove、改——set、查——get、大小——size

1.1.2 Vector(4%)

该类和ArrayList非常相似,但是该类属于元老级操作类(JDK1.0时就推出其使用),但是 同步处理 的,性能较低,可以用在多线程的情况(线程安全),该类允许设置默认的增长长度,默认扩容方式为原来的2倍。操作类似ArrayList。

1.1.3 LinkedList(1%)

此类继承了 AbstractList,所以是 List 的子类,但是此类也是 Queue 接口的子类,所以当调用add(E e)——增加单值、element()——取当前值、remove()——删除当前值,可能抛出异常
该类为链表操作类,实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,是方便元素添加、删除的集合。LinkedList是一个 双向链表,开发时,该集合也可以作为堆栈、队列结构使用。除了List接口的方法,它提供了大量首尾操作的方法:
在这里插入图片描述
该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。

1.2 Set(接口)——内容不可重复

Set 不保存重复的元素,存储一组 唯一无序 的对象。Set 接口并没有对 Collection 接口进行扩充,具有与 Collection 完全一样的接口,只是行为上不同,基本上还是与 Collection 接口保持一致。因为此接口没有 List 接口中定义 的 get(int index)方法,所以无法使用循环进行输出。
在此接口中有两个常用的子类:HashSet、TreeSet

1.2.1 HashSet(散列存放)

HashSet 属于散列的存放类集,里面的内容是 无序存放的 (即存取顺序不一致)。该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许元素值为null,但最多只能一个(值不能重复)。HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。

使用 HashSet 实例化的 Set 接口实例,虽然本身属于无序的存放,但是能通过将集合变为对象数组(Collection 接口中定义了toArray方法),然后进行循环的方式将 Set 接口中的内容输出。

java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持。

1.2.2 TreeSet

该类实现了Set接口,与 HashSet 不同的是,TreeSet 本身属于排序的子类,可以实现排序 等功能。自定义一个类时,要通过在 自定义类中实现 Comparable 接口,重写其compareTo(E e)方法,才可实现自然排序。

TreeSet 的排序实现,如果是集合中对象是自定义的或者说其他系统定义的类没有实现 Comparable 接口,则不能实现 TreeSet 的排序,会报类型转换(转向 Comparable 接口)错误。 换句话说要添加到 TreeSet 集合中的对象的类型必须实现了 Comparable 接口。

不过 TreeSet 的集合因为借用了 Comparable 接口,同时可以去除重复值,而 HashSet 虽然是 Set 接口子类,但是对于没有复写 Object 的 equals 和 hashCode 方法的对象,加入了 HashSet 集合中也是不能去掉重复值的。

1.3 Queue

Queue 接口定义了如下的方法:
在这里插入图片描述

2、Map(接口)

Map 接口里面,所有内容都按照 key->value 的形式保存,也称为 二元偶对象 。此接口与 Collection 接口没有任何的关系,是 第二大的集合操作接口 。此接口常用方法如下:
在这里插入图片描述
Map 集合的输出:
在 Collection 接口中,可以使用 iterator()方法为 Iterator 接口实例化,并进行输出操作,但是在 Map 接口中并没有此 方法的定义,所以 Map 接口本身是不能直接使用 Iterator进行输出 的。
因为 Map 接口中存放的每一个内容都是一对值,而使用 Iterator 接口输出的时候,每次取出的都实际上是一个完整的 对象。使用 Iterator 进行输出步骤:

1)使用 Map 接口中的 entrySet() 方法将 Map 接口的全部内容变为 Set 集合
2)可以使用 Set 接口中定义的 iterator() 方法为 Iterator 接口进行实例化
3)之后使用 Iterator 接口进行迭代输出,每一次的迭代都可以取得一个 Map.Entry 的实例
4)通过 Map.Entry 进行 key 和 value 的分离

Map.Entry 本身是一个接口。此接口是定义在 Map 接口内部的,是 Map 的内部接口。此内部接口使用 static 进行定义, 所以此接口将成为外部接口。 实际上来讲,对于每一个存放到 Map 集合中的 key 和 value 都是将其变为了 Map.Entry 并且将 Map.Entry 保存在了 Map 集合之中。在 Map.Entry 接口中以下的方法最为常用:

1)K getKey():得到 key
2)V getValue() :得到 value

2.1 HashMap

HashMap 是 Map 的子类(JDK1.2后),此类继承了 AbstractMap 类,同时可以被克隆,可以被序列化下来。本身是属于无序存放的;异步处理,性能较高;允许设置为 null。
Hashtable 类是一个最早的 key->value 的操作类,本身是在 JDK 1.0 的时候推出的,其基本操作与 HashMap 是类似的。但是 Hashtable 是同步处理,性能较低;且不能向集合中插入 null 值的。

2.2 TreeMap

TreeMap 子类是允许 key 进行排序的操作子类,其本身在操作的时候将 按照 key 进行排序 ,另外,key 中的内容可以为任意的对象,但是要求对象所在的类必须实现 Comparable 接口。但从一般的开发角度来看,在使用 Map 接口的时候并不关心其是否排序。

集合输出

1、Iterator(接口)(90%)

Iterator 属于迭代输出,基本的操作原理:是不断的判断是否有下一个元素,有的话,则可以直接输出。要想使用此接口,则必须使用 Collection 接口,在 Collection 接口中规定了一个 iterator()方法,可以用于为 Iterator 接口进行实例化操作。 此接口规定了以下的三个方法:
在这里插入图片描述
注意:
1)通过 Collection 接口为其进行实例化之后,Iterator 中的操作指针是在 第一条元素之上 ,当调用 next()方法的时候,获取当前指针指向的值并向下移动,使用 hasNext()可以检查序列中是否还有元素(当前指针指向的位置后面是否还有值)。
2)在使用 Iterator 进行迭代输出的时候,如果要想删除当前元素,则只能使用 Iterator 接口中的 remove()方法,而不能使用集合中的 remove()方法。否则将出现未知的错误。
3)此接口只能进行 由前向后的单向输出 。如果要想进行双向输出,则必须 使用其子接口 —— ListIterator。

2、ListIterator(5%)

ListIterator 是可以进行双向输出的迭代接口。此接口是 Iterator 的子接口,此接口中还扩展了以下的操作方法:
在这里插入图片描述
注意:如果要想进行由后向前的输出,则首先必须 先进行由前向后的输出

3、Enumeration(1%)

Enumeration 是一个非常古老的输出接口,其也是一个元老级的输出接口,最早的动态数组使用 Vector 完成,那么只要是使用了Vector ,则必须使用 Enumeration 进行输出 。现在要想 使用 Enumeration 输出必须使用 Vector 类完成 。(Vector与Enumeration,类似“一对多关系”,Vector支持 Iterator、ListIterator 、Enumeration 的输出)
在 JDK 1.5 之后,此接口实际上也已经加入了泛型操作。此接口常用方法如下:
在这里插入图片描述

4、foreach(4%)

foreach 可以用来输出数组的内容,那么也可以输出集合中的内容。在使用 foreach 输出的时候一定要注意的是,里面的操作泛型 要指定具体的类型 ,这样在输出的时候才会更加有针对性。

1、哈希表

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一
个链表里。但是当位于一个桶(指数组部分同一个下标的位置)中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用 数组+链表+红黑树 实现,当链表长度超过 阈值(8) 时,就将对应下标位的链表转换为红黑树,这样大大减少了查找时间。
在这里插入图片描述
存储流程图:
在这里插入图片描述

2、红黑树

红黑树的性质:
1)每个结点或是红色的,或是黑色的
2)根节点是黑色的
3)每个叶结点(NIL)是黑色的
4)如果一个节点是红色的,则它的两个儿子都是黑色的。
5)对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。

当对红黑树增删改查,做导致破坏了性质的操作时,要进行“变色”或“旋转”,让其保持性质不被破化。正是保证这些性质,让红黑树查找效率很高。

3.Collections

java.utils.Collections 是集合工具类,用来对集合进行操作。部分方法如下:

public static boolean addAll(Collection c, T… elements):往集合中添加一些元素
public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序
public static void sort(List list) :将集合中元素按照默认规则排序
public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排序

比较的默认规则,简单的说就是两个对象之间比较大小。在JAVA中提供了两种比较实现的方式,一种是采用 java.lang.Comparable 接口去实现;一种是当需要做排序的时候,去选择的 java.util.Comparator 接口完成。

当采用 public static void sort(List list) 这个方法完成的排序,实际上要求了被排序的类型需要实现Comparable接口完成比较的功能(如String类实现了这个接口,当Collections.sort(String类型集合)时,直接按照String类的compareTo​(String anotherString)方法比较大小排序)。
如:

public class CollectionsDemo2 { 
	public static void main(String[] args) { 
		ArrayList<String> list = new ArrayList<String>(); 
		list.add("cba"); 
		list.add("aba"); 
		list.add("sba"); 
		list.add("nba"); 
		//排序方法 
		Collections.sort(list); 
		System.out.println(list); 
	} 
}

//结果:[aba, cba, nba, sba]

public static void sort(List list,Comparator<? super T> ) 方法灵活的完成,这个里面就涉及到了Comparator这个接口,位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性,顾名思义就是做排序的。通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是:public int compare(String o1, String o2) :比较其两个参数的顺序。

public class CollectionsDemo3 { 
	public static void main(String[] args) { 
		ArrayList<String> list = new ArrayList<String>(); 
		list.add("cba"); 
		list.add("aba"); 
		list.add("sba"); 
		list.add("nba"); 
		//排序方法 按照第一个单词的降序 
		Collections.sort(list, new Comparator<String>() { 
			@Override 
			public int compare(String o1, String o2) { 
				return o2.charAt(0) - o1.charAt(0); 
			} 
		}); 
		System.out.println(list); 
	} 
}
//结果:[sba, nba, cba, aba]

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Java从入门到实战总结-3.2、Java集合
    Java从入门到实战总结-3.2、Java集合 文章目录 Java从入门到实战总结-3.2、Java集合1、集合(1)、集合概述(2)、类集设置的目的(重点)(3)、集合框架(4)、Java类集结构图(有整体认识) 2、链表和二叉树思路(1)、链表(实现单链表)A、什么是链表B、链表共分几类?单链表双向链表循环链表 (2)、二叉树(理解概念)A、什么是二叉树B、二叉树的种类斜树满二叉树完全二叉树 C、二叉树的一些性质D、二叉树的遍历方式 (3)、单链表简单实现(4)、二叉树简单实现 3、常见数据结构(1)、栈(2)、队列(3)、数组(4)、链表(5)、红黑树 4、Collection接口(重点)5、Collection接口子接口-List接口(重点)(1)、List接口介绍(2)、List接口中常用方法(3)、List子类-ArrayList(重点)(4)、Vector(重点)(5)、Vector类和ArrayList类的区别(重点)(6)、List子类-链表操作类:LinkedList(理解) 6、集合输出(重点)(1)、Iterator接口(绝对重点)(2)、ListIterator(理解)(3)、废弃的接口Enumeration(了解)(4)、foreach(理解) 7、Collect接口子接口-Set接口(重点)(1)、散列存放:HashSet集合介绍(重点)(2)
  • Java温故而知新-类集
    Collection集合接口 List接口 来源:https://blog.csdn.net/lxyoucan/article/details/115047018
  • 单值集合Collection和键值对集合Map(一)
    目录 一、集合概念 1、类集的出现 2、集合结构图 二、Collection接口 1、List接口 2、ArrayList实现类 3、Vector实现类 4、ArrayList类和Vector类的区别 5、LinkedList实现类 6、Set接口 7、HashSet实现类 8、TreeSet实现类 (1)特点 (2)定义 (3)排序的说明 其他扩展: 9、关于重复元素的说明 三、集合输出Iterator接口 1、Iterator 2、双向输出ListIterator接口 3、介绍废弃的接口Enumeration 4、foreach输出集合(增强for) 四、Map集合 1、Map接口 2、Map接口与Set接口关系 3、HashMap实现类 4、哈希算法的存储实现原理 (1)存储方式:对象数组+链表 (2)哈希表扩容 (3)哈希表的重新散列 5、Hashtable类和HashMap类的区别 6、TreeMap类 7、Map集合的输出讲解 五、常见集合工具类Collections 1、分析hashCode、equals和内存泄漏 (1)equals(): (2)hashCode(): (3)java.lang.Object中对hashCode的约定: (4)在java集合中,判断两个对象是否相等: (5)内存溢出: 六、总结 一、集合概念 1、类集的出现 (1
  • 重温java知识(三十六、类集框架之十三:Map集合之Hashtable)
    Hashtable是早期的字典实现类,可以方便地实现数据查询。Hashtable子类定义结构如下: public class Hashtable<K, V> extends Dictionary<K, V> implements Map<K, V>, Cloneable, Serializable{} HashMap与Hashtable的区别: HashMap中的方法都属于异步操作(非线程安全),HashMap允许保存null数据。 Hashtable中的方法都属于同步操作(线程安全),Hashtable不允许保存null数据,否则会出现空指针异常错误。 1、使用Hashtable子类保存数据的例子: package com.mydemo; import java.util.Hashtable; import java.util.Map; public class MapDemo { public static void main(String[] args) { // 创建Map集合 Map<String, Integer> map = new Hashtable<>(); //保存数据 map.put("one", 1); map.put("two", 2); map.put("three", 3); map.put("one", 8); // key重复,数据覆盖 //
  • Java框架类集结构-底层分析
    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾; Collection集合接口 继承自:Iterable public interface Collection<E> extends Iterable<E> java.util.Collection是单值集合操作的最大父接口,其中有几个核心操作方法以及常用操作方法; Modifier and TypeMethod(public)Descriptionbooleanadd(E e)确保此集合包含指定的元素(可选操作)。booleanaddAll(Collection<? extends E> c)将指定集合中的所有元素添加到此集合(可选操作)。voidclear()从集合中删除所有元素(可选操作)。booleancontains(Object o)如果该集合包含指定的元素,则返回true。booleanremove(Object o)如果存在,则从此集合中删除指定元素的单个实例(可选操作)。intsize()返回此集合中的元素数。Object[]toArray()返回一个包含此集合中所有元素的数组。Iterator<E>iterator()返回对此集合中的元素进行迭代的迭代器。 上面方法中有两个特殊的方法就是cotains与remove
  • Java复习打卡day14
    Java复习打卡day14 类集概述和常见的数据结构collection链表和二叉树ListArrayListvectorLinkedList iterator和Listiterator 类集概述和常见的数据结构 类集的概述: 类集的三大根类是:collection,iterator,和map,下面我们先解释collection,和iterator。 类集图 到目前为止,我们学习到的数据结构有数组,栈两种,这里我将介绍链表和二叉树。 栈:先存后出; 数组:查找容易,但是存数据删数据慢; 链表:查找麻烦,增删易; 二叉树:查找简单,增删也轻松(通常使用有序二叉树)。 collection 集合:是一个接口,它本身的一些抽象方法现在并不使用,一般都会实现他的两个 抽象子接口:Set和List 链表和二叉树 链表: 和对象的性质差不多:一个对象可以有多个属性,例如: Person{ String name; String sex; Person data; },他的data属性也有自己的属性,data,以此类推,将会形成以个 链式的结构,成为链表。 二叉树: 和数一样,有一个根,上面有树干,树干上面有枝丫,再往上面细分。。。 顺序二叉树和链表类似,只是他有两个data,在这里不叫data,是left和right 链表和二叉树 List List 是collection的子接口
  • 15年嵌入式经验老鸟收藏的Linux嵌入式资料和视频
    一口君具有15年的嵌入式研发经验,现主要从事基于嵌入式相关产品的驱动研发工作。精通Linux系统编程、ARM、Linux驱动、网络等;并有多篇软著、专利。这些年一口君收藏整理很多经典的资料,放在冰冷的硬盘实在太过暴殄天物,现在全部奉献给大家。 这些资料都是一口君精心挑选的干货。除此之外还有Linux绝密视频笔记(80G)。 电子文件目录如下:├── Android │ └── Head First Android Development.pdf ├── C# │ ├── C#电子书.pdf │ ├── c#入门经典第五版.PDF │ └── Head First C#, 2nd Edition.pdf ├── C语言 │ └── head_first_c.pdf ├── FreeRTOS │ └── FreeRTOS中文实用教程.pdf ├── java │ ├── JAVAppt │ │ ├── Java程序设计—IO2.ppt │ │ ├── Java程序设计—Java SE基础.ppt │ │ ├── Java程序设计—JDBC.ppt │ │ ├── Java程序设计—多线程.ppt │ │ ├── Java程序设计—反射机制.ppt │ │ ├── Java程序设计—附加.ppt │ │ ├── Java程序设计—类集.ppt │ │ ├── Java程序设计—面向对象
  • 从字符类中排除字符(Exclude characters from a character class)
    问题 是否有一种简单的方法来匹配一个类中除某些字符集之外的所有字符? 例如,如果我可以使用\ w来匹配所有unicode单词字符的集合,是否有办法从该匹配中排除下划线“ _”之类的字符? 想到的唯一想法是在每个字符周围使用否定前行/后退,但是当我实际上只想将一个字符与一个正向匹配和一个负向匹配相匹配时,这似乎比必要的复杂得多。 例如,如果&是AND运算符,则可以执行此操作... ^(\w&[^_])+$ 回答1 这实际上取决于您的正则表达式风格。 。网 ...仅提供一种简单的字符类集操作:减法。 这对于您的示例就足够了,因此您可以简单地使用 [\w-[_]] 如果-后面跟随一个嵌套的字符类,则将其减去。 就那么简单... 爪哇 ...提供了更丰富的字符类集操作集。 特别是,您可以获得诸如[[abc]&&[cde]]类的两个集合的交集(在这种情况下,它将得到c )。 相交和否定相加会给您减法: [\w&&[^_]] 佩尔 ...作为实验功能,支持对扩展字符类进行设置操作(自Perl 5.18开始提供)。 特别是,您可以直接减去任意字符类: (?[ \w - [_] ]) 所有其他口味 ...(支持前瞻)允许您使用负前瞻来模拟减法: (?!_)\w 这首先检查下一个字符不是_ ,然后匹配任何\w (由于负前瞻,因此不能为_ )。 请注意,每种方法都是完全通用的
  • 小型设备上的Twitter引导隐藏元素(Twitter bootstrap hide element on small devices)
    问题 我有以下代码: <footer class="row"> <nav class="col-sm-3"> <ul class="list-unstyled"> <li>Text 1</li> <li>Text 2</li> <li>Text 3</li> </ul> </nav> <nav class="col-sm-3"> <ul class="list-unstyled"> <li>Text 4</li> <li>Text 5</li> <li>Text 6</li> </ul> </nav> <nav class="col-sm-3"> <ul class="list-unstyled"> <li>Text 7</li> <li>Text 8</li> <li>Text 9</li> </ul> </nav> <nav class="col-sm-3"> <ul class="list-unstyled"> <li>Text 10</li> <li>Text 11</li> <li>Text 12</li> </ul> </nav> </footer> 里面有一些文本的四个块。 它们的宽度相等,我对所有它们都设置了col-sm-3 ,我想做的就是在额外的小型设备上隐藏最后一个nav 。 我试图在该nav上使用hidden-xs并将其隐藏,但同时我希望其他块扩展
  • 数据结构--哈希表
    数据结构--哈希表 1. 哈希表1.1 什么是哈希表?1.2 哈希表引入 2. 哈希冲突3. 哈希冲突-避免3.1 闭散列3.2 开散列3.3 负载因子 4. 哈希表实现5. 性能分析6. 类集关系 1. 哈希表 1.1 什么是哈希表? 哈希表是基于数组衍生出来的,哈希表高效的核心奥秘是数组的随机访问能力. 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。 顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( l o g 2 N log_2 N log2​N) , 搜索的效率取决于搜索过程中元素的比较次数 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。 若判断元素是否存在数组中? 就拿着该元素去判定数组该位置元素是否为 true, 如果为 true 说明存在.~~ 时间复杂度:O(1)) 1.2 哈希表引入 如果数字本身较大, 就可以让数字和下标之间建立一个映射关系, 例如数字本身 -1000 再作为下标~ 映射关系不一定是简单的 + -, 也可以是更为复杂的数学变换~~ 插入元素 根据待插入元素的关键码
  • [零基础学JAVA]Java SE基础部分-01. Java发展及JDK配置
    1、课程名称:Java发展及JDK配置 本季介绍了JAVA的发展过程,包括JDK的发展历程,path路径的配置和classpath的配置及作用。并简单讲解了一个简单的JAVA程序,并通过此程序讲解了JAVA程序的基本组成。 JAVA学习层次 Java基本程序设计中重点包括JDK配置和简单Java程序,简单Java程序编写就包括一些变量的操作与数据类型的转换、运算符、表达式与语句、循环与选择性语句、数组与函数,函数在Java常中又称为方法。 Java面向对象在JAVA学习层次当中是一个重点也是一个难点,在这里会有大量的概念我们需要记住,包括类的基本形式、类的功能实现、继承、抽象类与接口,还有我们包的使用和异常处理,Java面向对象是一个承上启下的过程,在Java面向对象中抽象类与接口尤其重要。如果要打好JAVA开发基础,必须要对Java面向对象概念反复理解清楚,达到灵活应用。 在JAVA高级应用部分,多线程是一个比较特殊的东西,在我们一般的J2EE开发中,让我们动手去编写多线程出现的机率并不是很高,但是多线程的概念在一般在公司面试中往往都会被问到,所以我们要把多线程这个概念理解的非常清楚。 重点要会以下两个方面: 1、 抽象类与接口 2、 API==>类集 这是两个最重要部分,这两个部分理解清楚了,会灵活应用熟练了,能分析各种题目了,OK,你就可以了,至少你JAVA基础可以了
  • 将Google地图嵌入Java桌面应用程序中(Embed google maps in Java desktop Application)
    问题 我想将Google地图嵌入到JPanel上。 由于我想要放大/缩小之类的功能,因此使用静态图像是不可行的。 为此,我可能需要在Java桌面应用程序中嵌入一个网页(显示google地图)。 而且我已经读到,我需要WebKit之类的东西(替代品?)来完成此任务。 我将不胜感激能为我提供帮助的任何帮助: 在Jpanel中嵌入网页。 该网页显示谷歌地图。 回答1 是的,现在可以在桌面应用程序中使用Google Maps API 查看以下堆栈溢出线程: JAVA Swing中的Google Map 在Java中嵌入Gecko / Webkit Java应用程序中的Webkit浏览器 使用Java中的WebKit渲染网页 您还可以查看在Java桌面应用程序中使用地图的教程。 回答2 您可以使用JxMaps库完成此任务。 它具有Swing组件,可以将其简单地嵌入到JPanel 。 void createMapView(JPanel parent) { MapView view = new MapView(); parent.add(view); } 该库提供了全面的类集,可用于通过Java使用Google Maps。
  • Objective-C中的标记指针(Tagged pointers in Objective-C)
    问题 在回答这个问题时,我注意到现代的Objective-C运行时使用标记的指针。 Mike Ash的文章及其评论指出,它们用于某些NSNumber和NSDate实例。 这让我想到了适用于不同平台的完整方案表: OSX / iOS 32/64位Objective-C运行时在何处使用标记的指针? 回答1 OS X和iOS都使用64位代码中的带标记的指针对象。 当前都没有使用32位代码中的任何带标记的指针对象,尽管从原理上讲并非没有可能。 优化类和优化值的特定集合经常更改。 开源objc4 / runtime / objc-internal.h描述了至少在一个OS版本中使用的以下类集: OBJC_TAG_NSAtom = 0, OBJC_TAG_1 = 1, OBJC_TAG_NSString = 2, OBJC_TAG_NSNumber = 3, OBJC_TAG_NSIndexPath = 4, OBJC_TAG_NSManagedObjectID = 5, OBJC_TAG_NSDate = 6, OBJC_TAG_7 = 7
  • 如何从Java验证HTML?(How to validate HTML from Java?)
    问题 从Java验证HTML的快速简便的方法是什么? 我正在寻找一个开放源代码/ PD类(或类集),该类描述了100多种HTML标记的各种属性,例如: 标签是可选的吗? 空的? 省略结束标签是否合法? 该标签还可以包含哪些其他标签(如果有)? 哪些属性适用于此标签,它们的类型是什么? (不是必需的,但是很高兴) 谢谢! 编辑 我希望对HTML文档进行逐标签分析,因此我对文档整体是否有效不感兴趣,而对每种标签的具体要求不感兴趣。 我可以根据W3C规范对规则进行编码,但希望先了解哪些现成的解决方案可用。 回答1 如果要验证某些标记是否遵循某些规范,则基于Java的HTML解析器似乎没有止境: Java中的开源HTML解析器 换句话说,您可以解析HTML,然后在结果文档中查找所需的标签,并确定它们是否符合所需的规范。 如果他们不这样做,那么您可能会抛出一个错误。 我认为您不会找到一个完全根据您的需求编写的HTML分析工具,主要是因为这些需求尚未表达出来并且可能有点含糊。 如果解析器无法立即执行您想要的操作,则该列表至少是开源的,因此只要发布更改,您就可以破解解析器。 回答2 Check JTidy(http://jtidy.sourceforge.net/)和VietSpider HTMLParser(http://sourceforge.net/projects/binhgiang/
  • 即将爆火的Java突击手册,全面详细对标P7岗,github已标星81.6k
    Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的。 此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在面试Java后端岗位之前,不妨先打好这些核心的基础。 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛、学习的地方,小编也不例外,最近看到一份对标阿里P7Java核心架构笔记,已经标星81.6K,很是惊讶,看了一下,觉得知识点整理的非常的详细,也不愧能获得这么多星,资料已被整理好,发放福利给朋友们!完整版《对标P7Java核心知识笔记》点击我免费获取 一、Java基础 1.1Java 基本功1.2Java 语法1.3数据类型1.4方法(函数)1.5Java 面向对象1.6集合1.7多线程1.8文件与I/O流 二、并发 2.1并发容器总结2.2乐观锁与悲观锁总结2.3JUC 中的 Atomic 原子类总结2.4AQS 原理以及 AQS 同步组件总结 三、JVM 3.1Java内存区域3.2JVM垃圾回收3.3JDK 监控和故障处理工具3.4类文件结构3.5类加载过程3
  • 阿里团队的Java核心架构笔记,Github已经标星81.6K,开放下载
    Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的。 此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在面试Java后端岗位之前,不妨先打好这些核心的基础。 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛、学习的地方,小编也不例外,最近看到一份对标阿里P8Java核心架构笔记,已经标星81.6K,很是惊讶,看了一下,觉得知识点整理的非常的详细,也不愧能获得这么多星,资料已被整理好,发放福利给朋友们! 三连+关注,看文末即可获得《对标阿里P7知识点合集整理笔记》PDF版文档资料。 一、Java基础 1.1Java 基本功1.2Java 语法1.3数据类型1.4方法(函数)1.5Java 面向对象1.6集合1.7多线程1.8文件与I/O流 二、并发 2.1并发容器总结2.2乐观锁与悲观锁总结2.3JUC 中的 Atomic 原子类总结2.4AQS 原理以及 AQS 同步组件总结 三、JVM 3.1Java内存区域3.2JVM垃圾回收3.3JDK 监控和故障处理工具3
  • 爆火的Java突击手册,竟详细对标P7岗
    Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的。 此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在面试Java后端岗位之前,不妨先打好这些核心的基础。 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛、学习的地方,小编也不例外,最近看到一份对标阿里P7Java核心架构笔记,已经标星81.6K,很是惊讶,看了一下,觉得知识点整理的非常的详细,也不愧能获得这么多星,资料已被整理好,发放福利给朋友们! 帮忙转发一下,关注后添加助理vx:yunduoa2019或扫描下图二维码,跟随助理指引自行获取 一、Java基础 1.1Java 基本功1.2Java 语法1.3数据类型1.4方法(函数)1.5Java 面向对象1.6集合1.7多线程1.8文件与I/O流 二、并发 2.1并发容器总结2.2乐观锁与悲观锁总结2.3JUC 中的 Atomic 原子类总结2.4AQS 原理以及 AQS 同步组件总结 三、JVM 3.1Java内存区域3.2JVM垃圾回收3.3JDK
  • 阿里P9在Github上分享的Java面试突击手册,凭借它,我拿下了阿里P7的offer!
    Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的。 此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在面试Java后端岗位之前,不妨先打好这些核心的基础。 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛、学习的地方,小编也不例外,最近看到一份对标阿里P7Java核心架构笔记,已经标星81.6K,很是惊讶,看了一下,觉得知识点整理的非常的详细,也不愧能获得这么多星,资料已被整理好,发放福利给朋友们! 需要获取得话麻烦一键三连+评论,然后添加VX(tkzl6666)即可免费领取 一、Java基础 1.1Java 基本功 1.2Java 语法 1.3数据类型 1.4方法(函数) 1.5Java 面向对象 1.6集合 1.7多线程 1.8文件与I/O流 二、并发 2.1并发容器总结 2.2乐观锁与悲观锁总结 2.3JUC 中的 Atomic 原子类总结 2.4AQS 原理以及 AQS 同步组件总结 三、JVM 3.1Java内存区域 3.2JVM垃圾回收 3.3JDK
  • 对标P7岗的Java突击手册,github已标星81.6k
    Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的。 此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在面试Java后端岗位之前,不妨先打好这些核心的基础。 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛、学习的地方,小编也不例外,最近看到一份对标阿里P7Java核心架构笔记,已经标星81.6K,很是惊讶,看了一下,觉得知识点整理的非常的详细,也不愧能获得这么多星,资料已被整理好,发放福利给朋友们! 帮忙转发一下,关注后添加助理vx:yunduoa2019或扫描下图二维码,跟随助理指引自行获取 一、Java基础 1.1Java 基本功1.2Java 语法1.3数据类型1.4方法(函数)1.5Java 面向对象1.6集合1.7多线程1.8文件与I/O流 二、并发 2.1并发容器总结2.2乐观锁与悲观锁总结2.3JUC 中的 Atomic 原子类总结2.4AQS 原理以及 AQS 同步组件总结 三、JVM 3.1Java内存区域3.2JVM垃圾回收3.3JDK
  • GitHub爆火的Java突击手册,对标的居然是P7岗
    Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的。 此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在面试Java后端岗位之前,不妨先打好这些核心的基础。 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛、学习的地方,小编也不例外,最近看到一份对标阿里P7Java核心架构笔记,已经标星81.6K,很是惊讶,看了一下,觉得知识点整理的非常的详细,也不愧能获得这么多星,资料已被整理好,发放福利给朋友们! 帮忙转发一下,关注后添加助理vx:yunduoa2019或扫描下图二维码,跟随助理指引自行获取 一、Java基础 1.1Java 基本功1.2Java 语法1.3数据类型1.4方法(函数)1.5Java 面向对象1.6集合1.7多线程1.8文件与I/O流 二、并发 2.1并发容器总结2.2乐观锁与悲观锁总结2.3JUC 中的 Atomic 原子类总结2.4AQS 原理以及 AQS 同步组件总结 三、JVM 3.1Java内存区域3.2JVM垃圾回收3.3JDK