Maison  >  Article  >  Java  >  Quelle est la différence entre jdk1.7 et jdk1.8

Quelle est la différence entre jdk1.7 et jdk1.8

青灯夜游
青灯夜游original
2020-12-14 17:17:5113588parcourir

Différence : La génération permanente a été annulée dans jdk1.8 et remplacée par Metaspace. Cet espace n'occupe pas la mémoire de la machine virtuelle jvm, mais la mémoire de la machine physique ajoute les expressions lambda et l'accès local ; Variables, interfaces fonctionnelles et autres fonctionnalités.

Quelle est la différence entre jdk1.7 et jdk1.8

Comparaison entre jdk1.7 et jdk1.8

1. jdk1 .7 Syntaxe

1) Vous pouvez utiliser le binaire pour représenter des entiers, en commençant par 0b.

2) L'instruction Switch prend en charge le type de chaîne

3) Le bloc try peut être fermé manuellement sans finalement, il peut être fermé directement dans le bloc try

4) Attraper plusieurs Description de l'exception : Le type d'exception Catch est final et ne peut donc pas être modifié. Cette fonctionnalité générera moins de bytecode et réduira la redondance du code. Conservez le type d’exception lors de la nouvelle exécution de l’exception.

5) Les soulignements peuvent être utilisés dans les chiffres, ce qui est plus convivial. Mais faites attention aux règles d'ajout de soulignements. Les soulignements ne peuvent être utilisés qu'entre les nombres. Les soulignements ne doivent pas être utilisés au début ou à la fin des nombres.

6) Lors de la création d'une instance générique, le type générique de l'instance sera automatiquement déduit en fonction du type générique lorsque la variable est déclarée.

7) Transmettez les paramètres non réifiés dans les méthodes à paramètres variables pour améliorer les avertissements et les erreurs de compilation.

8) Retour en arrière plus informatif.

2. Quelques nouvelles fonctionnalités de NIO2

1) Implémenter des IO asynchrones non bloquantes et Proactor

2) Recherche récursive de l'arborescence de fichiers, fichier recherche d'extension

3. Jdbc

1) Vous pouvez utiliser try-with-resources pour fermer automatiquement les objets de ressources Connection, ResultSet et Statement.

2) RowSet1.1 (modèle d'interface) : En présentant l'interface RowSetFactory et la classe RowSetProvider, vous pouvez créer divers ensembles de lignes pris en charge par le pilote JDBC. L'implémentation de l'ensemble de lignes ici convertit en fait certaines opérations sur l'instruction SQL en méthodes. L'opération encapsule certaines fonctions.

3) Le pilote JDBC-ODBC sera supprimé dans jdk8.

4. Améliorations de l'outil de concurrence

1) fork-join, le framework Fork/Join est un framework pour l'exécution parallèle de tâches fourni par Java7. la grande tâche est divisée en plusieurs petites tâches, et enfin les résultats de chaque petite tâche sont résumés pour obtenir le cadre des résultats de la grande tâche. (Exploitez pleinement les fonctionnalités multicœurs pour décomposer les gros problèmes en sous-problèmes. Plusieurs processeurs peuvent résoudre plusieurs sous-problèmes en même temps et enfin fusionner les résultats).

2) La classe de génération simultanée de nombres aléatoires ThreadLocalRandon assure la sécurité des threads de la génération simultanée de nombres aléatoires. En fait, elle utilise threadlocal.

3) La classe phaser

java5 a un package concurrent. Il existe un sémaphore (sémaphore), CountDownLatch (verrouillage) et CyclicBarrier (clôture). La classe phaser optimise CountDownLatch et CyclicBarrier.

Sémaphore : Un sémaphore peut déclarer plusieurs verrous (dont un verrou : c'est un sémaphore mutuellement exclusif).

Par exemple : Si une chambre ne peut accueillir que 5 personnes, les personnes supplémentaires doivent attendre devant la porte. Comment faire ? Une solution est la suivante : accrochez cinq clés à l'extérieur de la pièce, et chaque personne qui entre en retire une. Ceux qui n'ont pas de clés ne peuvent pas entrer dans la pièce mais attendent à l'extérieur. Chaque personne qui sort remet la clé à sa place d'origine pour faciliter la réentrée des autres.

est principalement utilisé pour contrôler le nombre maximum de threads accessibles. La valeur par défaut est injuste. L'équité des verrous peut être explicitement déclarée via le constructeur.

Latching :

Signification : CountDownLatch peut être compris comme un compteur définissant la valeur initiale lors de l'initialisation lorsqu'un thread doit en attendre. opérations en premier Une fois terminée, la méthode wait() doit être appelée. Cette méthode met le thread en veille jusqu'à ce que tous les threads en attente aient terminé leur exécution. Chaque fois que la méthode countDown() est appelée, le compteur interne est décrémenté de 1 jusqu'à ce qu'il se réveille lorsque le compteur atteint 0. Cela peut être compris comme une CyclicBarrier spéciale. Le point de synchronisation du thread est spécial, commençant lorsque la valeur du compteur interne atteint 0.

Méthodes : Deux méthodes principales : countDown() et wait(). countDown() : Décrémentez le compteur interne maintenu par CountDownLatch de 1 et appelez-le lorsque chaque thread en attente est terminé.

await() : Lorsque le thread exécute CountDownLatch, le thread sera mis en veille.

Exemple : Exemple de réunion : Attendez dans la salle de conférence que tous les participants arrivent avant que la réunion puisse commencer.

Clôture :

Signification : Une clôture permet à deux ou plusieurs threads de se synchroniser à un certain point de rendez-vous. Lorsqu'un thread atteint le point de rendez-vous, il appelle la méthode wait() pour attendre les autres threads. Une fois que le thread a appelé la méthode wait(), CyclicBarrier bloquera le thread et le mettra en veille pour attendre l'arrivée d'autres threads. Lorsque le dernier thread appelle la méthode wait(), CyclicBarrier réveillera tous les threads en attente, puis ces threads poursuivront leur exécution. CyclicBarrier peut transmettre un autre objet Runnable comme paramètre d'initialisation. Lorsque tous les threads arrivent au point de rendez-vous, la classe CyclicBarrier exécute l'objet Runnable en tant que thread.

Méthode : wait() : Mettre le thread en veille jusqu'à l'arrivée du dernier thread et réveiller tous les threads endormis.

La différence avec CountDownLatch :

Accepte un objet de type Runnable comme exécution ultérieure une fois que tous les threads arrivent au point de rendez-vous

N'appelle pas explicitement la méthode CountDown()

CountDownLatch ne peut généralement être utilisé qu'une seule fois, tandis que CyclicBarrier peut être utilisé plusieurs fois

Scénario d'application : plusieurs threads effectuent des tâches, et après avoir atteint le point de rendez-vous pour la synchronisation, ils sont transmis aux threads suivants. pour résumé.

Phaser :

Signification : Une classe auxiliaire de synchronisation plus complexe et plus puissante. Il permet l'exécution simultanée de tâches en plusieurs étapes. Lorsque nous avons des tâches simultanées et que nous devons les diviser en plusieurs étapes pour leur exécution (CyclicBarrier est divisé en deux étapes), nous pouvons choisir d'utiliser Phaser. Le mécanisme de la classe Phaser synchronise les threads à la fin de chaque étape. Lorsque tous les threads ont terminé cette étape, l'étape suivante peut être exécutée. Comme les autres outils de synchronisation, le nombre de tâches participant aux opérations de synchronisation dans la classe Phaser doit être initialisé. La différence est que le nombre de tâches peut être augmenté ou diminué de manière dynamique.

Fonction : arriveAndAwaitAdvance() : Semblable à la méthode wait() de CyclicBarrier, elle attend l'arrivée d'autres threads et continue l'exécution de manière synchrone. arriveAndDeregister() : déconnectez-vous du thread exécuté ici depuis Phaser. isTerminate() : détermine si Phaser est terminé. register() : Enregistrez un nouveau participant dans Phaser. Ce nouveau participant sera considéré comme un fil de discussion n'ayant pas terminé cette phase. forceTermination() : force Phaser à entrer dans l'état de terminaison

Exemple : utilisez la classe Phaser pour synchroniser trois tâches simultanées. Ces trois tâches rechercheront les fichiers avec une extension .log qui ont été modifiés au cours des dernières 24 heures dans trois dossiers différents et leurs sous-dossiers. Cette tâche est divisée en trois étapes suivantes : rechercher des fichiers, filtrer les fichiers et imprimer les résultats. Et après avoir recherché et filtré les fichiers, analysez les résultats. S'ils sont vides, déconnectez-vous de ce fil de discussion. En d’autres termes, à l’étape suivante, le thread ne participera pas à l’exécution. Dans la méthode run(), la méthode arriveAndAwaitAdvance() du phaser est appelée au début pour garantir que tous les threads sont démarrés avant de commencer la recherche de fichiers. Après les phases de recherche de fichier et de filtre de fichier, les résultats sont traités. Autrement dit : si le résultat est vide, supprimez le thread. S'il n'est pas vide, attendez que tous les threads de cette étape terminent l'étape avant d'exécuter l'étape suivante de manière uniforme. Enfin, une fois la tâche exécutée, tous les threads de Phaser sont déconnectés.

Phaser a en fait deux états : l'état actif et l'état terminé. Phaser est actif lorsque des threads participent à la synchronisation. Et synchronisé à la fin de chaque étape. Lorsque tous les threads participant à la synchronisation ne sont pas enregistrés, Phase est à l'état terminé. Dans cet état, Phaser n’a aucun participant à la tâche.

La fonction principale de Phaser est d'exécuter des tâches en plusieurs étapes et d'assurer la synchronisation des threads à chaque étape. Il est également possible de conditionner ou de retirer des participants à chaque étape. Il s'agit principalement des méthodes arriveAndAwaitAdvance() et register() et arriveAndDeregister().

4) Améliorations du réseau

La nouvelle méthode de fermeture URLClassLoader peut fermer les ressources à temps, et le rechargement ultérieur des fichiers de classe n'entraînera pas d'occupation des ressources ou d'incapacité à libérer des problèmes.

5) Chargeurs de classes personnalisés multithreads

Résolvez le problème de blocage qui peut être causé par le chargement simultané de classes. Ceci est résolu par certaines nouvelles versions de jdk1.6, et jdk7 a également apporté quelques optimisations. .

Java1.8

1. Méthodes par défaut des interfaces

Avant Java1.8, toutes les méthodes de l'interface devaient être des méthodes abstraites, java 8 Nous permet d'ajouter une implémentation de méthode non abstraite à l'interface, utilisez simplement le mot-clé par défaut.

2. Expression Lambda

Elle va nous permettre de transmettre un comportement dans la fonction. Avant Java 8, si vous souhaitiez transmettre un comportement à une fonction, votre seule option était une classe anonyme, qui nécessitait 6 lignes de code. La ligne de code la plus importante qui définit le comportement est enfouie au milieu et ne ressort pas suffisamment. Les expressions Lambda remplacent les classes anonymes, éliminant les modèles et permettant d'écrire du code dans un style fonctionnel. Cela se traduit parfois par une meilleure lisibilité et une expression plus claire.

3. Interface fonctionnelle

Si une interface définit une méthode abstraite unique, alors cette interface devient une interface fonctionnelle. Une propriété très précieuse des interfaces fonctionnelles est qu’elles peuvent être instanciées à l’aide de lambdas.

4. Références de méthode et de constructeur

Utilisez des mots-clés pour transmettre des références de méthode ou de constructeur.

5. Portée Lambda

La manière d'accéder à la portée externe dans les expressions lambda est très similaire à celle des anciennes versions d'objets anonymes. Vous pouvez accéder directement aux variables locales externes marquées comme finales, ou aux champs d'instance et aux variables statiques.

6. Accéder aux variables locales

Vous pouvez accéder directement aux variables locales externes dans les expressions lambda.

7. Accéder aux champs d'objet et aux variables statiques

Différents des variables locales, les champs internes de lambda et les variables statiques des instances sont à la fois lisibles et inscriptibles. Ce comportement est cohérent avec les objets anonymes.

8. Méthode par défaut d'accès à l'interface

L'API JDK1.8 contient de nombreuses interfaces fonctionnelles intégrées, couramment utilisées dans l'ancien Java, telles que les interfaces Comparator ou Runnable. Ces interfaces ont ajouté des annotations afin qu'elles puissent être utilisées avec les lambdas.

Java 8API fournit également de nombreuses nouvelles interfaces fonctionnelles pour rendre le travail plus pratique. Certaines interfaces sont issues de la bibliothèque Google Guava Même si vous les connaissez, il est quand même nécessaire de jeter un œil à celles-ci. Comment étendre. c'est à lambda.

Pour plus d'articles connexes, veuillez visiter le Site Web PHP chinois ! !

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn