Vorrei chiederti se hai realizzato qualche progetto qui?
Potresti parlarci dei progetti su cui hai lavorato, quale stack tecnologico hai utilizzato e di quali contenuti sei stato responsabile dello sviluppo? (Esperienza di progetto)
Quali sono gli otto tipi di dati di base? (Base)
Potete dirmi se il tipo lungo può essere eseguito direttamente? La domanda dovrebbe essere: può essere calcolato direttamente? (Base)
Capisci il modello singleton? Puoi parlarne (Design Patterns)
Qual è la differenza tra la modalità uomo pigro e la modalità uomo affamato?
Quali sono le caratteristiche delle transazioni? (transazione)
Parlami delle eccezioni che hai riscontrato mentre lavoravi ai progetti? (anormale)
Parliamo delle tre categorie di tempo comunemente utilizzate? (Base)
Parli di tre metodi di calendarizzazione?
Parliamo del ciclo di vita della sessione. (sessione)
Hai mai riscontrato una perdita di precisione in virgola mobile mentre lavori su un progetto? come l'hai risolto?
Quindi abbiamo un calcolo utilizzando la virgola mobile. Quale tipo di dati sceglieresti per calcolare?
Potete dirmi alcune annotazioni comunemente usate? Primavera? O qualcos'altro?
Conosci i thread?
Qual è la differenza tra thread e processo?
Allora dimmi cos'è la sicurezza del thread?
Dimmi la differenza tra == ed è uguale?
Quindi hai mai usato Linux? Puoi parlare brevemente di alcuni comandi di uso comune?
problema risolto
- 我想问一下你这边有做过什么项目吗?
Penso che potresti semplicemente scegliere uno o due progetti relativamente competenti di cui parlare.
- 你说一下long类型能直接运转吗(Penso che si chieda se i dati di tipo lungo possono essere gestiti direttamente)
È possibile utilizzare direttamente i dati di tipo lungo Quando si mescolano valori di tipo int e lungo in un'espressione, il valore di tipo int verrà automaticamente promosso a tipo lungo per garantire che il risultato dell'intera espressione sia di tipo lungo.
- 你了解单例模式吗?你可以讲一下吗
Singleton Pattern è un modello di progettazione software comunemente utilizzato. Il suo scopo è garantire che una classe abbia una sola istanza e fornire un punto di accesso globale per ottenere questa istanza univoca. Questo modello è utile quando è necessario controllare l'accesso alle risorse o quando la creazione di istanze di oggetti richiede un uso intensivo di risorse o di tempo e solo una di queste risorse o istanze è necessaria a livello globale. I metodi di implementazione comuni della modalità singleton includono principalmente: la modalità pigra e la modalità affamata.
- 懒汉模式跟饿汉模式有什么区别?
Può essere ottenuto daTempi di inizializzazione degli oggetti, sicurezza dei thread e utilizzo delle risorseConfronta in altri aspetti:
Tempi di inizializzazione
modalità pigra: La modalità pigra è a延迟加载 modello singleton.È caratterizzato da第一次使用时创建实例对象 , invece di crearlo quando la classe viene caricata.Questo modello evita la necessità di oggetti istanza quando资源浪费, creato solo quando necessario.
Modalità fame: La modalità Hungry Man è una specie di在类加载时就创建实例 modello singleton. La sua caratteristica è che l'oggetto istanza viene creato al caricamento della classe, indipendentemente dal fatto che venga utilizzata.Questo metodo garantisce che lo stesso oggetto istanza possa essere ottenuto in qualsiasi circostanza, ma potrebbe causarne alcuni性能和资源上的浪费, soprattutto in alcuni casi l'oggetto istanza non viene utilizzato.
sicurezza del filo
modalità pigra: La modalità pigra stessa lo è非线程安全的 , poiché esiste la possibilità che più thread chiamino il metodo getInstance() contemporaneamente e inserino l'istruzione di giudizio contemporaneamente, determinando la creazione di più istanze.Per ottenere la sicurezza del thread, è possibile utilizzare il metodo getInstance()添加synchronized关键字 , ma ciò comporterà un sovraccarico delle prestazioni. Inoltre, è possibile utilizzare il blocco a doppio controllo (Double-Checked Locking) e altri metodi per ridurre il sovraccarico della sincronizzazione.
Modalità fame: La modalità fame è线程安全Sì, poiché l'oggetto istanza è stato creato al caricamento della classe, non vi è alcun problema di concorrenza in un ambiente multi-thread.
Utilizzo delle risorse e prestazioni
modalità pigra : la modalità lazy può risparmiare risorse perché evita di sprecare risorse quando gli oggetti istanza non sono necessari. Tuttavia, poiché deve essere inizializzato la prima volta che viene utilizzato, le prestazioni potrebbero risentirne se il processo di inizializzazione è complesso o richiede molto tempo.
Modalità fame : La modalità affamata potrebbe non essere flessibile quanto la modalità pigra in termini di utilizzo delle risorse, poiché crea oggetti istanza indipendentemente dal fatto che verranno utilizzati. Tuttavia, poiché l'oggetto istanza è già creato quando la classe viene caricata, è più veloce alla prima chiamata poiché non è richiesta alcuna inizializzazione.
Scena applicabile
modalità pigra: Applicabile aUno scenario in cui l'oggetto viene creato solo quando viene utilizzato per la prima volta e non sono presenti complessi requisiti di sicurezza del thread durante il processo di inizializzazione dell'oggetto istanza. . Per esempio,gestore di fileQuesto è un esempio tipico, perché potrebbe non essere necessario leggere e scrivere i file immediatamente all'avvio dell'applicazione, ma eseguire le operazioni correlate solo quando necessario.
Modalità fame : Adatto per risorse che devono essere inizializzate all'avvio del programma e vengono utilizzate durante tutto il ciclo di vita dell'applicazione. Ad esempio, un logger è un buon candidato per Hungry Pattern perché la funzionalità di registrazione in genere deve essere pronta all'inizio dell'applicazione e registrare i messaggi durante il runtime dell'applicazione.
In sintesi, la modalità uomo pigro e la modalità uomo affamato presentano ciascuna i propri vantaggi e svantaggi e nelle applicazioni pratiche dovrebbero essere considerate in modo completo e progettate in base a scenari specifici.
- 说一下事务的几种特性?
Le transazioni hanno quattro caratteristiche fondamentali, a cui ci si riferisce anche comeACIDOLe caratteristiche includono in particolare:
Atomicita : Atomicità significa che tutte le operazioni in una transazione sono completate o non eseguite. Sono un'unità di lavoro indivisibile. Se si verificano errori o fallimenti durante l'esecuzione della transazione, le operazioni eseguite verranno annullate (ripristinate) e l'intera transazione sarà come un'operazione mai avvenuta. Questa funzionalità garantisce l'integrità e la coerenza della transazione.
Consistenza : Coerenza significa che una transazione deve trasformare il database da uno stato di coerenza a un altro stato di coerenza. Prima dell'inizio e al termine della transazione, i vincoli di integrità del database (come vincoli di chiave primaria, vincoli di chiave esterna, ecc.) non vengono distrutti e tutti i dati mantengono la coerenza logica. Se l'integrità del database viene compromessa durante l'esecuzione di una transazione, la transazione verrà interrotta e le operazioni eseguite verranno annullate.
Isolamento : Isolamento significa che quando più transazioni vengono eseguite contemporaneamente, ciascuna transazione è isolata l'una dall'altra e l'esecuzione di una transazione non può essere interferita da altre transazioni. Il sistema di database fornisce un certo livello di isolamento in modo che le transazioni eseguite contemporaneamente non interferiscano tra loro, garantendo così la correttezza e la coerenza dei dati. L'isolamento viene solitamente ottenuto tramite meccanismi come blocchi (come blocchi di riga, blocchi di tabella, ecc.) o controllo della concorrenza multiversione (MVCC).
Durabilità : Durabilità, chiamata anche permanenza, significa che una volta confermata una transazione, le sue modifiche al database sono permanenti e non andranno perse anche se il sistema fallisce. Il sistema di database garantisce la durabilità delle transazioni tramite log e meccanismi di ripristino Anche se si verifica un errore di sistema, il sistema può ripristinare le modifiche al database mediante transazioni eseguite tramite log.
- 说一下你在做项目的过程中都遇到过哪些异常吗?(Basta elencarne alcuni)
Eccezioni del codice:
NullPointerException : generato quando si tenta di accedere o utilizzare un oggetto non inizializzato. È normale dimenticare di verificare se l'oggetto è nullo e utilizzarlo direttamente.
Eccezione di array fuori dai limiti (ArrayIndexOutOfBoundsException): è stato utilizzato un indice non valido durante l'accesso all'array (l'indice è inferiore a 0 o maggiore o uguale alla dimensione dell'array).
Eccezione di conversione del tipo (ClassCastException): Durante il cast, l'oggetto da convertire non è un'istanza del tipo di destinazione o della sua sottoclasse.
ArithmeticException // per zero: Quando si esegue un'operazione di divisione, il divisore è zero.
Eccezioni dati:
Errore nel formato dei dati: ad esempio, durante l'analisi di dati JSON o XML, il formato dei dati non soddisfa le aspettative.
Eccezione sull'integrità dei dati: se un vincolo di chiave esterna nel database fallisce, le regole di integrità dei dati vengono violate quando si tenta di inserire o aggiornare i dati.
Eccezione dati non trovati: Se i dati corrispondenti non vengono trovati secondo le condizioni specificate durante l'interrogazione del database.
Eccezioni di rete:
Timeout della connessione (ConnectTimeoutException): durante il tentativo di stabilire una connessione di rete, la richiesta di connessione è scaduta durante l'attesa di una risposta.
Timeout di lettura (SocketTimeoutException): L'operazione è scaduta durante la lettura dei dati dalla connessione.
La rete non è raggiungibile (UnknownHostException):non è possibile risolvere un indirizzo su un nome host.
Connessione rifiutata (ConnectionRefusedError): Il computer di destinazione ha rifiutato la richiesta di connessione.
Eccezioni delle risorse di sistema:
Overflow di memoria (OutOfMemoryError): La JVM non disponeva di spazio di memoria sufficiente durante il tentativo di allocare memoria.
Il file non esiste (FileNotFoundException): Il file o la directory a cui stai tentando di accedere non esiste.
Autorizzazioni insufficienti (SecurityException/AccessDeniedException): Autorizzazioni insufficienti per eseguire un'operazione, come leggere e scrivere file, accedere alle risorse di rete, ecc.
Eccezioni del servizio di terze parti:
Il servizio non è disponibile (ServiceUnavailableException): il servizio di terze parti dipendente è temporaneamente non disponibile.
Limite API (RateLimitException): la richiesta all'API di terze parti supera il limite (ad esempio il limite di frequenza della richiesta).
Autenticazione non riuscita (AuthenticationException): Quando si accede a servizi di terze parti, le informazioni di autenticazione non sono valide o sono scadute.
Eccezioni logiche:
Errore di logica aziendale: Ad esempio, l'importo dell'ordine è calcolato in modo errato, l'inventario è insufficiente ma l'ordine è ancora in elaborazione, ecc.
Stato incoerente: Un certo stato del sistema non è coerente con le aspettative, rendendo impossibili le operazioni successive.
- 说一下时间常用的三个类?
LocalDate, LocalTime, LocalDateTime. (Elencarne solo tre)
In Java, le classi comunemente utilizzate per il tempo di elaborazione sono classi nei tre pacchetti java.util.Date, java.util.Calendar e java.time introdotti in Java 8 (comeData locale, Ora locale, Data locale e Ora localeAspettare)
- 说一下日历的三个方法?
Quando si tratta di operazioni relative al calendario, di solito pensiamo alla classe java.util.Calendar, perché è una classe astratta che fornisce metodi per utilizzare i campi del calendario (come anno, mese, giorno, ora, ecc.).A partire da Java 8, è stata introdotta una nuova API di data e ora (situata nel pacchetto java.time), che fornisce migliori capacità di elaborazione di data e ora.
Introduzione ai metodi comuni di LocalDateTime:
Crea un oggetto LocalDateTime
now(): crea un oggetto LocalDateTime che rappresenta la data e l'ora correnti.
of(): crea un oggetto LocalDateTime con l'anno, il mese, il giorno, l'ora, il minuto, il secondo specificati (e il nanosecondo facoltativo). Ad esempio: LocalDateTime.of(2023, Month.JANUARY, 1, 12, 0, 0).
Ottieni le proprietà dell'oggetto LocalDateTime
getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute(), getSecond(), ecc.: utilizzati per ottenere rispettivamente gli attributi anno, mese, giorno, ora, minuto e secondo nell'oggetto LocalDateTime.
Modificare le proprietà dell'oggetto LocalDateTime
withYear(), withMonth(), withDayOfMonth(), withHour(), withMinute(), withSecond(), ecc.: imposta una proprietà dell'oggetto LocalDateTime sul valore specificato e restituisce un nuovo oggetto LocalDateTime . variabile (perché LocalDateTime è immutabile).
Addizione e sottrazione di data e ora
plusYears(), plusMonths(), plusDays(), plusHours(), plusMinutes(), plusSeconds() e così via: aggiunge il periodo di tempo specificato all'oggetto LocalDateTime e restituisce un nuovo oggetto LocalDateTime. minusYears(), minusMonths(), minusDays(), minusHours(), minusMinutes(), minusSeconds() e così via: sottrae il periodo di tempo specificato dall'oggetto LocalDateTime e restituisce un nuovo oggetto LocalDateTime.
Confronta gli oggetti LocalDateTime
isBefore(LocalDateTime other): determina se l'oggetto corrente è precedente all'oggetto LocalDateTime specificato.
isAfter(LocalDateTime other): determina se l'oggetto corrente è successivo all'oggetto LocalDateTime specificato.
Formato oggetto LocalDateTime
format(DateTimeFormatter formattatore): formatta l'oggetto LocalDateTime in una stringa nel formato di data e ora specificato. Ad esempio: DateTimeFormatter formattatore = DateTimeFormatter.ofPattern("aaaa-MM-gg HH:mm:ss"); String formattedDateTime = dateTime.format(formatter);.
Calcola la differenza oraria
Sebbene LocalDateTime stesso non fornisca un metodo per calcolare direttamente la differenza oraria, è possibile utilizzare la classe Duration o la classe ChronoUnit per calcolare la differenza oraria tra due oggetti LocalDateTime.
Utilizza la classe Duration: Durata durata = Duration.between(start, end);, quindi puoi ottenere il valore specifico della differenza temporale, come secondi, millisecondi, ecc., tramite l'oggetto durata.
Utilizzando la classe ChronoUnit: è possibile specificare l'unità per il calcolo della differenza oraria, come anno, mese, giorno, ora, ecc. Ad esempio: giorni lunghi = ChronoUnit.DAYS.between(start, end);.
- 说一下session的生命周期吧。
Creazione della sessione
Tempo di creazione:La sessione viene utilizzata quando l'utente accede per la prima volta al server e richiede JSP, Servlet, ecc.动态资源 creato quando.Accedi solo a HTML, immagini, ecc.静态资源 Non attiverà la creazione della sessione. Se necessario, puoi forzare la generazione della sessione chiamando request.getSession(true).
posizione di archiviazione: la sessione viene archiviata sul lato server, solitamente nella memoria del server per un accesso rapido.
Manutenzione della sessione
Aggiorna l'ora dell'ultimo accesso: finché l'utente continua ad accedere al server, il server aggiornerà l'ora dell'ultimo accesso della Sessione e manterrà la Sessione per ogni richiesta, indipendentemente se leggere o scrivere la Sessione. Ciò indica che la sessione dell'utente è in uno stato "attivo".
unicità della sessione : Ogni utente avrà una Sessione indipendente, identificata univocamente dal Session ID. L'ID di sessione viene solitamente inviato al client tramite un cookie (denominato JSESSIONID) in modo che il server possa identificare diverse sessioni utente.
Distruzione della sessione
Distruggi automaticamente : Quando il ciclo di vita della sessione scade (ovvero, non vi è alcuna attività per un lungo periodo), il server la cancellerà automaticamente dalla memoria. Questa volta è generalmente configurabile e il valore predefinito è 30 minuti in Tomcat.
Distruzione manuale : gli sviluppatori possono distruggere manualmente la sessione chiamando il metodo invalidate() della sessione. Questo viene solitamente utilizzato per scenari come logout e timeout.
Impostazioni del ciclo di vita della sessione
Imposta nel servlet: imposta il timeout della sessione in secondi chiamando il metodo session.setMaxInactiveInterval(int interval).
Impostato in web.xml: nel file web.xml dell'applicazione web,通过