Ich würde gerne fragen, ob Sie hier irgendwelche Projekte durchgeführt haben?
Könnten Sie uns bitte etwas über die Projekte erzählen, an denen Sie gearbeitet haben, welchen Technologie-Stack Sie verwendet haben und für welche Inhalte Sie verantwortlich waren? (Projekterfahrung)
Was sind die acht grundlegenden Datentypen? (Base)
Können Sie mir sagen, ob der lange Typ direkt ausgeführt werden kann? Die Frage sollte sein, ob es direkt berechnet werden kann? (Base)
Verstehen Sie das Singleton-Muster? Können Sie darüber sprechen (Designmuster)?
Was ist der Unterschied zwischen dem Lazy-Man-Modus und dem Hungrig-Man-Modus?
Was sind die Merkmale von Transaktionen? (Transaktion)
Erzählen Sie mir von Ausnahmen, auf die Sie bei der Arbeit an Projekten gestoßen sind. (abnormal)
Lassen Sie uns über die drei häufig verwendeten Zeitkategorien sprechen? (Base)
Sprechen Sie über drei Kalendermethoden?
Lassen Sie uns über den Lebenszyklus einer Sitzung sprechen. (Sitzung)
Haben Sie bei der Arbeit an einem Projekt jemals einen Verlust an Gleitkommagenauigkeit festgestellt? Wie hast du es gelöst?
Dann haben wir eine Berechnung mit Gleitkomma. Welchen Datentyp würden Sie für die Berechnung wählen?
Können Sie mir einige häufig verwendete Anmerkungen nennen? Frühling? Oder etwas anderes?
Kennen Sie sich mit Threads aus?
Was ist der Unterschied zwischen Thread und Prozess?
Sagen Sie mir also, was Thread-Sicherheit ist?
Sag mir den Unterschied zwischen == und equal?
Haben Sie schon einmal Linux verwendet? Können Sie kurz auf einige häufig verwendete Befehle eingehen?
Problem gelöst
- 我想问一下你这边有做过什么项目吗?
Ich denke, man kann einfach ein oder zwei relativ kompetente Projekte auswählen, über die man sprechen kann.
- 你方便讲一下你做过的那些项目吗,用了什么技术栈,包括你负责开发的内容是什么?
Wählen Sie das bekannteste Projekt aus, über das Sie sprechen möchten.
- 你说一下long类型能直接运转吗(Ich denke, es geht um die Frage, ob Daten vom langen Typ direkt verarbeitet werden können.)
Daten vom Typ „Long“ können direkt bearbeitet werden, wenn Sie in einem Ausdruck Werte vom Typ „Int“ und „Long“ mischen.
- 你了解单例模式吗?你可以讲一下吗
Das Singleton-Muster ist ein häufig verwendetes Software-Entwurfsmuster. Sein Zweck besteht darin, sicherzustellen, dass eine Klasse nur eine Instanz hat, und einen globalen Zugriffspunkt bereitzustellen, um diese eindeutige Instanz zu erhalten. Dieses Muster ist nützlich, wenn Sie den Zugriff auf Ressourcen steuern müssen oder wenn das Instanziieren von Objekten ressourcenintensiv oder zeitaufwändig ist und nur eine dieser Ressourcen oder Instanzen global benötigt wird. Zu den gängigen Implementierungsmethoden des Singleton-Modus gehören hauptsächlich: Lazy-Modus und Hungriger Modus.
- 懒汉模式跟饿汉模式有什么区别?
Erhältlich beiTiming der Objektinitialisierung, Thread-Sicherheit und RessourcennutzungVergleichen Sie in anderen Aspekten:
Initialisierungszeitpunkt
Lazy-Modus: Der Lazy-Modus ist ein延迟加载 Singleton-Muster.Es zeichnet sich aus durch第一次使用时创建实例对象 , anstatt es zu erstellen, wenn die Klasse geladen wird.Dieses Muster vermeidet die Notwendigkeit von Instanzobjekten资源浪费, nur bei Bedarf erstellt.
Hungriger Modus: Der Hungry-Man-Modus ist eine Art在类加载时就创建实例 Singleton-Muster. Sein Merkmal besteht darin, dass das Instanzobjekt beim Laden der Klasse erstellt wird, unabhängig davon, ob es verwendet wird.Diese Methode stellt sicher, dass unter allen Umständen dasselbe Instanzobjekt abgerufen werden kann, kann jedoch zu Problemen führen性能和资源上的浪费, insbesondere in einigen Fällen wird das Instanzobjekt nicht verwendet.
Thread-Sicherheit
Lazy-Modus: Der Lazy-Modus selbst ist非线程安全的 , da die Möglichkeit besteht, dass mehrere Threads gleichzeitig die Methode getInstance() aufrufen und gleichzeitig die Beurteilungsanweisung eingeben, was dazu führt, dass mehrere Instanzen erstellt werden.Um Thread-Sicherheit zu erreichen, können Sie die Methode getInstance() verwenden添加synchronized关键字 , aber das bringt Leistungseinbußen mit sich. Darüber hinaus können Sie auch doppelt überprüfte Sperren (Double-Checked Locking) und andere Methoden verwenden, um den Synchronisierungsaufwand zu reduzieren.
Hungriger Modus: Hungriger Modus ist线程安全Ja, da das Instanzobjekt beim Laden der Klasse erstellt wurde, gibt es in einer Multithread-Umgebung kein Konkurrenzproblem.
Ressourcennutzung und Leistung
Lazy-Modus : Der Lazy-Modus kann Ressourcen sparen, da er die Verschwendung von Ressourcen vermeidet, wenn Instanzobjekte nicht benötigt werden. Da es jedoch bei der ersten Verwendung initialisiert werden muss, kann die Leistung beeinträchtigt werden, wenn der Initialisierungsprozess komplex ist oder lange dauert.
Hungriger Modus : Der Hungrig-Modus ist hinsichtlich der Ressourcennutzung möglicherweise nicht so flexibel wie der Lazy-Modus, da er Instanzobjekte erstellt, unabhängig davon, ob sie verwendet werden. Da das Instanzobjekt jedoch bereits beim Laden der Klasse erstellt wird, ist es beim ersten Aufruf schneller, da keine Initialisierung erforderlich ist.
Anwendbare Szene
Lazy-Modus: Anwendbar aufEin Szenario, in dem das Objekt nur bei der ersten Verwendung erstellt wird und während des Initialisierungsprozesses des Instanzobjekts keine komplexen Thread-Sicherheitsanforderungen bestehen. . Zum Beispiel,DateimanagerDies ist ein typisches Beispiel, da Sie beim Start der Anwendung möglicherweise nicht sofort Dateien lesen und schreiben müssen, sondern entsprechende Vorgänge nur bei Bedarf ausführen müssen.
Hungriger Modus : Geeignet für Ressourcen, die beim Programmstart initialisiert werden müssen und während des gesamten Lebenszyklus der Anwendung verwendet werden. Beispielsweise ist ein Logger ein guter Kandidat für das Hungry Pattern, da die Protokollierungsfunktion normalerweise zu Beginn der Anwendung bereit sein und Nachrichten während der gesamten Laufzeit der Anwendung protokollieren muss.
Zusammenfassend lässt sich sagen, dass der Lazy-Man-Modus und der Hungrig-Man-Modus jeweils ihre eigenen Vor- und Nachteile haben und in praktischen Anwendungen umfassend berücksichtigt und entsprechend spezifischer Szenarien gestaltet werden sollten.
- 说一下事务的几种特性?
Transaktionen weisen vier grundlegende Merkmale auf, die auch als bezeichnet werdenSÄUREZu den Funktionen gehören insbesondere:
Atomarität : Atomarität bedeutet, dass alle Vorgänge in einer Transaktion entweder abgeschlossen oder nicht ausgeführt werden. Sie sind eine unteilbare Arbeitseinheit. Wenn während der Ausführung der Transaktion Fehler oder Ausfälle auftreten, werden die durchgeführten Vorgänge rückgängig gemacht (zurückgesetzt) und die gesamte Transaktion wird wie ein Vorgang sein, der nie stattgefunden hat. Diese Funktion stellt die Integrität und Konsistenz der Transaktionen sicher.
Konsistenz : Konsistenz bedeutet, dass eine Transaktion die Datenbank von einem Konsistenzzustand in einen anderen Konsistenzzustand umwandeln muss. Vor Beginn und nach Ende der Transaktion werden die Integritätsbeschränkungen der Datenbank (z. B. Primärschlüsseleinschränkungen, Fremdschlüsseleinschränkungen usw.) nicht zerstört und alle Daten behalten die logische Konsistenz bei. Wenn die Integrität der Datenbank während der Ausführung einer Transaktion beeinträchtigt wird, wird die Transaktion abgebrochen und die durchgeführten Vorgänge werden zurückgesetzt.
Isolierung : Isolation bedeutet, dass bei gleichzeitiger Ausführung mehrerer Transaktionen jede Transaktion voneinander isoliert ist und die Ausführung einer Transaktion nicht durch andere Transaktionen beeinträchtigt werden kann. Das Datenbanksystem bietet ein gewisses Maß an Isolation, sodass gleichzeitig ausgeführte Transaktionen sich nicht gegenseitig beeinträchtigen und so die Korrektheit und Konsistenz der Daten sichergestellt werden. Die Isolierung wird normalerweise durch Mechanismen wie Sperren (z. B. Zeilensperren, Tabellensperren usw.) oder Multi-Version-Parallelitätskontrolle (MVCC) erreicht.
Haltbarkeit : Haltbarkeit, auch Permanenz genannt, bedeutet, dass nach dem Festschreiben einer Transaktion ihre Änderungen an der Datenbank dauerhaft sind und auch bei einem Systemausfall nicht verloren gehen. Das Datenbanksystem gewährleistet die Dauerhaftigkeit von Transaktionen durch Protokolle und Wiederherstellungsmechanismen. Selbst wenn ein Systemausfall auftritt, kann das System die Änderungen an der Datenbank durch festgeschriebene Transaktionen über Protokolle wiederherstellen.
- 说一下你在做项目的过程中都遇到过哪些异常吗?(Listen Sie einfach einige auf)
Code-Ausnahmen:
NullPointerException : Wird ausgelöst, wenn versucht wird, auf ein nicht initialisiertes Objekt zuzugreifen oder es zu bedienen. Es kommt häufig vor, dass vergessen wird, zu prüfen, ob das Objekt null ist, und es direkt zu verwenden.
Array-Ausnahme außerhalb der Grenzen (ArrayIndexOutOfBoundsException): Beim Zugriff auf das Array wurde ein ungültiger Index verwendet (der Index ist kleiner als 0 oder größer oder gleich der Array-Größe).
Typkonvertierungsausnahme (ClassCastException): Beim Casting ist das konvertierte Objekt keine Instanz des Zieltyps oder seiner Unterklasse.
ArithmeticException // durch Null: Bei der Durchführung einer Divisionsoperation ist der Divisor Null.
Datenausnahmen:
Fehler im Datenformat: Beispielsweise entspricht das Datenformat beim Parsen von JSON- oder XML-Daten nicht den Erwartungen.
Ausnahme der Datenintegrität: Wenn eine Fremdschlüsseleinschränkung in der Datenbank fehlschlägt, werden Datenintegritätsregeln verletzt, wenn versucht wird, Daten einzufügen oder zu aktualisieren.
Ausnahme: Daten nicht gefunden: Wenn die entsprechenden Daten gemäß den angegebenen Bedingungen bei der Abfrage der Datenbank nicht gefunden werden.
Netzwerkausnahmen:
Verbindungszeitlimit (ConnectTimeoutException): Beim Versuch, eine Netzwerkverbindung herzustellen, kam es beim Warten auf eine Antwort zu einer Zeitüberschreitung der Verbindungsanforderung.
Lesezeitüberschreitung (SocketTimeoutException): Beim Lesen von Daten aus der Verbindung ist beim Vorgang eine Zeitüberschreitung aufgetreten.
Das Netzwerk ist nicht erreichbar (UnknownHostException):kann den Hostnamen nicht auflösen.
Verbindung abgelehnt (ConnectionRefusedError): Der Zielcomputer hat die Verbindungsanfrage abgelehnt.
Ausnahmen von Systemressourcen:
Speicherüberlauf (OutOfMemoryError): Beim Versuch, Speicher zuzuweisen, stand der JVM nicht genügend Speicherplatz zur Verfügung.
Datei existiert nicht (FileNotFoundException): Die Datei oder das Verzeichnis, auf die Sie zugreifen möchten, existiert nicht.
Unzureichende Berechtigungen (SecurityException/AccessDeniedException): Unzureichende Berechtigungen zum Ausführen eines Vorgangs, z. B. Lesen und Schreiben von Dateien, Zugriff auf Netzwerkressourcen usw.
Ausnahmen von Drittanbieterdiensten:
Der Dienst ist nicht verfügbar (ServiceUnavailableException): Der abhängige Drittanbieterdienst ist vorübergehend nicht verfügbar.
API-Limit (RateLimitException): Die Anforderung an die Drittanbieter-API überschreitet ihr Limit (z. B. das Anforderungshäufigkeitslimit).
Authentifizierung fehlgeschlagen (AuthenticationException): Beim Zugriff auf Dienste von Drittanbietern sind die Authentifizierungsinformationen ungültig oder abgelaufen.
Logische Ausnahmen:
Fehler in der Geschäftslogik: Beispielsweise wird die Bestellmenge falsch berechnet, der Lagerbestand reicht nicht aus, die Bestellung wird aber noch bearbeitet usw.
Inkonsistenter Status: Ein bestimmter Zustand des Systems entspricht nicht den Erwartungen, was dazu führt, dass nachfolgende Vorgänge nicht möglich sind.
- 说一下时间常用的三个类?
LocalDate, LocalTime, LocalDateTime. (Listen Sie einfach alle drei auf)
In Java sind die am häufigsten verwendeten Klassen für die Verarbeitungszeit Klassen unter den drei Paketen java.util.Date, java.util.Calendar und java.time, die in Java 8 eingeführt wurden (z. BOrtsdatum, Ortszeit, Ortsdatum/-zeitWarten)
- 说一下日历的三个方法?
Wenn es um kalenderbezogene Vorgänge geht, denken wir normalerweise an die Klasse java.util.Calendar, da es sich um eine abstrakte Klasse handelt, die Methoden zum Betreiben von Kalenderfeldern (wie Jahr, Monat, Tag, Stunde usw.) bereitstellt.Ab Java 8 wurde eine neue Datums- und Uhrzeit-API (im Paket java.time) eingeführt, die bessere Möglichkeiten zur Datums- und Uhrzeitverarbeitung bietet.
Einführung in gängige Methoden von LocalDateTime:
Erstellen Sie ein LocalDateTime-Objekt
now(): Erstellt ein LocalDateTime-Objekt, das das aktuelle Datum und die aktuelle Uhrzeit darstellt.
of(): Erstellt ein LocalDateTime-Objekt mit dem angegebenen Jahr, Monat, Tag, Stunde, Minute, Sekunde (und optional Nanosekunde). Zum Beispiel: LocalDateTime.of(2023, Month.JANUARY, 1, 12, 0, 0).
Rufen Sie die Eigenschaften des LocalDateTime-Objekts ab
getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute(), getSecond() usw.: werden verwendet, um die Attribute Jahr, Monat, Tag, Stunde, Minute und Sekunde im LocalDateTime-Objekt abzurufen.
Ändern Sie die Eigenschaften des LocalDateTime-Objekts
withYear(), withMonth(), withDayOfMonth(), withHour(), withMinute(), withSecond() usw.: Setzen Sie eine Eigenschaft des LocalDateTime-Objekts auf den angegebenen Wert und geben Sie ein neues LocalDateTime-Objekt zurück. Das ursprüngliche Objekt bleibt unverändert . Variable (da LocalDateTime unveränderlich ist).
Addition und Subtraktion von Datum und Uhrzeit
plusYears(), plusMonths(), plusDays(), plusHours(), plusMinutes(), plusSeconds() usw.: Fügen Sie den angegebenen Zeitraum zum LocalDateTime-Objekt hinzu und geben Sie ein neues LocalDateTime-Objekt zurück. minusYears(), minusMonths(), minusDays(), minusHours(), minusMinutes(), minusSeconds() usw.: Subtrahieren Sie den angegebenen Zeitraum vom LocalDateTime-Objekt und geben Sie ein neues LocalDateTime-Objekt zurück.
Vergleichen Sie LocalDateTime-Objekte
isBefore(LocalDateTime other): Bestimmen Sie, ob das aktuelle Objekt früher als das angegebene LocalDateTime-Objekt ist.
isAfter(LocalDateTime other): Bestimmen Sie, ob das aktuelle Objekt später als das angegebene LocalDateTime-Objekt ist.
Formatieren Sie das LocalDateTime-Objekt
format(DateTimeFormatter formatter): Formatieren Sie das LocalDateTime-Objekt in eine Zeichenfolge im angegebenen Datums- und Uhrzeitformat. Zum Beispiel: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = dateTime.format(formatter);.
Zeitunterschied berechnen
Obwohl LocalDateTime selbst keine Methode zur direkten Berechnung des Zeitunterschieds bereitstellt, können Sie die Duration-Klasse oder die ChronoUnit-Klasse verwenden, um den Zeitunterschied zwischen zwei LocalDateTime-Objekten zu berechnen.
Verwenden Sie die Duration-Klasse: Duration duration = Duration.between(start, end); und dann können Sie den spezifischen Wert der Zeitdifferenz, z. B. Sekunden, Millisekunden usw., über das Dauerobjekt abrufen.
Mithilfe der ChronoUnit-Klasse können Sie die Einheit für die Berechnung der Zeitdifferenz angeben, z. B. Jahr, Monat, Tag, Stunde usw. Zum Beispiel: lange Tage = ChronoUnit.DAYS.between(start, end);.
- 说一下session的生命周期吧。
Sitzungserstellung
Erstellungszeitpunkt:Session wird verwendet, wenn der Benutzer zum ersten Mal auf den Server zugreift und JSP, Servlet usw. anfordert.动态资源 erstellt wann.Greifen Sie nur auf HTML, Bilder usw. zu.静态资源 Die Erstellung einer Sitzung wird dadurch nicht ausgelöst. Bei Bedarf können Sie die Sitzungsgenerierung erzwingen, indem Sie request.getSession(true) aufrufen.
Lagerraum: Die Sitzung wird auf der Serverseite gespeichert, normalerweise im Speicher des Servers, um einen schnellen Zugriff zu ermöglichen.
Sitzungswartung
Aktualisieren Sie die letzte Zugriffszeit: Solange der Benutzer weiterhin auf den Server zugreift, aktualisiert der Server die letzte Zugriffszeit der Sitzung und behält die Sitzung für jede Anforderung bei, unabhängig davon, ob die Sitzung gelesen oder geschrieben werden soll. Dies zeigt an, dass sich die Sitzung des Benutzers in einem „aktiven“ Zustand befindet.
Einzigartigkeit der Sitzung : Jeder Benutzer verfügt über eine unabhängige Sitzung, die eindeutig durch die Sitzungs-ID identifiziert wird. Die Sitzungs-ID wird normalerweise über ein Cookie (mit dem Namen JSESSIONID) an den Client gesendet, damit der Server verschiedene Benutzersitzungen identifizieren kann.
Sitzungszerstörung
Automatisch zerstören : Wenn der Sitzungslebenszyklus abläuft (d. h. es gibt über einen längeren Zeitraum keine Aktivität), löscht der Server die Sitzung automatisch aus dem Speicher. Diese Zeit ist normalerweise konfigurierbar und beträgt in Tomcat standardmäßig 30 Minuten.
Manuelle Zerstörung : Entwickler können die Sitzung manuell zerstören, indem sie die invalidate()-Methode der Sitzung aufrufen. Dies wird normalerweise für Szenarien wie Abmelden und Zeitüberschreitung verwendet.
Einstellungen für den Sitzungslebenszyklus
Im Servlet festlegen: Legen Sie das Sitzungszeitlimit in Sekunden fest, indem Sie die Methode session.setMaxInactiveInterval(int Interval) aufrufen.
In web.xml festlegen: In der web.xml-Datei der Webanwendung通过