[Pour les débutants] Un article qui vous fait comprendre 5 000 billions de% du «passage par référence» compliqué de Java

Bonjour. Nous ferons des débuts gluants avec Qiita.

Cet article est une version révisée de ce qui était auparavant laissé dans la mer d'Internet sous un autre nom et un autre support. Veuillez préparer le café et sortir avec nous.

Ciblez les lecteurs de cet article

--Java débutant --Les personnes qui veulent évaluer Java --Les personnes qui veulent revoir en passant par valeur et en passant par référence

Je vais l'écrire pour ceux qui ont une connaissance minimale de Java de base, mais il n'y a pas de problème même si vous lisez correctement la description spécifique à Java.

introduction

N'est-il pas difficile de passer des références Java en premier lieu? Dans l'ensemble, je ne pense pas que ce soit si difficile, mais il y en a qui se comportent évidemment de façon étrange, même si les débutants ne peuvent pas l'éviter.

Oui, ** Type d'agitation **. Vous êtes vous.

A dire vrai, "Le type de chaîne peut être traité de la même manière que le type de base (comme int)" "Mais lors de la comparaison, utilisez .equals () au lieu de ==" C'est tout à fait une reconnaissance.

Cependant, il est désagréable de penser calmement, n'est-ce pas?

ex0


	public static void main(String[] args) {
		String str1 = "Chaîne 1";
		translate(str1);
		System.out.println(str1);//Chaîne 1
	}
	private static void translate(String str2) {
		str2 = "Chaîne 2";
	}

En Java, tous sauf les types de base sont des objets (héritant de la classe Object). Et le type String n'est pas le type de base. C'est un objet. L'objet est passé par référence. Cela signifie que c'est étrange si la sortie n'est pas "chaîne de caractères 2", n'est-ce pas?

Si vous comprenez pourquoi "string 1" est imprimé ici, vous n'avez probablement pas besoin de cet article. "Parce que le type String est comme un type de base" est ... correct mais incorrect. Pardon.

Dans cet article, je voudrais expliquer ** "ce qui se passe" ** pour les débutants (ceux qui comprennent la signification des instances).

En fait, beaucoup de gens qui comprennent Java dans une certaine mesure voudront dire: "Puisque le type String est immuable, c'est juste le cas" ou "Java est passé par référence en premier lieu!". Cependant, je pense que ce sera un lourd fardeau pour les débutants.

Tant qu'il y a une explication assez large de Java basée sur les concepts de "passage par valeur" et "passage par référence", il est inutile de comprendre "ce que" passer par valeur "et" passer par référence "sont à dire lorsqu'on apprend Java pour le moment." Ça ne serait pas. Alors allons-y.

Bases dans les bases: Dans le cas du "passage par valeur"

C'est la base des bases, mais vérifions-le.

ex1


	public static void main(String[] args) {
		int num_sender = 1;
		add(num_sender);
		System.out.println(num_sender);//C'est 1
	}

	private static void add(int num_receiver) {
		num_receiver += 1;
	}

La méthode recommandée pour s'en souvenir est ** "écrivez le chiffre" 1 "dans votre tête et remettez-le à la méthode add ()" **.

Écrivez le numéro dans votre tête sur la carte et remettez-la.

Peu importe ce que fait la méthode add (), le nombre dans la tête de num_sender ne change pas. Cependant, dans ce cas ...

ex2


	public static void main(String[] args) {
		int num_sender = 1;
		num_sender = add(num_sender);
		System.out.println(num_sender);//C'est 2
	}

	private static int add(int num_receiver) {
		num_receiver += 1;
		return num_receiver;
	}

Est explicitement ordonné par num_sender ** "Souvenez-vous des nombres modifiés !!!" **, donc la sortie sera "2". Oui bien sur.

Certains peuvent penser que c'est trop facile, mais restez à l'écoute jusqu'à la fin. Ce sera efficace plus tard.

Basique 2: Par référence

ex3


	public static void main(String[] args) {
		List<String> onlyOneList = new ArrayList<String>();
		onlyOneList.add("2018");
		replaceFirstItemTo2019(onlyOneList);
		System.out.println(onlyOneList.get(0));//"2019"
	}

	//Le premier élément de la liste sera 2019
	private static void replaceFirstItemTo2019(List<String> another_hensu) {
		another_hensu.add(0, "2019");
	}

J'ai essayé de rendre le nom de variable un peu vulgaire, mais pour le moment, imaginez que passer par référence, c'est "manipuler un seul objet (objet)".

Cependant, si vous vous sentez toujours mal à l'aise, pensez de cette façon. Le contenu de la variable "onlyOneList-kun" fait ** une sieste dans la chambre 20 de l'hôtel de luxe "memory". ** ** ** La salle 20 a été en quelque sorte décidée lorsque j'ai créé la nouvelle ArrayList ();. ** **

...... Je l'ai écrit à la légère, mais c'est un endroit très important, alors souvenez-vous-en. ………… Est-ce vraiment important? Vous avez dit ça?

Cela étant dit, ce qui est passé à la méthode replaceFirstItemTo2019 () «Salle 20» Voilà l'information.

Ainsi, dans la méthode replaceFirstItemTo2019 (), le premier élément de la seule liste qui dort dans la salle 20 est réécrit en «2019». Les informations qui sont finalement sorties sont les informations qui ont été réécrites comme "Informations sur la salle 20", c'est-à-dire "Nous sommes en 2019".

C'est ce que les gens de Java Chottodex appellent «passer par référence». Quelle est la différence entre «référence» et «valeur de référence» ici? Si vous pensez ... Oubliez ça car il n'y a pas assez de place.

Eh bien, l'examen est terminé. C'est une petite application d'ici.

C'est difficile, n'est-ce pas Java

Veuillez lire ce code.

ex_4


	public static void main(String[] args) {
		List<String> onlyOneList = new ArrayList<String>();
		onlyOneList.add("2018");
		replaceFirstItemTo2019(onlyOneList);
		System.out.println(onlyOneList.get(0));//"2018"
	}

	//Le premier élément de la liste sera 2019
	private static void replaceFirstItemTo2019(List<String> another_hensu) {
		another_hensu = new ArrayList<String>();
		another_hensu.add(0, "2019");
	}

Nande est toujours 2018! ?? ?? ?? ** Pas plus ... c'est fini **

Il y a des moments où vous faites cela en pratique sans blague. Faisons attention!

C'est la seule ligne que j'ai réécrit de l'exemple précédent.

another_hensu = new ArrayList<String>();

Mais c'est un gâchis et une chose sérieuse. Souvenez-vous de ce que j'ai écrit plus tôt.

Le contenu de la variable "onlyOneList-kun" est un hôtel de luxe"memory"Je fais une sieste dans la chambre 20.
Le numéro de la salle 20 est une nouvelle liste de tableaux<String>();D'une manière ou d'une autre, cela a été décidé quand je l'ai fait.

En d'autres termes, la nouveauté est ** "allouer une chambre dans un hôtel (mémoire) et ensuite créer une nouvelle chose (objet)" **. Ici, la "salle 21" ou un autre numéro de chambre différent de la salle 20 est assignée au contenu de "anothe_hensu-kun", puis une nouvelle liste est née. Et les informations enregistrées par la variable "onlyOneList-kun" restent "Room 20". Pour aggraver les choses, List n'est plus le seul à ce stade!

Ainsi, "2019 is 2019" est stocké dans la liste de "Room 21", mais il n'y a aucun changement dans la liste de "Room 20" qui est l'information détenue par "onlyOneList-kun", et c'est "2018" tel quel. "Est sortie. ...... C'est.

Pour le type String

Si vous avez lu jusqu'ici, vous pouvez le comprendre.

ex0


	public static void main(String[] args) {
		String str1 = "Chaîne 1";
		translate(str1);
		System.out.println(str1);//Chaîne 1
	}
	private static void translate(String str2) {
		str2 = "Chaîne 2";
	}

Dans ce code, le type String est certainement un "objet" et est passé "passe par référence".

Mais le type String est "immuable". …… Que voulez-vous dire Ya? Cela signifie que vous ne pouvez pas jouer directement avec l'objet.

……

** …… Que voulez-vous dire Ya! ?? Être tranchant! !! ?? ** **

Premièrement, comme prémisse, dans le cas de String, "exceptionnellement"


String str1 = "Chaîne 1";

Avec cette seule description, un objet de type String est "né et stocké dans une pièce appropriée dans la" mémoire "de l'hôtel de luxe". Disons que vous êtes né dans la "salle 22" cette fois.

Je vais à nouveau changer le style d'écriture.

(String)Nom de variable= "hoge";

** Avec cette seule description, un objet de type String est "né et stocké dans une pièce appropriée dans la" mémoire "de l'hôtel de luxe". ** **

Qu'est-ce que ça veut dire?

str2 = "Chaîne 2";

Au moment où j'écris ceci, "la chambre 23" (je ne sais pas si c'est la chambre 24 ou 5 000 trillions, mais de toute façon, c'est dans une autre pièce que la chambre 22) est née. Ensuite, comment changer "Chaîne de caractères 1" dormir dans "Chambre 22" ...! ??

** Il n'y a pas une telle chose. ** ** C'est dommage. Laissons tomber. Après tout, cela signifie «le type de chaîne est immuable» ou «l'objet ne peut pas être modifié directement».

Le contenu (valeurs) des variables vues par la personne qui écrit le programme peut être réécrit. Cela signifie que vous pouvez réécrire «Salle 22» en «Salle 23».

Par conséquent, ce comportement devient un comportement de base type = passage par valeur. C'est tout.

Application: Que fait le type String après tout?

(Vous pouvez sauter cette section)

en bref,

String str1 = "Chaîne 1";

Est

String str1 = new String("Chaîne 1");

C'est un sucre de syntaxe de. c'est tout!









Je suis désolé, c'est un mensonge. Je suis désolé. Je le savais jusqu'à ce que j'écrive cet article, mais il y a une contre-preuve ...

ex_*


	public static void main(String[] args) {
		String a = "Ah";
		String b = "Ah";
		System.out.println(a == b); //true
	}

** Oh, tu étais vrai ... ** Même si un débutant essaie ce comportement et demande à diverses personnes, "Êtes-vous ???. Égal () Vous pouvez comparer avec == sans prendre la peine de l'utiliser ???" Vous ne pouvez pas l'obtenir. ** J'étais. ** **

(Référence) ** En Java, "Hoge" n'est pas simplement un nouveau sucre de syntaxe String ("Hoge") ** http://blog.supermomonga.com/articles/java/difference-bewtween-two-way-to-create-string-instanc.html

Probablement, il existe un mécanisme pour réutiliser des objets pour la même chaîne de caractères exacte pour économiser de la mémoire. → C'était la bonne réponse. ** Différence entre l'initialisation par "" (guillemets doubles) et l'initialisation par une nouvelle chaîne ("") ** http://education.yachinco.net/tips/java/06/2.html

Je suis heureux.

référence

** Ne l'appelez plus par référence ** https://qiita.com/mdstoy/items/2ef4ada6f88341466783

la fin. Nous vous verrons quelque part.

Recommended Posts

[Pour les débutants] Un article qui vous fait comprendre 5 000 billions de% du «passage par référence» compliqué de Java