Cet article présente principalement le résumé de la revue du framework de collection pour Java. L'éditeur pense qu'il est plutôt bon. Maintenant, je vais le partager avec vous et lui donner une référence. Suivons l'éditeur pour y jeter un œil
Comme le dit le proverbe : révisez l'ancien et apprenez le nouveau. Pensez aux connaissances que vous avez acquises. Même si vous les avez bien apprises auparavant, vous les oublierez si vous ne les utilisez pas pendant une longue période. Par conséquent, je pense qu'il est très nécessaire de revoir les connaissances que vous avez acquises auparavant. Ce document passe en revue le cadre de collecte dans les bases de Java.
Pourquoi y a-t-il un cadre de collecte ?
Habituellement, nous utilisons des tableaux pour stocker certains types de données de base ou des types de données de référence, mais la longueur du tableau est fixe. Lorsque les éléments ajoutés dépassent la longueur du tableau, le tableau doit être. restructurée. Définition, il serait trop compliqué d'écrire un programme, donc pour notre commodité, Java fournit une classe de collection qui peut stocker n'importe quel objet. La longueur peut être modifiée avec l'augmentation des éléments et diminue avec la diminution des éléments. . réduire.
Les tableaux peuvent stocker des types de données de base ou des types de données de référence (c'est-à-dire des objets), en fait des données de base. les types peuvent également être stockés dans des collections, mais ils seront automatiquement mis en boîte et transformés en objets une fois stockés.
Avoir un ensemble ne signifie pas que nous devons abandonner le tableau. Si le nombre d'éléments à stocker est fixe, nous pouvons utiliser un tableau, et lorsque les éléments à stocker le sont. pas fixe, nous utilisons un ensemble.
Types d'ensembles
Les ensembles sont divisés en ensembles à une colonne et en ensembles à deux colonnes. L'interface racine d'une collection à une seule colonne est Collection, et l'interface racine d'une combinaison à deux colonnes est Map. Les deux collections ont des classes de collection (HashMap et HashSet) basées sur l'algorithme de hachage. Nous pouvons maintenant nous demander si le double. -la collection à colonne est basée sur une collection à une seule colonne. Ou la collection à une seule colonne est-elle basée sur la collection à deux colonnes ? Regardons le code source pour ajouter des éléments aux collections HashMap et HashSet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
À partir du code source ci-dessus, nous pouvons voir que la méthode add n'apparaît pas dans le code source de la méthode put de la collection double colonne, et le L'ajout du code source de la collection à une seule colonne ne peut que blâmer l'apparence de put ; nous pouvons savoir que la collection à une seule colonne est implémentée sur la base de la collection à deux colonnes. En fait, la raison est très simple. Chaque fois que vous ajoutez un élément à une collection à une seule colonne, il vous suffit d'ajouter une clé. La clé est également l'identifiant unique de l'élément dans la collection à double colonne, ainsi que sa valeur. est remplacé et masqué par un objet Object. Chaque fois que vous l'ajoutez, l'élément de sortie est Le masquage de la valeur d'une combinaison à une seule colonne est basé sur un ensemble à deux colonnes. Cependant, si c'est le cas. un ensemble à une seule colonne, il sera très difficile de le transformer en un ensemble à deux colonnes. C'est comme un magicien effectuant des tours de magie, vous devez préparer à l'avance ce que vous souhaitez changer et simplement le cacher. Mais si le magicien crée vraiment quelque chose à partir de rien, alors je suppose qu'il est un dieu et qu'il peut évoquer tout ce qu'il veut.
Collection à colonne unique
Nous examinons d'abord le diagramme d'héritage de la combinaison à colonne unique. de la collection à colonne unique est Collection, et les classes d'implémentation de List sont ArrayList, LinkedList et Vector, et les classes d'implémentation de l'interface Set sont HashSet et TreeSet.
Deuxièmement, jetons un coup d'œil aux fonctions de chaque collection
Aperçu des fonctions uniques de la collection List
* void add(int index,E element) //Ajouter un élément à la collection
* E remove(int index) //Supprimer l'élément à la position d'index dans la collection
* E get(int index) //Obtenir L'élément à la position d'index dans la collection
* E set(int index,E element) Remplacer l'élément à la position d'index par element
Fonction spéciale de la classe Vector
* public void addElement(E obj) Add element
* public E elementAt(int index) // Get element
* public Enumeration elements() // Get the énumération des éléments (utilisés lors de l'itération)
Fonctions uniques de la classe LinkedList
* public void addFirst(E e) et addLast(E e) //Ajouter des éléments à la tête de la collection ou ajouter des éléments à la fin de la collection
* public E getFirst() et getLast() // Récupère l'élément head et récupère l'élément tail
* public E removeFirst() et public E removeLast( ) // Supprimez l'élément head et supprimez l'élément tail
* public E get(int index); // Obtenir l'élément index
Selon la fonction ci-dessus de LinkedList, nous pouvons simuler le pile pour obtenir la structure de données de la file d'attente. La pile est premier entré, dernier sorti et la file d'attente est première entrée, premier sorti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
|
接下里我们看Set集合,我们知道Set 集合存储无序,无索引,不可以存储重复的对象;我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数,其中HashSet底层基于哈希算法,当HashSet调用add方法存储对象,先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象,如果没有哈希值相同的对象就直接存入集合,如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存。下面给出HashSet存储自定义对象的一个例子,自定义对象需要重写hashCode()和equals()方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
|
运行结果如图,达到了不存储重复自定义对象的目的。其实HashSet的下面还有一个LinkedHashSet,底层是链表实现的,是set中唯一一个能保证怎么存就怎么取的集合对象,是HashSet的子类,保证元素唯一,与HashSet原理一样,这里就不多说了。
最后是TreeSet集合,该集合是用来进行排序的,同样也可以保证元素的唯一,可以指定一个顺序, 对象存入之后会按照指定的顺序排列。
指定排序有两种实现:
Comparable:集合加入自定义对象的时候,自定义对象需要实现Comparable接口,
实现接口的抽象方法中返回0,则集合中只有一个元素
返回正数,则集合中怎么存则怎么取,
返回负数,集合倒序存储
Comparator(比较器):
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
原理:
TreeSet底层二叉排序树
返回小的数字存储在树的左边(负数),大的存储在右边(正数),相等则不存(等于0)
在TreeSet集合中如何存取元素取决于compareTo()方法的返回值
下面来看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
|
下面是运行截图,其中compareTo的实现方法对几种条件排序进行了实现,具体可以查看Person自定义类中的实现。
单列集合复习就到这里吧。
双列集合
同样的,在复习双列结合之前我们先看看双列集合的继承图。
Map集合的功能梳理:
添加功能
V put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
获取功能
Set
V get(Object key):根据键获取值
Set
Collection
长度功能
int size():返回集合中的键值对的个数
Map类集合也有三种遍历方式:
使用迭代器进行遍历
使用增强For循环来进行遍历
使用Map.Entry来遍历集合中的元素
下面我们来看看如何实现上面三种遍历方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
LinkHashMap与LinkHashSet一样,怎么存怎么取,保证元素唯一(key 是唯一判定值),由于保证元素唯一,其性能肯定会低一些,这里就不细说了。
TreeMap是双列集合,其实他和TreeSet是很像的,但是双列集合的键是唯一标识,所以TreeMap排序的是每个元素的键。对于存储自定义对象排序,它也有Comparable和Comparator,下面我们来看例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
|
到这里,Java集合框架的复习基本完成,最后来一个斗地主的例子对集合框架做一个综合应用,只是实现斗地主洗牌和发牌,至于怎么打牌,逻辑复杂,这里不做实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
|
运行截图:
写在最后:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!