Objet de l'article
Nous avons résumé le contenu de l'examen Java Programmer Gold SE 8.
C'est pour le créneau, "Je fais Java depuis longtemps, mais je ne sais pas grand-chose sur SE8."
Comment avez-vous écrit cet article?
L'autre jour, j'ai pris et passé le Java SE 8 Programmer II (1Z0-809) et j'ai obtenu le Oracle Certified Java Programmer, Gold SE 8.
Je l'ai acquis une fois lorsque j'étais en Java2, mais il était clairement différent du niveau de connaissances requis par le monde aujourd'hui, alors j'ai décidé de réétudier dans le sens de mettre à jour mes propres connaissances. La connaissance de SE8 devient essentielle même dans le développement Android.
Il y a quelque chose qui résume la portée de l'examen pour moi lorsque je passe l'examen, mais je ne supporte pas de le garder tel quel une fois l'examen terminé, alors j'ai décidé de le laisser sous forme d'article. Je serais très heureux si cela pouvait profiter à n'importe qui.
Résumé des points
Les bases de Java
Préfixe littéral numérique
Le préfixe ajouté au début du numéro détermine le numéro de base.
- "0b" ... binaire
- "0" ... nombre octal
- Aucun ... nombre décimal
- "0x" ... hexadécimal
Délai d'initialisation de la variable finale
Les variables d'instance avec le modificateur final doivent être initialisées dans le constructeur
Ordre d'initialisation par initialiseur et constructeur
Le traitement lié à l'initialisation des objets est exécuté dans l'ordre suivant
- initialiseur statique
Lors du chargement d'une classe
- Initialiseur d'instance
Lors de la création d'une instance, avant d'exécuter le constructeur
La déclaration d'une variable ne l'exécute pas. Besoin d'instanciation
- Constructeur
Héritage de valeur d'énumération et implémentation d'interface
- Les méthodes d'énumération «name ()» et «toString ()» renvoient leur propre représentation sous forme de chaîne.
name ()
est définitif et ne peut pas être remplacé. toString ()
est possible
- Les types d'énumération peuvent implémenter des interfaces et définir des méthodes abstraites. Si vous faites cela, vous devez remplacer chaque valeur d'énumération
- Si vous voulez obtenir la valeur énumérée à partir d'une chaîne, vous pouvez utiliser la méthode
valueOf ()
Remarques sur les valeurs énumérées
- Vous pouvez définir un constructeur pour la valeur énumérée, mais l'instanciation par new n'est pas autorisée, donc l'ajout de public ou protected au constructeur entraînera une erreur de compilation.
Si rien n'est attaché, la compilation passera, mais une nouvelle ne peut pas être effectuée (une erreur de compilation se produira).
- Si vous définissez un champ sans déclaration finale, la valeur de ce champ peut être modifiée à tout moment.
enum Direction {
North(0), South(1);
//Si vous ne déclarez pas final, vous pouvez modifier cette valeur
int index;
private Direction(int index) { this.index = index; }
}
//Exemple de modification du champ d'index de Direction
Direction d = Direction.North;
System.out.println(d.index); // 0
d.index = 10;
System.out.println(d.index); // 10
hashCode () et equals ()
- Les deux conditions suivantes sont requises pour que plusieurs objets aient la même valeur.
- La valeur de retour (valeur de hachage) de
hashCode ()
est la même
- ʻEquals () ʻest vrai
- L'enregistrement en double est le suivant. Si les deux sont établis, ils sont considérés comme ayant la même valeur
- Vérifiez si les valeurs de hachage sont les mêmes
- Comparez avec ʻequals () ʻuniquement pour ceux avec la même valeur de hachage
- Lors de l'implémentation de
hashCode ()
, implémenter de sorte que les valeurs soient renvoyées par les objets avec la même valeur.
- L'argument de ʻequals () ʻest Object. S'il est du même type que le récepteur, la dérogation ne sera pas établie et la surcharge sera établie. Aucune erreur de compilation
Méthode d'interface
- La méthode d'instance définie dans l'interface peut être une méthode abstraite publique. Même s'il y a une description telle qu'un résumé, la compilation passera
- Dans une situation où plusieurs interfaces ont la méthode par défaut avec le même nom défini, si les deux sont héritées ou implémentées, la méthode par défaut est en conflit et une erreur de compilation se produit.
Cependant, le remplacement de la méthode par défaut du côté de l'héritage ou de l'implémentation résout l'erreur.
interface Sample {
// "public abstract"Compile avec ou sans
public abstract void execute();
}
interface A { default void execute() { System.out.println("A"); } }
interface B { default void execute() { System.out.println("B"); } }
interface C extends A, B {
//Ne pas commenter cela éliminera l'erreur de compilation
// default void execute() { System.out.println("C"); }
}
Conditions pour que la dérogation soit maintenue
- Lors du remplacement d'une méthode, la valeur de retour doit être la même que ou une sous-classe du type superclasse
- Le remplacement de méthode ne tient pas sauf si la correspondance suivante Surcharge même si la commande ne correspond pas
- Nom de la méthode
- Type d'argument
- Ordre des arguments
- les méthodes statiques et les champs statiques peuvent également être redéfinis dans les sous-classes
Cependant, il est "masqué" plutôt que remplacé, vous ne pouvez donc pas utiliser le mot clé super pour appeler la méthode statique parente.
Classe locale de méthode
- Vous pouvez vous référer aux variables de la méthode directement à partir de la classe locale de la méthode, mais les variables doivent être pratiquement finales. Même s'il n'y a pas de déclaration finale, elle sera automatiquement traitée comme finale lorsqu'elle sera référencée à partir de la classe locale de la méthode. C'est la même chose pour Lambda
- Si vous donnez une variable de méthode à une classe locale de méthode dans le constructeur, vous n'avez pas à la rendre définitive car la variable d'origine n'est pas directement référencée.
- Si vous souhaitez faire référence à une variable membre d'une classe en dehors de la méthode à partir d'une classe locale de méthode, vous pouvez modifier la variable membre.
Style Lambda
- Le type de données d'argument peut être omis
- S'il y a un argument, "()" peut être omis
- S'il y a une expression sur le côté droit, "{}" peut être omis, qu'il y ait ou non une valeur de retour du côté droit.
- S'il y a une expression sur le côté droit et qu'une valeur de retour est renvoyée, return peut être omis.
Interface fonctionnelle
Relatif à la fonction
Interface |
Méthode |
Type de retour |
Function<T, R> |
apply(T t) |
R |
UnaryOperator<T> |
apply(T t) |
T |
BinaryOperator<T> |
apply(T t1, T t2) |
T |
BiFunction<T, U, R> |
apply(T t, U u) |
R |
Lié aux consommateurs
Interface |
Méthode |
Type de retour |
Consumer<T> |
accept(T t) |
void |
BiConsumer<T, U> |
accept(T t, U u) |
void |
Lié au prédicat
Interface |
Méthode |
Type de retour |
Predicate<T> |
test(T t) |
boolean |
BiPredicate<T, U> |
test(T t, U u) |
boolean |
Supplier
Interface |
Méthode |
Type de retour |
Supplier<T> |
get() |
T |
Interface fonctionnelle qui accepte les types primitifs
- Chacun de int, long et double a sa propre interface fonctionnelle.
** boolean a également uniquement BooleanSupplier **
- Les noms de méthode pour «Supplier», «UnaryOperator» et «BinaryOperator» sont les suivants.
** Règle: [Nom de la méthode] As [Type de données] **
Exemple: ʻapplyAsInt
,
getAsBoolean`, etc.
Type de données |
Function |
Consumer |
Predicate |
Supplier |
UnaryOperator |
BinaryOperator |
int |
IntFunction<R> |
IntConsumer |
IntPredicate |
IntSupplier |
IntUnaryOperator |
IntBinaryOperator |
long |
LongFunction<R> |
LongConsumer |
LongPredicate |
LongSupplier |
LongUnaryOperator |
LongBinaryOperator |
double |
DoubleFunction<R> |
DoubleConsumer |
DoublePredicate |
DoubleSupplier |
DoubleUnaryOperator |
DoubleBinaryOperator |
boolean |
- |
- |
- |
BooleanSupplier |
- |
- |
Interface fonctionnelle qui renvoie un type primitif
Nom de l'interface |
Méthode |
La description |
ToIntFunction<T> |
applyAsInt(T t) |
Renvoie un entier à partir d'une valeur de type T |
ToIntBiFunction<T, U> |
applyAsInt(T t, U u) |
Renvoie un entier à partir des valeurs T et U |
ToLongFunction<T> |
applyAsLong(T t) |
Renvoie long à partir d'une valeur de type T |
ToLongBiFunction<T, U> |
applyAsLong(T t, U u) |
Renvoie long à partir des valeurs T et U |
ToDoubleFunction<T> |
applyAsDouble(T t) |
Renvoie un double à partir d'une valeur de type T |
ToDoubleBiFunction<T, U> |
applyAsDouble(T t, U u) |
Renvoie le double des valeurs T et U |
Référence de la méthode
- Ne peut être utilisé que dans une interface fonctionnelle
- Lorsque vous prenez un argument, écrivez-le de la même manière qu'une référence de méthode statique.
collection
Arrays#asList
- La liste générée par ʻArrays # asList` se réfère uniquement au tableau donné dans l'argument. Les modifications apportées au tableau d'origine seront également reflétées dans la liste
- La liste générée par ʻArrays # asList
est ** incompatible avec ʻArrayList <E>
. ** La diffusion échoue
La nature de la classe de collection et comment la distinguer
List
est l'ordre de l'index en principe
Set
et Map
distinguent leurs propriétés par le préfixe du nom de la classe
- Les classes commençant par
Linked
seront insérées dans le même ordre
- Les classes commençant par
Tree
sont triées par ordre naturel. Lorsqu'il est disposé dans l'ordre naturel, il devient ** nombre → alphabet (grand) → alphabet (petit) **
La nature de l'interface de file d'attente
- Il existe deux types de méthodes d'insertion / suppression / vérification, et le comportement lorsque l'exécution de la méthode échoue est différent.
- Il y a une exception
- Insérer… ʻajouter (E) `
- Supprimer ...
remove ()
- Inspection…
get ()
- Renvoyer null
- Insérer… ʻoffer (E) `
- Supprimer ...
poll ()
- Inspection…
peek ()
- Élément inaccessible par index
La nature de l'interface Deque
- La différence avec
Queue
est que vous pouvez insérer ou supprimer des éléments au début ou à la fin, comme le nom de ** Double Ended Queue ** l'indique.
- Il y a une exception
- Insérer… ʻaddFirst (E)
,
push (E) / ʻaddLast (E)
- Supprimer…
removeFirst ()
/ removeLast ()
- Inspection…
getFirst ()
, pop ()
/ getLast ()
- Renvoyer null
- Insérer… ʻofferFirst (E)
/ ʻoffset Last (E)
- Supprimer ...
pollFirst ()
/ pollLast ()
- Inspection…
peekFirst ()
/ peekLast ()
- Identique à
Queue
, l'élément n'est pas accessible par index
- L'extension d'interface
Queue
dans le package java.util.concurrent
a également une méthode qui vous permet de définir un délai.
L'attente ne se produit pas toujours, et l'attente se produit lorsque vous ne pouvez pas insérer ou supprimer
- L'implémentation de
Deque
, ʻArrayDeque`, ne peut pas contenir de valeurs nulles.
Génériques
Génériques et paramètres de type
- Lors de la déclaration d'un paramètre de type pour une classe, le paramètre de type ne peut pas être utilisé aux fins suivantes:
- membre statique
- Génération d'instances et de tableaux avec le nouvel opérateur
- Validation de type avec ʻinstanceof`
- Référence à
.class
- Le type peut être spécifié ou non lors de l'utilisation d'une méthode à laquelle un paramètre de type est appliqué.
- La syntaxe du type générique est la suivante
** classe nom de classe <type paramètre (, type paramètre n)> {...} **
- Lorsque vous utilisez des paramètres de type dans les déclarations de classe, vous pouvez utiliser le mot clé extend mais pas le mot clé super
- La syntaxe de la méthode est la suivante
Déclaration: ** return type method name (type argument name) {...} **
Utilisez: ** Receiver. Nom de la méthode (Tapez le nom de l'argument) {...} **
Caractère générique
- Les caractères génériques sont
"? "
(" * "ʻEst Kotlin) au lieu de
" * "`
- Les caractères génériques ne peuvent pas être utilisés pour les paramètres de type dans les déclarations de classe
- Le type du caractère générique n'est pas fixé tant qu'il n'est pas exécuté, donc si vous utilisez le caractère générique pour ajouter le type de données à l'intérieur de la liste spécifiée, une erreur de compilation se produira.
L'exception est que la liste déclarée avec «<? Super XXXXX>» peut contenir des objets du même type que XXXXX.
- Lors de l'utilisation de jokers, aucune erreur de compilation ne se produira sauf s'il y a un problème dans la plage qui peut être jugé à partir du contenu déclaré. Erreur de compilation s'il devient clair que les types sont incompatibles
Où une erreur de compilation se produit lors de l'utilisation de caractères génériques pour les paramètres de type
- L'utilisation de jokers pour les paramètres de type provoque une erreur de compilation à ** l'endroit où vous ajoutez réellement l'objet **
Comparable et comparateur
Interface comparable
- Appartient au package
java.lang
- Interface à comparer
- La seule méthode qui devrait être implémentée dans
Comparable
est compareTo (To)
. Renvoie une valeur négative si inférieure à la comparaison, zéro si égale, positive si supérieure
- Lors de la déclaration d'une classe, le paramètre type de «Comparable » reçoit le type de l'objet que «compareTo» prend comme argument.
Interface du comparateur
- Appartient au package
java.util
- Interface de comparaison. Notez que la cible de comparaison n'est pas limitée à ceux qui implémentent l'interface «Comparable».
- Les deux méthodes suivantes doivent être implémentées dans
Comparator
(ʻequals` est facultatif)
compare(T t1, T t2)
equals(T o)
compare (T t1, T t2)
renvoie une valeur positive si t1 est supérieur à t2, zéro si t1 et t2 sont égaux, et une valeur négative si t1 est inférieur à t2.
Stream API
Générer un flux avec un nombre fini d'éléments
Collection#stream()
-> Stream<E>
Arrays#stream(E[] array)
-> Stream<E>
Arrays#stream(int[] array)
-> IntStream
Arrays#stream(long[] array)
-> LongStream
Arrays#stream(double[] array)
-> DoubleStream
Stream#of(E… values)
-> Stream<E>
Stream#empty()
-> Stream<E>
IntStream#of(int… values)
-> IntStream
LongStream#of(long… values)
-> LongStream
DoubleStream#of(double… values)
-> DoubleStream
IntStream#range()
/ IntStream#rangeClosed()
-> IntStream
LongStream#range()
/ LongStream#rangeClosed()
-> LongStream
BufferedReader#lines()
-> Stream<String>
java.nio.file.Files#lines()
-> Stream<String>
Générer un flux avec un nombre infini d'éléments
Les deux méthodes de java.util.stream.Stream
generate(Supplier<T> supplier)
Générer un Stream
qui contient un nombre infini d'éléments fournis par le fournisseur
iterate(T seed, UnaryOperator<T> f)
Seed est le premier élément, et après cela, il produit un Stream qui contient l'élément précédent multiplié par f indéfiniment.
Opération de terminaison de flux
- Une seule opération de terminaison sur le même flux. Si vous le faites plusieurs fois, vous obtiendrez ʻIllegalStateException`
- Rien n'est fait simplement en appelant l'opération intermédiaire, rien n'est fait à moins que l'opération de terminaison ne soit appelée. Tout le traitement est exécuté lorsque l'opération de terminaison est appelée
- Dans le traitement du pipeline, toutes les opérations intermédiaires / de terminaison sont effectuées une par une dans le flux, puis l'élément suivant est traité.
En d'autres termes, ** "Opération intermédiaire de l'élément 1 x m-> Opération de terminaison de l'élément 1" ⇒ "Opération intermédiaire de l'élément 2 x m-> Opération de terminaison de l'élément 2" ⇒ ... ⇒ "Opération intermédiaire de l'élément n x m-> Terminaison de l'élément n" Opération "**
Stream # réduire la valeur de retour
Stream # reduction
est une méthode pour agréger le contenu de Stream
. Dans la méthode qui définit la valeur initiale dans le premier argument, la valeur de retour n'est pas ʻOptional`
reduction (BinaryOperator op)
... La valeur de retour est ʻOptional `
reduction (T initial, BinaryOperator op)
... La valeur de retour est T
Opération de terminaison avec une valeur de retour facultative
- La valeur de retour est ʻOptional` par la méthode suivante
findAny ()
... Les résultats peuvent changer à chaque fois que vous exécutez
findFirst ()
... Le même résultat peut être obtenu quel que soit le nombre de fois qu'il est exécuté.
min()
max()
reduce(BinaryOperator op)
- Le type de ʻOptional
diffère selon le type de
Stream`. Par exemple, «findAny ()» est comme suit
Stream#findAny()
… Optional<T>
IntStream#findAny()
… OptionalInt
LongStream#findAny()
… OptionalLong
DoubleStream#findAny()
… OptionalDouble
Créer une instance de facultatif
- ʻOptional # of (T value) `... value ne peut pas être nul
- ʻOptional # ofNullable (T value) `... la valeur peut être nulle
OptionalInt#of(int value)
OptionalLong#of(long value)
OptionalDouble#of(double value)
Facultatif # ifPresent et Facultatif # isPresent
- Il existe deux méthodes pour déterminer s'il existe une valeur (nulle ou non nulle):
- ʻisPresent () `… Détermine la présence ou l'absence d'une valeur
- ʻifPresent (Consumer)
… Exécutez
Consumer` s'il y a une valeur
Il existe plusieurs méthodes pour récupérer une valeur à partir de Facultatif
«La méthode pour obtenir la valeur de Option » est la suivante. Si une valeur existe, cette valeur est obtenue, mais si elle n'existe pas, le comportement est différent.
get()
NoSuchElementException
s'il n'existe pas
orElse(T)
Renvoie un argument s'il n'existe pas
orElseGet(Supplier<T>)
Renvoie la valeur renvoyée par Supplier
si elle n'existe pas
orElseThrow(Supplier<X extends Exception>)
Lève une exception renvoyée par Supplier
si elle n'existe pas
Types facultatifs spécifiques à un type de données particulier
«La méthode pour récupérer la classe et la valeur de Optional » est la suivante
Optional<T>#get()
OptionalInt#getAsInt()
OptionalLong#getAsLong()
OptionalDouble#getAsDouble()
Conversion de type entre Stream et XXXStream
- La conversion entre les mêmes types de
Stream
estmap ()
- La conversion en type
Stream <T>
est mapToObj ()
- Le type ʻConversion to IntStream
est
mapToInt () `
- La conversion en type
LongStream
est mapToLong ()
- La conversion en type
DoubleStream
est mapToDouble ()
Méthode Stream # collect () et classe Collector
collect ()
est une méthode qui agrège les éléments dans Stream
pour obtenir un objet.
- La classe
Collectors
fournit une implémentation appropriée de l'interface Collector
.
De par sa nature même, il a quelques méthodes et rôles de la classe Stream
.
exception
Error、Exception、 RuntimeException
- Toutes les sous-classes de
Throwable
et appartiennent au package java.lang
- ʻError
et ʻException
sont des sous-classes de Throwable
RuntimeException
est une sous-classe de ʻException (un descendant de
Throwable`)
- Les seules exceptions vérifiées qui nécessitent
try ~ catch
sont des sous-classes de ʻException autres que
RuntimeException`.
Ordre pour attraper les exceptions
- Les exceptions doivent être interceptées dans l'ordre de la sous-classe
- Attraper une superclasse avant qu'une sous-classe entraîne une erreur de compilation
- Pas une erreur d'exécution
Exception multi-capture
- Erreur de compilation lors de la capture de plusieurs exceptions héritées à la fois
- L'objet d'exception en cas d'interception multiple est implicitement traité comme final et ne peut pas être réaffecté.
S'il ne s'agit pas de prises multiples, il ne sera pas traité comme définitif
Relance d'exception
- Si une méthode attrape et renvoie plusieurs types d'objets d'exception, les exceptions prises par les méthodes
throws
et catch
ne doivent pas nécessairement correspondre.
- En récupérant la classe parente de toutes les exceptions possibles avec catch et en la lançant telle quelle, etc.
//Dans SE7 et versions ultérieures, vous pouvez intercepter deux exceptions ensemble.
//IllegalAccessException et ArighmeticException au lieu de Exception sont levés depuis execute
private void execute(int number) throws IllegalAccessException, ArithmeticException {
try {
switch (number) {
case 1:
throw new IllegalAccessException();
case 2:
throw new ArithmeticException();
default:
System.out.println("No exception");
}
} catch (Exception e) {
throw e;
}
}
Remplacez la méthode qui lève l'exception
- Lors de la substitution d'une méthode avec une déclaration
throws
dans une sous-classe, c'est à vous de déclarer la méthode remplacée throws
.
- L'exception à la déclaration de «throws» dans une méthode surchargée doit être la même que ou une sous-classe de la méthode d'origine.
RuntimeException
et ses sous-classes peuvent être spécifiées sans condition dans throws
. Cependant, puisqu'il s'agit d'une exception non vérifiée, il compilera sans intercepter l'appelant.
essayez ~ avec ~ instruction de ressources
- Peut être utilisé seul avec
try
uniquement dans try ~ avec l'instruction ~ resources
- La ressource à utiliser doit implémenter
java.lang.AutoCloseable
ou sa sous-interface java.io.Closeable
.
- Les deux ʻAutoCloseable
/
Closeable ont une déclaration
throws dans
close () , donc que vous l'utilisiez pour une ressource ou dans
try`, vous devez attraper une exception pour obtenir une erreur de compilation.
AutoCloseable#close() throws Exception
Closeable#close() throws IOException
- Si une exception se produit avec
close ()
de ʻAutoCloseable ou
Closeable`, elle sera interceptée par catch.
- Si une exception se produit à la fois sur le bloc
try
et la ressource close, l'exception déclenchée par close ()
est stockée dans l'objet d'exception intercepté comme une exception supprimée dans un tableau de Throwable
, et getSuppressed ( Peut être obtenu avec)
- L'ordre d'exécution lorsqu'une exception se produit dans l'instruction
try ~ with ~ resources
est le suivant
- Bloc
try
- Fermez les ressources dans l'ordre inverse de la déclaration (le code ci-dessous ferme dans l'ordre de N à 1)
- bloc de capture
- Bloc
enfin
// (1) ->Fermer dans l'ordre de la ressource N à 1() -> (2) -> (3)Exécutez dans l'ordre de
try (Resource1; Resource2; ...; ResourceN) {
(1)
} catch (Exception e) {
(2)
// getSuppressed()Vous pouvez prendre un tableau Throwable avec
for (Throwable th : e.getSuppressed()) { ... }
} finally {
(3)
}
Assertions et comment les utiliser
- L'assertion est une fonction qui lance ʻAssertionError
lorsque false est détecté dans l'instruction ʻassert
, et la syntaxe est la suivante.
ʻAssert expression booléenne: message d'erreur; `
- Les expressions booléennes peuvent être placées entre parenthèses ou non
- Le message d'erreur peut être omis
- Les assauts sont désactivés par défaut. AssertError n'est pas levé sauf si vous spécifiez explicitement l'option "-ea" (abréviation de "enable assertion"?) Dans la commande java.
- Pour le désactiver explicitement, spécifiez l'option "-da" (abréviation de "disable assertion"?) Avec la commande java.
- Si vous voulez spécifier que c'est la cible de l'assertion, spécifiez la cible de l'assertion (pas la cible si elle est -da) comme
java -ea: [nom de la classe]
, séparée par des deux-points.
Date and Time API
Liste de classe
- «LocalDate»… Date
LocalTime
… Heure
LocalDateTime
… Date + heure
- ʻOffsetTime`… Heure avec la différence par rapport à UTC / GMT en “+ hh: mm”
- ʻOffsetDateTime`… Date et heure avec la différence par rapport à UTC / GMT en «+ hh: mm»
ZonedDateTime
… Date + heure, y compris la différence par rapport à UTC / GMT dans l'ID de fuseau horaire
- Tous implémentent l'interface
Temporal
. De plus, sa super interface est TemporalAccessor
- La différence entre «Local ~», «Offset ~» et «Zoned ~» est la différence dans la méthode d'expression de la même date et heure.
- La conversion vers chacun est possible avec
LocalDateTime # toLocalDate ()
et LocalDateTime # toLocalTime ()
- Deux méthodes peuvent obtenir le mois
getMonth ()
... Month
Obtenir par valeur d'énumération
getMonthValue ()
... Récupère par valeur int
Liste des types d'énumération
Month
: représente le mois
JANUARY
, FEBRUARY
, MARCH
, …, DECEMBER
DayOfWeek
: Représente le jour
SUNDAY
, MONDAY
, TUESDAY
, …, SATURDAY
Instanciation de LocalDate / LocalTime / LocalDateTime
now()
of(year, month, dayOfMonth, ...)
Créer une instance avec une valeur qui peut être gérée par chaque classe comme argument
Vous pouvez définir l'argument month sur la valeur énumérée «Month» au lieu d'un entier.
Seul LocalDateTime
a une surcharge qui prend LocalDate
et LocalTime
comme arguments. Cela peut prendre une année, un mois, un jour, une heure, une minute, une seconde, une milliseconde comme arguments
parse(String)
、parse(String, DateTimeFormatter)
Générer une instance à partir d'une chaîne
Si vous utilisez DateTimeFormatter
ensemble, vous pouvez utiliser n'importe quelle chaîne de caractères de format.
Surcharge de LocalDate # of et LocalTime # of
LocalDate # of
a deux méthodes de surcharge. Dans les deux cas, la date est spécifiée, mais les autres différences sont les suivantes.
- Le deuxième argument est int
- Le deuxième argument est la valeur d'énumération "Month"
LocalTime # of
a trois méthodes de surcharge, toutes spécifiant l'heure et la minute, mais les autres différences sont les suivantes:
- Heures seulement
- Spécifiez les secondes en plus des heures et des minutes
- Spécifiez les secondes et nanosecondes en plus des heures et des minutes
java.time.format.DateTimeFormatter
ofPattern(String)
Spécifier le modèle de format
ofLocalizedDate(FormatStyle)
Spécifiez la méthode de format de date
ofLocalizedTime(FormatStyle)
Spécifiez la méthode de format de l'heure
ofLocalizedDateTime(FormatStyle)
Spécifiez la méthode de format de la date et de l'heure
ofLocalizedDateTime(FormatStyle, FormatStyle)
Spécifiez la méthode de format de la date et de l'heure séparément pour la date et l'heure
- formateur prédéfini statique
BASIC_ISO_DATE
etc.
java.time.format.FormatStyle
Il existe 4 types de FormatStyle
FormatStyle.FULL
Format complet avec fuseau horaire. Exception lors de l'exécution lorsqu'elle est appliquée à LocalDateTime, etc. qui n'ont pas d'informations de zone
FormatStyle.LONG
Format concis avec fuseau horaire. Exception lors de l'exécution lorsqu'elle est appliquée à LocalDateTime, etc. qui n'ont pas d'informations de zone
FormatStyle.MEDIUM
Format concis sans fuseau horaire
FormatStyle.SHORT
Mise en forme concise de la date et de l'heure sans fuseau horaire
LocalDateTime dateTime = LocalDateTime.of(2020, 8, 14, 9, 54, 30);
ZonedDateTime zDateTime =
ZonedDateTime.of(dateTime, ZoneId.systemDefault());
// FormatStyle.COMPLET… "14 août 2020 9:54:30"
println(fmt1.format(zDateTime));
// FormatStyle.LONG … 『2020/08/14 9:54:30 JST』
println(fmt2.format(zDateTime));
// FormatStyle.MEDIUM … 『2020/08/14 9:54:30』
println(fmt3.format(dateTime));
// FormatStyle.SHORT … 『20/08/14 9:54』
println(fmt4.format(dateTime));
Chaîne de format de l'API de date et d'heure
- "y"… année
- "M" ... mois (capital)
- "d"… jour
- "H" ... heure (majuscule)
- "m"… minutes
- "s"… secondes
- "S" ... milliseconde (majuscule)
- "n" ... nanosecondes
Addition / soustraction de date / heure
Ajouter ... plus (Montant temporel à ajouter)
Soustraire… moins (Montant temporel à soustraire)
Period
et Duration
implémentent l'interface TemporalAmount
- L'addition et la soustraction pour des champs individuels tels que «plusYears» et «plusWeeks» sont possibles, mais lorsque vous traitez plusieurs champs à la fois, appelez plus avec «Period» et «Duration» comme arguments.
Heure d'été
- La date de début de l'application (date pour avancer l'heure) et la date de fin d'application (date pour renvoyer l'heure) de l'heure d'été sont différentes chaque année, même dans la même région. Cependant, l'heure est fixée à 02h00
- Au démarrage de l'application, le décalage est réduit d'1 heure et l'heure est avancée d'1 heure.
Il sera 03h00 une minute après 01h59 car il avance d'une heure à partir de 02h00.
Si vous prenez l'intervalle entre 01h00 et 03h00 à la date de début de l'application, il sera de 1 heure au lieu de 2 heures.
- Lorsque l'application est terminée, le décalage augmente d'1 heure et l'heure revient d'1 heure.
Il sera 01h00 une minute après 01h59 car il reviendra une heure à partir de 02h00.
Période: Date
- L'expression de période avec
toString ()
est ** "P00Y00M00D" **
Le premier "P" est un acronyme pour "Period"
- Il existe plusieurs façons de créer une instance de
Period
- Faites la différence entre deux
LocalDate
et LocalDateTime
avec la méthode between
- Généré par la méthode ofXXXXX telle que ʻofYears (1) `. Cependant, la chaîne de méthodes n'est pas possible
- La «période» peut être ajoutée ou soustraite par année, mois, jour ou semaine
La méthode d'addition / soustraction est plusXXXXX / minusXXXXX.
plusYears (1)
etc.
Si vous ajoutez les semaines avec plusWeeks (3)
, vous obtenez "P21D". Parce qu'il n'y a pas d'expression "Period" pour la semaine
LocalDate
/ LocalDateTime
peut ajouter ou soustraire des dates avec Period
comme argument dans la méthode plus
/ minus
.
//Ajout d'années en utilisant la période
LocalDateTime dt = LocalDateTime.now();
Period p = Period.ofYears(1);
//Cela équivaut aux deux lignes suivantes (la chaîne de méthodes n'a pas de sens)
// Period p1 = Period.ofDays(1);
// Period p = Period.ofYears(2);
Period p = Period.ofDays(1).ofYears(2);
Durée: heure, minute et seconde
- L'expression
Durée
de` toString () ʻest " PT00H00M00S "
Le premier "PT" est une abréviation de "Période"
- Il existe plusieurs façons de créer une instance de
Durée
- Faites la différence entre deux
LocalDateTime
et LocalTime
avec la méthode between
- Généré par la méthode ofXXXXX telle que ʻofHours (1) `
- Généré avec
ChromeUnit
dans des méthodes telles que ʻof (1, ChronoUnit.HOURS)`
- La
durée
peut être ajoutée ou soustraite en jours, heures, minutes, secondes, millisecondes, nanosecondes
Lorsque les jours sont ajoutés, il devient PT24H, et lorsqu'il est inférieur à la milliseconde, il devient PT0.13S.
LocalTime
/ LocalDateTime
peut ajouter ou soustraire des heures, des minutes et des secondes avec Duration
comme argument dans la méthode plus
/ moins
.
java.time.Instant
- Classe qui exprime le passage de l'époque
- Il existe plusieurs façons de créer une instance
Instant#now()
Instant#ofEposSecond(long)
Instant#ofEpocMilli(long)
LocalDateTime#toInstant(ZoneOffset)
ZonedDateTime#toInstant()
LocalDateTime # toInstant
requiert ZoneOffset
car LocalDateTime
ne contient pas d'informations sur le fuseau horaire.
- Le fuseau horaire ʻInstant` est toujours UTC
Entrée sortie
Lecture avec java.io.Reader
Reader
public int read()
Renvoie le caractère lu. Lorsque vous atteignez la fin ** - 1 **
public int read(char[] buffer)
public int read(char[] buffer, int offset, int length)
Renvoie le nombre de caractères en plaçant les caractères lus dans tout ou partie du tableau. Lorsque vous atteignez la fin ** - 1 **
BufferedReader
public String readLine()
Renvoie la ligne de texte lue. ** null ** lorsque vous atteignez la fin
Ecrire avec java.io.Writer
Writer
public void write(char[] buffer)
public void write(char[] buffer, int offset, int length)
Ecrire une partie ou la totalité du tableau
public void write(int c)
Ecrire un caractère
public void write(String str)
public void write(String str, int offset, int length)
Ecrire une partie ou la totalité de la chaîne
BufferedWriter
public void newLine()
Ecrire un caractère de saut de ligne
Contrôle de la position de lecture de java.io.Reader et java.io.InputStream
skip(long bytes)
Ignore le nombre d'octets spécifié à partir de la position actuelle
mark(int readAheadLimit)
Marquez la position actuelle pour pouvoir revenir avec reset ()
. L'argument est ** la limite supérieure du nombre de caractères pouvant être lus tout en conservant la marque **
reset()
Revenir à la position où mark ()
a été fait
//Le contenu du fichier"01234567"
//Le résultat de l'exécution est"025676"
try (BufferedReader br =
new BufferedReader(new FileReader("sample.txt"))) {
for (int i = 0; i < 3; i++) {
br.skip(i); //Passer i octets
System.out.print((char)br.read());
}
br.mark(3); //emplacement actuel("6"INDEX avec=5 lieux)marque
System.out.print(br.readLine());
br.reset(); //Position marquée(INDEX=5 lieux)Retour à
System.out.println((char)br.read());
} catch (IOException e) {
e.printStackTrace();
}
java.io.PrintWriter
- Une sous-classe de
java.io.Writer
qui peut afficher les types primitifs tels quels
Pour booléen / char / char [] / int / float / long / String / Object
- En plus de
print
et println
, vous pouvez formater des chaînes en utilisant format
- A la fonction de flash automatique
- Il y a
PrintStream
dans une classe avec la même fonction
Remplacé par PrintWriter
dans JDK1.2, mais reste pour la compatibilité descendante
java.io.Console
- Lire les données de l'entrée standard
- Obtenez une instance singleton avec
System # console ()
. ** Renvoie null si non disponible **
- Récupère la chaîne saisie sous forme de chaîne avec
readLine ()
- Récupère la chaîne de caractères saisie avec char [] avec
readPassword ()
. Le mot de passe étant lu, la chaîne de caractères ne s'affiche pas lors de la saisie
- Vous pouvez obtenir le
PrintWriter
et le Reader
associés à la console avecwriter ()
etreader ()
, respectivement.
- La
Console
elle-même a les méthodes printf
et format
pour imprimer les chaînes sur la console
Précautions concernant la sérialisation
- Les classes qui implémentent l'interface
java.io.Serializable
peuvent être sérialisées
- L'un ou l'autre des éléments suivants est exclu de la sérialisation
- variable statique
- Variables membres déclarées transitoires
- Si la superclasse peut être sérialisée, la sous-classe peut également être sérialisée
- La désérialisation n'appelle pas le bloc d'initialisation d'instance ou le constructeur. Cependant, le bloc d'initialisation statique est appelé
De plus, dans les cas suivants, seul le constructeur de la superclasse est appelé.
- Il est «sérialisable» lui-même, mais la superclasse n'est pas «sérialisable»
- Superclass a un constructeur sans argument
- Le constructeur de sous-classe n'appelle pas explicitement le constructeur parent
- Le fait qu'une variable membre puisse être sérialisée dépend du type de données du contenu, pas du champ.
Quel que soit le type de variable, elle peut être sérialisée si son contenu est
Serializable
NIO2
java.nio.file.Path (fonctionnalité)
- Généré par la méthode suivante
Paths#get(String, String...)
FileSystem#getPath(String, String...)
- Les principales caractéristiques sont les suivantes. Fonctionnalités introuvables dans
java.io.File
- Gérer les chemins de fichiers et de répertoires
- Les attributs de fichier (propriétaire, autorisations, etc.) peuvent être acquis et modifiés
- Peut gérer les liens symboliques
- Modifications et surveillance des événements qui se produisent dans le répertoire, comme la création de fichiers
- Une conversion mutuelle avec
java.io.File
est possible
File#toPath()
Path#toFile()
java.nio.file.Path (méthode)
getRoot()
Renvoie la racine du chemin. Null à partir du chemin généré avec le chemin relatif
subpath(int start, int end)
Génère un chemin qui extrait la plage spécifiée par l'index, à l'exclusion de la racine.
getName(int)
Renvoie la partie spécifiée par l'index sous forme de chaîne, à l'exclusion de la racine
relativize(Path)
Renvoie le chemin relatif de l'argument
resolve(String)
、resolve(Path)
Résolvez le chemin. Le chemin de retour diffère selon l'argument
- Les arguments sont des chemins relatifs ... Renvoie des arguments concaténés au récepteur
- L'argument est un chemin absolu ... Renvoie l'argument tel quel
- Argument vide ... Renvoie le récepteur lui-même
resolveSibling(String)
、resolveSibling(Path)
Résolvez le chemin vers le parent du destinataire. Le chemin de retour diffère selon l'argument
- L'argument est un chemin absolu ... Renvoie l'argument concaténé au récepteur
- Autre ... Les arguments sont concaténés et renvoyés au récepteur
normalize()
Renvoie un chemin d'accès qui a été converti au format approprié en supprimant les parties redondantes telles que "." Et ".."
String sp1 = "/tmp/work1/sample.txt";
String sp2 = "/tmp/work2/dummy.txt";
Path p1 = Paths.get(sp1);
Path p2 = FileSystems.getDefault().getPath(sp2);
println(p1.getRoot()); // "/"
println(p1.subpath(0, 2)); // "tmp/work1"
println(p1.relativize(p2)); // "../../work2/dummy.txt"
println(p1.getName(0)); // "tmp"
Path rp = p1.resolve("../dat");
println(rp); // "/tmp/work1/sample.txt/../dat"
println(rp.normalize()); // "/tmp/work1/dat"
//Pour les fenêtres
Path wp = Paths.get("C:¥¥temp¥¥work¥¥sample.txt");
println(wp.getRoot()); // "C:¥"
java.nio.file.FileSystem
Fournit une interface avec le système de fichiers. Obtenir avec la méthode statique de la classe FileSystems
FileSystems#getDefault
FileSystems#getFileSystem
FileSystems#newFileSystem
java.nio.file.Files (opération de fichier)
Ce qui suit sont toutes des méthodes statiques
copy
Copie de fichiers et répertoires
- Le contenu du répertoire n'est pas copié
- Lorsqu'un fichier portant le même nom existe dans la destination de copie, une exception est faite s'il n'y a pas de spécification d'écrasement dans CopyOption.
- Le comportement par défaut est que la copie d'un fichier ne copie pas les attributs
- Si vous copiez un lien symbolique sans spécifier CopyOption, la substance indiquée par le lien sera copiée.
- Le chemin donné à l'argument n'est pas l'endroit à copier / déplacer, mais le chemin après le déplacement / la copie
move
Déplacer des fichiers et des répertoires. Le comportement est le même que 1 à 5 de la copie
getAttribute(Path, String, LinkOption...)
Lire les valeurs d'attribut de fichier (taille du fichier, date de modification, etc.)
Stream<String> lines(Path)
List<String> readAllLines(Path)
Renvoie toutes les lignes du fichier. Le type de retour diffère selon la méthode
java.nio.file.Files (manipulation de répertoires)
Ce qui suit sont toutes des méthodes statiques
createDirectory()
Créer un répertoire, mais pas un parent
createDirectories()
Créer un répertoire comprenant le parent
delete
/ deleteIfExists
Supprimez le fichier. En cas d'échec, le premier est une exception, le second est de type booléen et le résultat est renvoyé.
Aucun des deux ne peut être supprimé s'il y a un fichier dans le répertoire et qu'une exception se produit
newDirectoryStream(Path)
Renvoie le chemin dans le répertoire avec la classe d'implémentation DirectoryStream <Path>
de ʻIterable`
list(Path)
Renvoie une liste de fichiers et de répertoires dans le répertoire avec Stream <Path>
. Une exception se produit si l'argument n'est pas un répertoire
java.nio.file.Files (répertoire de recherche)
Ce qui suit sont toutes des méthodes statiques
walk()
walkFileTree()
Rechercher récursivement, y compris les sous-répertoires
list()
Rechercher uniquement dans ce répertoire
find()
Rechercher de manière récursive les éléments qui remplissent les conditions, y compris les sous-répertoires
- Toutes ces valeurs de retour sont des flux, le traitement du pipeline est donc possible
java.nio.file.attribute
Un package contenant des classes qui représentent les attributs d'un fichier (heure de création, heure d'accès, propriétaire, etc.). Comprend également une interface de vue d'attribut qui affiche un ensemble d'informations d'attribut
- Interface
BasicFileAttributes
Informations d'attribut de base
- Interface
DosFileAttributes
Informations sur les attributs DOS
- Interface
PosixFileAttributes
Informations sur les attributs Unix / Linux
- Interface ʻAttribute View`
Un ensemble d'informations sur les attributs. Les éléments suivants existent en tant que sous-interfaces
BasicFileAttributeView
DosFileAttributeView
PosixFileAttributeView
Traitement parallèle
Fonctions fournies par l'utilitaire de traitement parallèle
- Pool de threads
Création et réutilisation de threads
- Collecte parallèle
Une collection qui peut gérer correctement l'accès parallèle à partir de plusieurs threads
- Variables atomiques
Implémentation d'une série d'opérations indivisibles pour éviter les incohérences de valeur dues à l'accès parallèle (identique à synchronisé)
- Compter le semapho
Vous pouvez définir librement le nombre de threads qui peuvent accéder à un nombre fini de ressources en parallèle.
Collecte parallèle
- L'API liée au traitement parallèle est la suivante. Tous les packages
java.util.concurrent
- Interface
BlockingQueue
- Interface
BlockingDeque
- Interface
ConcurrentMap
- Classe
ConcurrentHashMap
- Classe
CopyOnWriteArrayList
- Classe
CopyOnWriteArraySet
- Si vous utilisez un objet de collection qui ne prend pas en charge le traitement parallèle à partir de plusieurs threads,
java.util.ConcurrentModificationException
se produira.
- Si vous utilisez un itérateur dans une instruction for étendue lorsque vous opérez à partir de plusieurs threads, le contenu de la collection au moment de la création de l'itérateur sera utilisé.
Interface java.util.concurrent.ConcurrentMap
V getOrDefault(Object key, V defaultValue)
Renvoie la valeur associée à la clé. Renvoie defaultValue sinon
V putIfAbsent(K key, V value)
Ajouté uniquement lorsque la valeur associée à la clé n'est pas dans la carte
boolean remove(Object key, Object value)
Supprimer tous les éléments qui correspondent à la fois à la clé et à la valeur
V replace(K key, V value)
Remplacer si la valeur spécifiée pour la clé est dans la carte
V replace(K key, V oldValue, V newValue)
Remplacez la valeur par newValue s'il existe un élément qui correspond à la fois à key et oldValue
//Le contenu de la carte[1, "One"], [2, "Two.2"], [3, "Three"]
Map<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "One");
map.putIfAbsent(1, "One.2"); //Ne pas ajouter(KEY=1 élément existe déjà)
map.put(2, "Two");
map.replace(2, "Two.2"); //Remplacement
map.replace(2, "Two.22", "Two.3"); //Ne remplacez pas(Le deuxième argument est différent de la valeur existante)
map.put(3, "Three"); //Effacer
map.remove(3, "Three2"); //Ne pas supprimer(Le deuxième argument est différent de la valeur existante)
Classe java.util.concurrent.CopyOnWriteArrayList
- Lors de la modification des éléments détenus en interne, copiez le tableau contenant les anciens éléments, modifiez-le et remplacez-le.
Par conséquent, plus la taille de la liste est grande, plus la surcharge est importante.
- Si un autre thread accède à la liste lors de la modification d'un élément (copie dans un nouveau tableau), il se référera au contenu de l'ancien tableau.
Classe java.util.concurrent.CyclicBarrier
- Fournit la possibilité d'aligner chaque thread dans une partie de thread (une collection de threads qui travaillent avec emphase)
- Spécifiez le nombre de threads à coopérer dans le constructeur. Le premier argument est le nombre de threads à coordonner, et s'il y a un second argument, le processus à exécuter lors d'un déclenchement (= barrière est libérée)
new CyclicBarrier(int)
new CyclicBarrier(int, Runnable)
- Le thread qui a exécuté ʻawait ()
attend que le nombre de threads spécifié dans le constructeur de
CyclicBarrier` attende.
await(long timeout)
Pas de délai
await(long timeout, TimeUnit unit)
Il y a un délai
- Si
new CyclicBarrier (3)
est utilisé pour 4 threads, un déclenchement se produira lorsque 3 threads "attendaient".
Mais le dernier ne peut pas franchir la barrière tant que deux autres threads n'ont pas "attendu", donc il ne peut pas continuer.
//Puisque le nombre de barrières est de 2 et le nombre de fils est de 3.
// "wait wait wait finish finish"Et le processus s'arrête
ExecutorService service = Executors.newCachedThreadPool();
CyclicBarrier barrier = new CyclicBarrier(2);
for (int i = 0; i < 3; i++) {
service.execute(() -> {
try {
System.out.print("wait ");
barrier.await();
System.out.println("finish ");
} catch (BarrierBrokenException | InterruptedException ignore) {
}
});
}
service.shutdown();
Relation d'héritage ExecutorService
Executor
… execute(Runnabble)
- ʻExecutorService
…
submit (Runnable)etc. *
ThreadPoolExecutor *
ForkJoinPool`
ScheduledExecutorService
…schedule (Runnable, long, TimeUnit) ʻetc. *
ScheduledThreadPoolExecutor`
Méthodes des exécuteurs et spécifications ExecutorService correspondantes
newSingleThreadExecutor()
Effectuer des tâches dans un seul thread
newCachedThreadPool()
Créez de nouveaux threads ou réutilisez-les pour effectuer des tâches selon les besoins
newFixedThreadPool(int)
Effectuer des tâches en réutilisant un nombre fixe de threads
newScheduledThreadPool(int)
Effectuez des tâches en réutilisant un nombre fixe de threads. Les tâches peuvent être planifiées
newSingleThreadScheduledExecutor()
Effectuez des tâches dans un seul thread. Les tâches peuvent être planifiées
ExecutorService#execute
- Récupérez l'objet ʻExecutorService
de la nature appropriée avec la méthode statique de la classe ʻExecutors
et exécutez-le avec la méthode ʻexecute (Runnable) `
- Utilisez la méthode suivante pour vérifier l'état d'exécution de la tâche
isShutdown()
Si vrai, les nouvelles tâches ne peuvent pas être acceptées (il peut y avoir des tâches non exécutées ou en cours d'exécution)
isTerminated()
Si cela est vrai, les nouvelles tâches ne peuvent pas être acceptées et toutes les tâches sont terminées.
- Si ʻisShutdown ()
n'est pas vrai, une nouvelle tâche ʻexecute
est possible. ʻExcute` quand true déclenche une exception
ExecutorService#submit
- ExecutorService a plusieurs méthodes de surcharge et la valeur de retour est Future. Ce que vous pouvez obtenir de Future dépend de la méthode
Future<T> submit(Runnable)
Exécutez la tâche. Vous pouvez obtenir le succès ou l'échec de la tâche
Future<?> submit(Runnable, T)
Exécute la tâche du premier argument et renvoie la valeur du deuxième argument. Vous pouvez obtenir le succès ou l'échec de la tâche
Future<T> submit(Callable<T>)
Exécutez la tâche. Vous pouvez obtenir la valeur de retour de la tâche
- La tâche sera exécutée immédiatement, mais lorsque
Future # get ()
est exécuté, il y aura un temps d'attente jusqu'à ce que la valeur puisse être obtenue même après la fin de la tâche.
- Vous pouvez également annuler une tâche qui a été «soumise» depuis «Future » (uniquement si possible).
Exécutable et appelable
Runnable
- Ne retournez pas de valeur de retour
- Impossible de lancer l'exception vérifiée
- Peut être exécuté avec ʻexecute
ou
submit`
Callable
- Peut renvoyer une valeur de retour
- Peut lancer des exceptions vérifiées
- Ne peut être exécuté qu'avec
submit
Interface java.util.concurrent.Future
V get()
Vous pouvez obtenir le résultat de l'exécution de la tâche
boolean cancel(boolean)
Tentative d'annulation de la tâche
boolean isCancelled()
Savoir si la tâche a été annulée
boolean isDone()
Savoir si la tâche est terminée
Flux parallèle
- Produire
Collection#parallelStream()
Générer un flux parallèle à partir de la collection
- Conversion mutuelle
BaseStream#parallel()
Générer un flux parallèle à partir d'un flux séquentiel
BaseStream#sequential()
Générer un flux séquentiel à partir d'un flux parallèle
- Jugement
BaseStream#isParallel()
Déterminez s'il s'agit d'un flux parallèle
//Génération de flux parallèle
Arrays.asList(1, 2, 3).parallelStream().forEach(System.out::println);
//Générer un flux parallèle à partir d'un flux séquentiel
Stream.of("a", "b", "c").parallel().forEach(System.out::println);
//Générer un flux séquentiel à partir d'un flux parallèle
Arrays.asList("A", "B", "C").parallelStream().sequential().forEach(System.out::println);
Cadre Fork / Join
- J'ai abandonné ici. Si vous êtes sérieux, étudions correctement
Variables atomiques
- Les classes avec des noms commençant par Atomic ~ garantissent que les opérations sur les valeurs qu'elles gèrent sont thread-safe.
- Les classes principales sont les suivantes. Float et Double n'existent pas
- ʻAtomicInteger`… type int
- ʻAtomic Long`… type long
- ʻAtomicBoolean`… type booléen
- ʻAtomicReference`… Type de référence
JDBC
Exécuter l'ordre
- Les packages auxquels appartient la classe à utiliser sont
java.sql
et javax.sql
- Le format d'URL pour se connecter à DB avec JDBC est le suivant
jdbc: [nom de la base de données] // [hôte (: port)] / [nom-db](? option)
- Le flux de traitement de base est le suivant
- Obtenez
Connection
avec DriverManager # getConnection (url, id, pass)
- Obtenez
Statement
avec Connection # createStatement ()
- Obtenez
ResultSet
avec Statement # executeQuery (sql)
- Extrayez le résultat de la requête de «ResultSet»
- Avant JDBC3.0, il était nécessaire d'exécuter
Class.forName ([nom de classe du pilote JDBC])
avant DriverManager # getConnection
.
Même si le résultat de la requête exécutée par executeQuery
est 0, la valeur de retour n'est pas nulle mais un ResultSet
vide.
- Un seul
ResultSet
peut être traité par unStatement
. Si vous obtenez un autre ResultSet
sans fermer le premier ResultSet
, le premier sera automatiquement fermé. Exception lors de la tentative de manipulation d'un ResultSet
fermé
ʻAutomatically ferme quand executeUpdate` etc. est exécuté
Utilisation correcte des méthodes dans Statement
ResultSet executeQuery(String sql)
Renvoie le résultat de l'exécution de la requête
int executeUpdate(String sql)
Exécute SQL tel que INSERT / UPDATE / DELETE et renvoie le nombre de processus
boolean execute(String sql)
Exécute tous les types de SQL, y compris les requêtes, et renvoie si le traitement a abouti à «ResultSet». Si true, "ResultSet" est renvoyé, si false, ce n'est pas le cas.
Si ResultSet
est renvoyé à la suite du traitement, récupérez-le avec Statement # getResultSet ()
. Si ce n'est pas «ResultSet», utilisez «Statement # getUpdateCount ()» pour obtenir le nombre de processus.
Acquisition et propriétés de ResultSet
- Dans
Connection # createStatement (type, concurrency)
, spécifiez "scrollability" et "table data update availability" de ResultSet
dans l'ordre.
- Il existe trois types de scrollability, qui sont tous des constantes de la classe
ResultSet
.
TYPE_FORWARD_ONLY
… Ne peut se déplacer que vers l'avant
TYPE_SCROLL_INSENSITIVE
… Peut se déplacer dans les deux sens. Les modifications apportées au curseur ne sont pas reflétées
TYPE_SCROLL_SENSITIVE
… Peut se déplacer dans les deux sens. Refléter les modifications apportées au curseur
- Les données de la table peuvent être mises à jour dans les deux types suivants, qui sont tous des constantes de la classe
ResultSet
.
CONCUR_READ_ONLY
… Lecture seule
CONCUR_UPDATABLE
… Actualisable
- Lors de l'obtention du
ResultSet
pouvant être mis à jour avec Statement # createStatement (..., ResultSet.CONCUR_UPDATABLE)
, la colonne à mettre à jour doit être spécifiée dans l'instruction select de ʻexecuteQuery`.
Méthode de défilement ResultSet
boolean absolute(int)
Déplacer vers la ligne spécifiée (spécifier la position absolue). La première ligne est 1.0 avant le premier
boolean relative(int)
Déplacer en spécifiant une position relative. La valeur positive va à la ligne suivante, la valeur négative va à la ligne précédente
boolean next()
Passer à la ligne suivante
boolean previous()
Passer à la ligne précédente
boolean first()
Passer à la première ligne
void beforeFirst()
Déplacez-vous juste avant la première ligne
boolean last()
Passer à la dernière ligne
void afterLast()
Se déplacer immédiatement après la dernière ligne
ResultSet actualisable
- Mise à jour
Changez avec ʻupdateString
ou ʻupdateInt
et confirmez le changement avec ʻupdateRowMême si le type de
Statement est
TYPE_SCROLL_INSENSITIVE, le contenu de la base de données et même le jeu de résultats ne seront pas modifiés à moins que ce ne soit ʻupdateRow
.
updateString(int, String)
updateInt(int, int)
updateRow()
- Insérer
Utilisez
moveToInsertRow
pour vous déplacer vers la ligne d'insertion, utilisez ʻupdateString ou ʻupdateInt
pour spécifier le contenu de l'insertion et utilisez ʻinsertRow` pour l'insérer.
moveToInsertRow()
insertRow()
- Effacer
Supprimer la ligne actuelle
Localisation et formatage
Obtient l'objet java.util.Locale
Locale#getDefault()
Paramètres régionaux de l'environnement d'exécution Java
new Locale(String)
L'argument est "code de langue"
new Loacle(String, String)
L'argument est "code de langue, code de pays"
new Loacle(String, String, String)
Les arguments sont "code de langue, code de pays, variante"
- Définissez la valeur appropriée pour
Locale.Builder
généré par new et générez-le avec build ()
java.util.Properties
- Les formats de fichiers pris en charge sont le texte et XML
- Pour les fichiers texte, listez les clés et les valeurs séparées par = ou:
- Charger la liste des propriétés à partir du fichier
load(InputStream)
load(Reader)
loadFromXML(InputStream)
- Liste des propriétés de sortie
list(OutputStream)
list(Writer)
entrySet()
forEach(BiConsumer)
- Obtenir des propriétés
getProperty(String)
Renvoie null s'il n'y a pas de clé correspondante
getProperty(String, String)
S'il n'y a pas de clé correspondante, le deuxième argument est renvoyé.
java.util.ListResourceBundle
- Préparez la ressource dans un fichier .class et placez-la à l'emplacement où le chemin de classe est défini.
- Comment utiliser est comme suit
- Définissez une classe publique qui hérite de
ListResourceBundle
Remplacer objet public [] [] getContents ()
Le nom complet (nom du package + nom de la classe) de cette classe sera le nom de base, et cette classe sera pour les paramètres régionaux par défaut.
Exemple: le nom de la classe est "MyResource"
- Définissez une classe pour une langue différente en héritant de
ListResourceBundle
La règle de dénomination est ** "nom de base_langue code_code pays" **
Exemple: le nom de classe pour les paramètres régionaux anglais est "MyResource_en_US"
- Récupérez l'objet
ListResourceBundle
avec ResourceBundle # getBundle (nom de base [, locale])
- Obtenez la valeur avec
ResourceBundle # getXXXXX (key string)
java.util.PropertyResourceBundle
- Préparez la ressource dans le fichier .properties et placez-la à l'emplacement où le chemin de classe est défini.
- Comment utiliser est comme suit
- Créez un fichier de propriétés pour les paramètres régionaux par défaut
- L'extension est **. Propriétés **
- Définissez plusieurs propriétés au format "nom de clé = valeur"
- Le fichier doit être codé ISO-8859-1
- La convention de dénomination des fichiers est la même que le nom de classe de
ListResourceBundle
- Créez un fichier pour une langue différente de 1
- La convention de dénomination des fichiers est la même que le nom de classe de
ListResourceBundle
- MyResource_en_US.properties pour les paramètres régionaux anglais
- Récupérez l'objet
PropertyResourceBundle
avec ResourceBundle # getBundle (nom de base [, locale])
- Même méthode pour obtenir
ListResourceBundle
- Utilisez la méthode suivante pour récupérer la valeur. il n'y a pas de getInt
ResourceBundle # getObject (chaîne de clé)
ResourceBundle # getString (chaîne de clé)
ResourceBundle # getStringArray (chaîne de clé)
Priorité des ensembles de ressources utilisés
- Une exception
MissingResourceException
est déclenchée si le bundle de ressources correspondant à la locale n'existe pas
- Il n'y a pas d'exception même s'il existe plusieurs ensembles de ressources portant le même nom.
- Les ensembles de ressources sont recherchés par propriétés individuelles plutôt que par fichier. La priorité de recherche est la suivante
- Le code de langue et le code de pays correspondent
- Faire correspondre le code de langue
- Faire correspondre les paramètres régionaux par défaut
- Si la propriété correspondant à la clé spécifiée n'existe dans aucune classe / fichier,
MissingResourceException
se produira.
- Si la classe
ListResourceBundle
et le fichier de propriétés ont le même nom, la classe est prioritaire sur le fichier.
Mettre en forme les nombres à l'aide de NumberFormat
- Utilisez la méthode statique de la classe
NumberFormat
pour obtenir l'objet souhaité
getInstance()
Format numérique des paramètres régionaux par défaut
getInstance(Locale)
Format numérique de tous les paramètres régionaux
getCurrencyInstance(Locale)
Format monétaire de tous les paramètres régionaux
getIntegerInstance(Locale)
Format entier pour tous les paramètres régionaux
- Obtenez la chaîne formatée avec
format (long)
ou format (double)
- Obtenez un nombre à partir d'une chaîne avec
parse (String)
. La valeur de retour est "Number"
Journal des modifications
- 2020/08/23
Publié dans Qiita
- 2020/08/24
Changement de la liste des interfaces fonctionnelles au format tabulaire
Exemple de code ajouté pour les valeurs énumérées