编程知识 cdmana.com

Day17 Java Foundation

Day17-Java

1、Ensemble de classes

1.1 Reconnaître les ensembles de classes

Si vous voulez enregistrer plusieurs objets maintenant , Assurez - vous d'utiliser un tableau d'objets pour compléter , Mais le plus gros problème avec le tableau d'objets lui - même est de déterminer la longueur des données , Ainsi, le développement d'un tableau d'objets dynamiques a été réalisé plus tard avec une liste liée , Mais le développement de la liste liée est très difficile , Et si une liste doit vraiment être utilisée , Il ne suffit pas de s'appuyer uniquement sur ce qui a été écrit avant , Il faut aussi régler le Code .

EtJDK1.2 Le concept d'ensemble de classes a ensuite été officiellement introduit , Un ensemble de classes est un tableau dynamique d'objets , Classe d'implémentation appartenant à chaque structure de données , Les principales composantes de l'ensemble des classes sont les interfaces d'exploitation de base :Collection,List,Set,Map,Iterator,Enumeration.

1.2 CollectionInterface de collecte

Collection Est la plus grande interface parent d'une collection unique .EtCollectionLes interfaces sont définies comme suit::

public interface Collection<E> extends Iterable<E>

DeJDK1.5AprèsCollection Une application générique est ajoutée à l'interface , L'avantage immédiat est d'éviter ClassCastExceptionAnomalie, Toutes les données à l'intérieur doivent être du même type de stockage . Voici quelques - unes des méthodes couramment utilisées pour ce type de :

Nom de la méthode Type Description
public boolean add(E e) Fréquent Ajouter des données à la collection
boolean addAll(Collection<? extends E> c) Fréquent Ajouter un ensemble de données à la collection
public void clear() Fréquent Effacer les données de l'ensemble
public boolean contains(Object o) Fréquent Demander si les données existent
public Boolean isEmpty() Fréquent Déterminer si la collection contient des éléments
public Iterator iterator() Fréquent AccèsIteratorObjet d'interface,Pour la sortie
public boolean remove(Object o) Fréquent Supprimer les données,Besoinequals()Méthodes
public int size() Fréquent Obtenir la longueur de la collection
public Object[] toArray() Fréquent Renvoie les données de la collection

En cours de développement,add()Etiterator() Utilisation extrêmement élevée de la méthode , D'autres méthodes sont rarement utilisées . L'interface n'est qu'une norme pour le stockage des données , Et ne différencie pas les types de stockage ,Par exemple: Si vous souhaitez conserver des données, vous devrez peut - être faire la distinction entre duplication et non - duplication . Donc dans le développement réel , J'ai tendance à penser à utiliser CollectionSous - interface de l'interface:List(Autoriser la répétition)、Set(Dupliquer non autorisé).

image-20210822185639319

1.3 ListIntroduction à l'interface

List- Oui.Collection Une des sous - interfaces les plus couramment utilisées pour , Et permettre des sous - interfaces dupliquées .

Nom de la méthode Type Description
public E get(int index) Fréquent Obtenir les données à l'emplacement de l'index spécifié
public E set(int index,E element) Fréquent Modifier les données de l'index spécifié
public ListIterator listIterator() Fréquent PourListIteratorInstanciation de l'interface

List Sous - interface avec Collection La plus grande caractéristique de l'interface par rapport à l'interface est qu'elle a un get()Méthodes, Le contenu peut être obtenu à partir de l'index .MaisList Il appartient à l'une de nos interfaces, et si vous obtenez l'objet instantané de l'interface, vous devez avoir une sous - classe ,InList Il existe trois sous - classes communes sous interface :ArrayList、Vector、LinkedList.

image-20210822191336145

L'opération finale devrait toujours être axée sur l'interface , Alors, puisque c'est l'interface principale , Donc toutes les méthodes se réfèrent simplement à la définition de l'interface .

1.3.1 ArrayListSous - catégories

ArrayList C'est une aiguille pour List Mise en œuvre de l'opération Array pour l'interface .

ListFonctionnement de base

package com.day17.demo;

import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {
    
	public static void main(String[] args) {
    
		List<String> all = new ArrayList<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		System.out.println(all.size() + " " + all.isEmpty());
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("world~!");
		all.add("zsr~");
		System.out.println(all.contains("zsr~"));
		System.out.println(all.contains("zsr"));
		System.out.println(all);
	}
}

Grâce à notre Code, nous pouvons confirmer List Autoriser l'enregistrement des données en double .

ListExiste dansget()Méthodes,Peut être utiliséget() Méthode d'obtention des données en combinaison avec l'index .

ListDeget()Méthodes

package com.day17.demo;

import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {
    
	public static void main(String[] args) {
    
		List<String> all = new ArrayList<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("world~!");
		all.add("zsr~");
		for (int i = 0; i < all.size(); i++) {
    
			System.out.println(all.get(i));
		}
	}
}

Mais n'oubliez pas ,get()La méthode est:List Sous - Interface , Si vous n'utilisez pas maintenant ListMais...Collection, Pour l'extraction des données à ce moment , Seules les opérations qui peuvent transformer une collection en un tableau d'objets .

( Le développement n'est généralement pas utilisé )Collection Traitement de sortie et extraction des données

package com.day17.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class CollectionDemo {
    
	public static void main(String[] args) {
    
		Collection<String> all = new ArrayList<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("world~!");
		all.add("zsr~");
		//FonctionnementObjectRetour au formulaire, Il est donc possible qu'une transition vers le bas soit nécessaire ,Ça pourrait causerClassCastExceptionRisques pour la sécurité
		Object result [] = all.toArray();//DevientObjectTableau d'objets
		System.out.println(Arrays.toString(result));
	}
}

Collection et simplicité JavaCatégorie

Dans le développement réel , Le type de données le plus stocké dans la collection , C'est Jane javaCatégorie.

Enregistrer simple dans la collection javaCatégorie

package com.day17.demo;

import java.util.ArrayList;
import java.util.List;

class Person{
    
	private String name;
	private Integer age;
	public Person(String name, Integer age) {
    
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
    
		return name;
	}
	public void setName(String name) {
    
		this.name = name;
	}
	public Integer getAge() {
    
		return age;
	}
	public void setAge(Integer age) {
    
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
    
		// TODO Auto-generated method stub
		if(this == obj){
    
			return true;
		}
		if (obj == null){
    
			return false;
		}
		if(!(obj instanceof Person)){
    
			return false;
		}
		Person per = (Person) obj;// L'objet lui - même peut être déplacé vers le bas 
		return this.name.equals(per.name) && this.age.equals(per.age);
	}
	@Override
	public String toString() {
    
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
}
public class ListDemo {
    
	public static void main(String[] args) {
    
		List<Person> all = new ArrayList<>();
		all.add(new Person("Zhang San",10));
		all.add(new Person("Li - si.",21));
		all.add(new Person("Wang Wu",19));
		//Pourremove()、contains() La méthode doit avoir equals()Appui
		all.remove(new Person("Li - si.",21));
		System.out.println(all.contains(new Person("Li - si.",21)));
		for (int i = 0; i < all.size(); i++) {
    
			System.out.println(all.get(i));
		}
	}
}

LeList Collection si elle est utilisée remove()、contains()La méthode doit avoirequals()Appui méthodologique.Simplejava L'utilisation dans la classe est rare .

1.3.2 VectorSous - catégories

Vector C'est une ancienne Sous - classe , Cette classe vient de JDK1.0Sortie,ArrayListC'est vrai.JDK1.2Lancement.

package com.day17.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class ArrayListDemo {
    
	public static void main(String[] args) {
    
		List<String> all = new Vector<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("world~!");
		all.add("zsr~");
		for (int i = 0; i < all.size(); i++) {
    
			System.out.println(all.get(i));
		}
	}
}

Questions d'entrevue:Veuillez expliquer.ArrayListAvecVectorLa différence?

La différence ArrayList Vector
Heure historique JDK1.2 JDK1.0
Mode de traitement Traitement asynchrone, La forme est plus élevée Synchronisation, Dégradation des performances
Sécurité des données Sécurité non threadée Sécurité des fils
Formulaire de sortie Iterator、ListIterator、foreach Iterator、ListIterator、foreach、Enumeration
1.3.3LinkedListSous - catégories

InList Il y a un autre LinkedListSous - catégories, Si la transition vers notre interface parent , La forme utilisée n'est pas différente de celle utilisée précédemment .

package com.day17.demo;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ArrayListDemo {
    
	public static void main(String[] args) {
    
		List<String> all = new LinkedList<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("world~!");
		all.add("zsr~");
		for (int i = 0; i < all.size(); i++) {
    
			System.out.println(all.get(i));
		}
	}
}

Questions d'entrevue:Veuillez expliquer.ArrayListAvecLinkedListLa différence?

La différence ArrayList LinkedList
Méthode de construction public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public LinkedList() {
}
Longueur d'ouverture Taille de l'ouverture Dynamic Open
Complexité temporelle La complexité temporelle est1 La complexité temporelle estn

1.4 SetIntroduction à l'interface

SetInterface avecList La plus grande différence entre les interfaces est que le contenu ne peut pas être dupliqué ,NotificationSetEtList La plus grande différence, c'est que

set L'interface n'est pas correcte Collection L'interface est étendue ,EtListC'est exact.Collection L'interface a été étendue .Parce quejdk1.8Raisons,Donc, danscollection Les interfaces sont également disponibles en defaultMéthodes, Et cette méthode d'écriture n'est pas Set L'interface apparaît à l'intérieur .C'est - à - direset Impossible d'utiliser dans l'interface get()Méthode de traitement,EtSet Il y a des sous - classes dans les sous - interfaces que nous utilisons HashSet、TreeSet.

image-20210830135859831

1.4.1 Sous - classe de stockage de hachage:HashSet

Hash(Hashi) Appartient à un algorithme , Le sens central de cet algorithme est de trouver un algorithme de sauvegarde vide , Donc dès que je vois Hash C'est - à - dire qu'il n'y a pas de préservation séquentielle .

ObservationSetUtilisation des interfaces

package com.day17.demo;

import java.util.HashSet;
import java.util.Set;

public class HashSetDemo {
    
	public static void main(String[] args) {
    
		Set<String> all = new HashSet<>();
		all.add("Hello");
		all.add("zsr");
        all.add("zsr");
		all.add("Abc");
		System.out.println(all);
	}
}

Enregistrer les données trouvées après la sortie , Il n'y a plus de données en double , Et il n'y a pas d'ordre dans sa propre préservation .

1.4.2 Trier les sous - classes stockées:TreeSet

Si vous voulez maintenant Set Les données stockées dans la collection sont séquentielles ,Alors, passe.TreeSetEn coursSet Instanciation de l'interface .

UtiliserTreeSet Interface d'Instanciation

package com.day17.demo;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class HashSetDemo {
	public static void main(String[] args) {
		Set<String> all = new TreeSet<>();
		all.add("C");
		all.add("C");
		all.add("A");
		all.add("B");
		all.add("D");
		System.out.println(all);
	}
}

Toutes les données sauvegardées sont maintenant trouvées non dupliquées et séquentielles .TreeSet Fait en utilisant un schéma ascendant .

1.4.3 À propos deTreeSetDescription du tri

La procédure précédente a permis de constater que ,UtiliserTreeSetInstanciationSet Dans l'interface , Toutes les données stockées sont ordonnées ,Dans ce cas,, Et si on utilisait une classe personnalisée ?

Si les objets de cette classe doivent être triés , Alors cette classe doit implémenter ComparableInterface, Définir les règles de comparaison , Mais il y a une chose à noter dans ce cas : Une fois utilisé ComparableEt si, Toutes les propriétés de la classe doivent être écrites dans la collation .

Tri personnalisé

package com.day17.demo;

import java.util.Set;
import java.util.TreeSet;
class Personn implements Comparable<Personn>{
    
	private String name;
	private Integer age;
	
	public Personn(String name, Integer age) {
    
		this.name = name;
		this.age = age;
	}
	public String getName() {
    
		return name;
	}
	public void setName(String name) {
    
		this.name = name;
	}
	public Integer getAge() {
    
		return age;
	}
	public void setAge(Integer age) {
    
		this.age = age;
	}
	@Override
	public String toString() {
    
		return "person [name=" + this.name + ", age=" + this.age + "]\n";
	}
	@Override
	public int compareTo(Personn o) {
    
		// TODO Auto-generated method stub
		if(this.age > o.age){
    
			return 1;
		}else if (this.age < o.age){
    
			return 0;
		}else{
    
			return this.name.compareTo(o.name);
		}
		
	}
	
}
public class TreeSetDemo {
    
	public static void main(String[] args) {
    
		// TODO  Talon de méthode généré automatiquement 
		Set<Personn> all=new TreeSet<Personn>();
		all.add(new Personn("Zhang San",20));
		all.add(new Personn("Zhang San",20));
		all.add(new Personn("Li - si.",20));
		all.add(new Personn("Wang Wu",30));
		all.add(new Personn("Zhao Liu",40));
		System.out.println(all);
	}
}

Parce que dans le développement réel TreeSet C'est trop gênant d'utiliser , Dans la simplicité du développement du projet java La classe est basée sur la conception de la table de base de données , Si une feuille de données contient trop de champs , Tu dois écrire à mort .

image-20210830180601214

TreeSet La Sous - classe dépend de Compara() La valeur de retour de la méthode est 0 Pour déterminer s'il s'agit d'un élément répétitif .

1.4.4 Description des éléments répétitifs

En serviceTreeSet Lorsque la Sous - classe enregistre des données , Le jugement des éléments répétitifs repose sur Comparable Interface terminée .Ce n'est pas toutSet Comment l'interface juge les éléments répétitifs , Parce que si vous utilisez HashSetSous - catégories,Parce queComparableÇa n'a pas d'importance., Il s'appuie donc principalement sur deux méthodes pour juger des éléments répétitifs :

  • hashCode:public int hashCode();
  • Comparaison des objets:public Boolean equals(Object obj)

Au cours de la comparaison d'objets , Je vais d'abord utiliser hashCode() Avec les objets stockés dans la collection hashCode()Comparer, Si le Code est le même , Puis réutiliser equals() Méthodes de comparaison du contenu , Si tout est le même , Le même élément .

package com.day17.demo;

import java.util.Set;
import java.util.TreeSet;
class Personn implements Comparable<Personn>{
    
	private String name;
	private Integer age;
	
	public Personn(String name, Integer age) {
    
		this.name = name;
		this.age = age;
	}
	public String getName() {
    
		return name;
	}
	public void setName(String name) {
    
		this.name = name;
	}
	public Integer getAge() {
    
		return age;
	}
	public void setAge(Integer age) {
    
		this.age = age;
	}
	
	@Override
	public int hashCode() {
    
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
    
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Personn other = (Personn) obj;
		if (age == null) {
    
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
    
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
    
		return "person [name=" + this.name + ", age=" + this.age + "]\n";
	}
	@Override
	public int compareTo(Personn o) {
    
		// TODO Auto-generated method stub
		if(this.age > o.age){
    
			return 1;
		}else if (this.age < o.age){
    
			return 0;
		}else{
    
			return this.name.compareTo(o.name);
		}
		
	}
	
}
public class TreeSetDemo {
    
	public static void main(String[] args) {
    
		// TODO  Talon de méthode généré automatiquement 
		Set<Personn> all=new TreeSet<Personn>();
		all.add(new Personn("Zhang San",20));
		all.add(new Personn("Zhang San",20));
		all.add(new Personn("Li - si.",20));
		all.add(new Personn("Wang Wu",30));
		all.add(new Personn("Zhao Liu",40));
		System.out.println(all);
	}
}

​ Si vous voulez identifier l'unicité de l'objet ,Il le faut.hashCode()、equals()Action commune.

Questions d'entrevue:Si deuxhashCode()Même chose.、equals() Quel est le résultat différent ?Impossible à éliminer

Questions d'entrevue:Si deuxhashCode()C'est différent.、equals() Quel est le même résultat ?Impossible à éliminer

​ Le jugement de l'objet doit être réalisé à la fois .

image-20210830200214061

1.5 Opération de sortie pour la collection

Toutes les opérations de base décrites précédemment qui appartiennent à un ensemble de valeurs uniques , Mais l'un des problèmes les plus importants pour une collection est comment faire la sortie du contenu de la collection ,Et la question estJava Quatre modes de sortie sont donnés dans le cadre de l'ensemble de classes pour :Iterator,ListIterator,Enumeration,foreach.

1.5.1 Sortie itérative:Iterator

image-20210830200741889

public boolean hasNext() Déterminer s'il y a un élément suivant
public E next() Obtenir l'élément courant
public default void remove() Supprimer l'élément

CritèresIterator

package com.day17.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class ArrayListDemo {
    
	public static void main(String[] args) {
    
		List<String> all = new ArrayList<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("world~!");
		all.add("zsr~");
		Iterator<String> iter = all.iterator();//InstanciationIterator
		while(iter.hasNext()){
    
			String str = iter.next();
			System.out.println(str);
		}
	}
}

PourIterator Fourni dans l'interface remove() La méthode résout principalement le problème de la suppression d'éléments dans la collection

removeFonctionnement

package com.day17.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class ArrayListDemo {
    
	public static void main(String[] args) {
    
		List<String> all = new ArrayList<>();// À ce stade, la collection ne convient qu'à l'enregistrement StringDonnées de type
		all.add("Hello");
		all.add("Hello");	//Données en double
		all.add("a");
		all.add("world~!");
		Iterator<String> iter = all.iterator();//InstanciationIterator
		while(iter.hasNext()){
    
			String str = iter.next();
			if("a".equals(str)){
    
				all.remove("a");// Si une interruption après cette opération a été effectuée 
				//iter.remove();// Si la sortie suivante n'est pas interrompue ,Exécution
				continue ;
			}
			System.out.println(str);
		}
	}
}

Après avoir vu la sortie de l'ensemble , Pour toujours IteratorInterface terminée.

1.5.2 Sortie itérative bidirectionnelle:ListIterator

Iterator Ce qui peut être fait est une seule opération de sortie vers l'avant et vers l'arrière , Si vous voulez maintenant pouvoir terminer de l'avant à l'arrière , La sortie de l'arrière vers l'avant , Alors vous pouvez utiliser ListIteratorInterface terminée,Cette interface estIteratorSous - interface pour,InListIterator L'interface utilise principalement deux méthodes d'extension :

Déterminer s'il y a un élément précédent:public Boolean hasPrevious();

Retirer l'élément précédent :public E previous().

Mais si vous voulez ListIteratorObjet instantané de l'interface,Collection Il n'y a pas d'approche pour soutenir ,Cette approcheList Existe dans l'interface :

Public ListIterator listIterator()

Effectuer une itération bidirectionnelle

package com.day17.demo;


import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;


public class ListIteratorDemo {
    
	public static void main(String[] args) {
    
		// TODO  Talon de méthode généré automatiquement 
		List<String> all=new ArrayList<String>();
		all.add("hello");
		all.add("hello");
		all.add("world");
		ListIterator<String> ite=all.listIterator();
		System.out.println(" De l'avant vers l'arrière ");
		while(ite.hasNext()){
    
			String str=ite.next();
			System.out.print(str + "、");
		}
		System.out.println();
		System.out.println(" De l'arrière vers l'avant ");
		while(ite.hasPrevious()){
    
			String str=ite.previous();
			System.out.print(str + "、");
		}
	}
}

Mais pour les opérations de l'arrière vers l'avant , La sortie de l'avant vers l'arrière doit se produire avant de procéder . Comme cette interface de sortie n'a que ListPeut être utilisé, Donc il n'y a presque pas de développement .

1.5.3 Interface obsolète :Enumeration

Enumeration Est l'une des premières interfaces de sortie , Première sortie énumérée ,InJDK1.0 C'est déjà sorti ,Et dansJDK1.5 Pour étendre sa fonctionnalité , Principalement l'ajout de génériques ,InEnumeration Il n'y a que deux méthodes définies dans l'interface :

Déterminer s'il y a un élément suivant:public Boolean hasMoreElements()

Obtenir l'élément courant :public E nextElement()

Mais pour obtenir EnumerationObjet instantané pour, On ne peut pas compter sur CollectionL'interface est, Il peut compter sur VectorClasse terminée,InVector Une méthode est définie dans la Sous - classe :public Enumeration elements().

UtiliserEnumertaionProduire

package com.day17.demo;

import java.util.Enumeration;
import java.util.Vector;

public class IteratorTest {
    
	public static void main(String[] args) {
    
		// TODO  Talon de méthode généré automatiquement 
		Vector<String> all=new Vector<String>();
		all.add("hello");
		all.add("hello");
		all.add("world");
		Enumeration<String> ite=all.elements();
		while(ite.hasMoreElements()){
    
			String str=ite.nextElement();
			System.out.println(str);
		}
	}
}

En termes de développement , La première considération n'est certainement pas Enumeration, Ce qui compte, c'est que Iterator, Ne l'utilisez que si nécessaire .

1.5.4 JDK1.5Appuiforeach

Pourforeach Sortie en plus de la sortie qui peut être faite à partir d'un tableau , La sortie de la collection peut également être effectuée .

Utiliserforeach

package com.day17.demo;

import java.util.ArrayList;
import java.util.List;

public class IteratorTest {
    
	public static void main(String[] args) {
    
		// TODO  Talon de méthode généré automatiquement 
		List<String> all=new ArrayList<String>();
		all.add("hello");
		all.add("hello");
		all.add("world");
		for(String x : all){
    
			System.out.println(x);
		}
	}
}

Utiliserforeach Ce n'est pas une forme largement acceptée de code d'exploitation .

版权声明
本文为[Directeur d'usine Java]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/10/20211013211944133u.html

Scroll to Top