日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java面试题总结

發布時間:2023/12/31 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面试题总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

中信銀行

1.Integer范圍問題

Integer a=100,b=100,c=200,d=200; System.out.println(a == b);//true System.out.println(c == d);//false

?? Integer在-128~127之間會有緩存,在數字之間的地址值是一樣的,超過的會new出一個新的對象。

?

2.List如何求并集

List<String> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>();//并集 list2.removeAll(list1); list1.addAll(list2);//交集 list1.retainAll(list2);//差集 list1.removeAll(list2);

?考點List集合類collections的一些方法

?

3.三個線程同時執行,順序輸出ABC

public class TestThread1 {public static void main(String[] args) {// 線程Afinal Thread a = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("A");}});// 線程Bfinal Thread b = new Thread(new Runnable() {@Overridepublic void run() {try {// 執行b線程之前,加入a線程,讓a線程執行a.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("B");}});// 線程Cfinal Thread c = new Thread(new Runnable() {@Overridepublic void run() {try {// 執行c線程之前,加入b線程,讓b線程執行b.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("C");}});// 線程DThread d = new Thread(new Runnable() {@Overridepublic void run() {try {// 執行d線程之前,加入c線程,讓c線程執行c.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("D");}});// 啟動四個線程a.start();b.start();c.start();d.start();} }

檢測線程狀態的變化 join

?

4.private long val;??? 屬性val的get set方法高并發下會不會有問題?如何處理。

public class Data {private int data;private ReadWriteLock lock = new ReentrantReadWriteLock();public void set(int data){lock.writeLock().lock(); //取到寫鎖try {System.out.println(Thread.currentThread().getName()+"準備寫入數據!");try {Thread.sleep(0);}catch (InterruptedException e) {e.printStackTrace(); //打印異常信息}this.data = data;System.out.println(Thread.currentThread().getName()+"寫入"+this.data);}finally {lock.writeLock().unlock(); //釋放寫鎖!}}public void get(){lock.readLock().lock(); // 取到讀鎖!try {System.out.println(Thread.currentThread().getName()+"準備讀取數據");try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace(); //打印異常}System.out.println(Thread.currentThread().getName()+"讀取數據!");}finally {lock.readLock().unlock(); //釋放讀鎖!}}}

?

?

5.Collection和Collections區別

java.util.Collection 是一個集合接口(集合類的一個頂級接口)。其直接繼承接口有List與Set。

List特點:元素有放入順序,元素可重復 ,Set特點:元素無放入順序,元素不可重復,重復元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set?的Object必須定義equals()方法?,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標來取得想要的值。

Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。?
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。?

LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;

?

Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用于對集合中元素進行排序、搜索以及線程安全等各種操作。

  • 排序(Sort) 根據元素的自然順序 對指定列表按升序進行排序。列表中的所有元素都必須實現 Comparable 接口。此列表內的所有元素都必須是使用指定比較器可相互比較的
  • 混排(Shuffling)
    混排算法所做的正好與 sort 相反: 它打亂在一個 List 中可能有的任何排列的蹤跡。也就是說,基于隨機源的輸入重排該 List, 這樣的排列具有相同的可能性(假設隨機源是公正的)。這個算法在實現一個碰運氣的游戲中是非常有用的。例如,它可被用來混排代表一副牌的 Card 對象的一個 List 。另外,在生成測試案例時,它也是十分有用的。Collections.Shuffling(list)
  • 反轉(Reverse)
    使用Reverse方法可以根據元素的自然順序 對指定列表按降序進行排序。
    Collections.reverse(list)
  • 替換所以的元素(Fill)
    使用指定元素替換指定列表中的所有元素。Collections.fill(li,"aaa");
  • ……..

    6.Springmvc spring boot區別,簡化了哪些地方

    Spring MVC是基于 Servlet 的一個 MVC 框架 主要解決 WEB 開發的問題,因為 Spring 的配置非常復雜,各種XML、 JavaConfig處理起來比較繁瑣。于是為了簡化開發者的使用,從而創造性地推出了Spring boot,約定優于配置,簡化了spring的配置流程。

    Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應用組件。大家覺得挺好用,于是按照這種模式搞了一個 MVC框架(一些用Spring 解耦的組件),用開發 web 應用( SpringMVC )。然后有發現每次開發都寫很多樣板代碼,為了簡化工作流程,于是開發出了一些“懶人整合包”(starter),這套就是 Spring Boot。

    7.Springboot核心注解?

    7.1.@SpringBootApplication

    用于Spring主類上最最最核心的注解,自動化配置文件,表示這是一個SpringBoot項目,用于開啟SpringBoot的各項能力。

    相當于@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解的組合。

    7.2.@EnableAutoConfiguration

    允許SpringBoot自動配置注解,開啟這個注解之后,SpringBoot就能根據當前類路徑下的包或者類來配置Spring Bean。

    例如:

    當前路徑下有MyBatis這個Jar包,MyBatisAutoConfiguration 注解就能根據相關參數來配置Mybatis的各個Spring Bean。

    7.3.@Configuration

    Spring 3.0添加的一個注解,用來代替applicationContext.xml配置文件,所有這個配置文件里面能做到的事情都可以通過這個注解所在的類來進行注冊。

    7.4.@SpringBootConfiguration

    @Configuration注解的變體,只是用來修飾Spring Boot的配置而已。

    7.5.@ComponentScan

    Spring 3.1添加的一個注解,用來代替配置文件中的component-scan配置,開啟組件掃描,自動掃描包路徑下的@Component注解進行注冊bean實例放到context(容器)中。

    8.Redis如何查出1000w key? order:orderId

    常規的查找key,使用的是KEYS pattern 查找所有符合給定模式pattern的key
    但使用keys命令在海量數據下是有問題的

    ??? keys指令一次性返回所有匹配的key
    ??? 鍵的數量過大會造成服務的卡頓, 需要等很久才會返回結果.

    從海量key里查詢出某一固定前綴的key 主要用到了SCAN 命令 ,該命令的格式如下:
    SCAN cursor [MATCH pattern] [COUNT count]
    cursor 為游標, 即從哪里開始查找, 第一次查找時,傳入0.
    MATCH pattern 為查找的條件
    count 為返回的個數, 雖然這里可以填寫返回的個數, 但是真實返回的數量是不可控的, 只能是大概率的返回符合count的參數.

    SCAN 命令是一個基于游標的迭代器(cursor based iterator): SCAN 命令每次被調用之后, 都會向用戶返回一個新的游標, 用戶在下次迭代時需要使用這個新游標作為 SCAN 命令的游標參數, 以此來延續之前的迭代過程。

    當 SCAN 命令的游標參數被設置為 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值為 0 的游標時, 表示迭代已結束。一次返回的數量不可控, 只能是大概率的符合count參數
    演示代碼如下, 查詢以order:orderId開頭的key:

    127.0.0.1:6379> scan 0 match order:orderId* count 10 1) "917504" 2) 1) "order:orderId:068846"2) "order:orderId:174741"3) "order:orderId:36682"4) "order:orderId:003555"5) "order:orderId:035818"6) "order:orderId:102763"

    ?

    9.一個表省市區的查詢語句,類似:同一張表省市縣sql查詢

    ?

    SELECT cy.NAME AS provice,cy.CODE AS proviceCode,ci.NAME AS city,ci.CODE AS cityCode,ct.country AS country,ct.cou2Code AS countryCode FROMt_unionpay_areacode cy LEFT JOIN t_unionpay_areacode ci ON ci.parent_code = cy.CODE AND ci.LEVEL = 2 LEFT JOIN (SELECT cou1.NAME AS city,cou1.CODE AS cou1Code,cou2.NAME AS country,cou2.CODE AS cou2Code FROMt_unionpay_areacode cou1 LEFT JOIN t_unionpay_areacode cou2 ON cou2.parent_code = cou1.CODE AND cou2.LEVEL = 3 WHERE cou1.LEVEL = 2) ct ON ci.NAME = ct.city

    10.數據庫有上億條數據的兩個表,有關聯字段如何查出表1的2000-2199兩百條與表2的關聯數據??

    ?

    11.volatile的作用是什么

    保持內存可見性:所有線程都能看到共享內存的最新狀態。

    public class TestInteger {private int value;public int get(){return value;}public void set(int value){this.value = value;} }

    TestInteger不是線程安全的,因為get和set方法都是在沒有同步的情況下進行的。如果線程1調用了set方法,那么正在調用的get的線程2可能會看到更新后的value值,也可能看不到

    解決方法很簡單,將value聲明為volatile變量

    private volatile int value;

    volatile的特殊規則就是:

    • read、load、use動作必須連續出現
    • assign、store、write動作必須連續出現

    所以,使用volatile變量能夠保證:

    • 每次讀取前必須先從主內存刷新最新的值。
    • 每次寫入后必須立即同步回主內存當中。

    也就是說,volatile關鍵字修飾的變量看到的隨時是自己的最新值。線程1中對變量v的最新修改,對線程2是可見的。

    12.Tomcat的結構是什么,數據量大了如何優化

    來自:Tomcat內部結構、工作原理、工作模式和運行模式、tomcat 體系結構詳解

    組成結構

    Tomcat的體系結構可以由Server.xml看出

    <Server> ... <Service> ... <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" 譯:service由多個connectors組成,多個service共享一個container(容器)。Note: A "Service" is not itself a "Container",so you may not define subcomponents such as "Valves" at this level.Documentation at /docs/config/service.html --> <Connector> ...<!--The connectors can use a shared executor, you can define one or more named thread pools-->譯:多個connector共享一個執行器(指Engine),你能定義一個或多個線程進入線程池。//這個按照我的理解翻譯的<!-- A "Connector" using the shared thread pool-->譯:一個connector共享一個線程池</Connector><Engine> ... <!-- An Engine represents the entry point (within Catalina) that processes every request.譯:一個Engine代表處理每個request請求的入口點(在Catalina中)The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host).Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Host> ... <Context> ...</Context></Host></Engine></Service></Server>

    ?

    ?

    性能優化

    來自:有關Tomcat提高并發量,性能優化的問題(已解決)

    1.在Tomcat目錄的bin/catalina.bat,打開這個文件,在前面添加一下配置

    jvm在client模式,進行內存回收時,會停下所有的其它工作,待回收完畢才去執行其它任務,在這期間eclipse就卡住了。所以適當的增加jvm申請的內存大小來減少其回收的次數甚至不回收,就會是卡的現象有明顯改善。 ?

    ???? 可以給Java虛擬機設置使用的內存,但是如果你的選擇不對的話,虛擬機不會補償。可通過命令行的方式改變虛擬機使用內存的大小。如下表所示有兩個參數用來設置虛擬機使用內存的大小。

    ???? 參數????? 描述

    ??? -Xms????? JVM初始化堆的大小

    ??? -Xmx????? JVM堆的最大值

    這兩個值的大小一般根據需要進行設置。初始化堆的大小執行了虛擬機在啟動時向系統申請的內存的大小。一般而言,這個參數不重要。但是有的應用程序在大負載 的情況下會急劇地占用更多的內存,此時這個參數就是顯得非常重要,如果虛擬機啟動時設置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必 須重復地增加內存來滿足使用。

    ??? 由于這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限于系統使用的物理內存。一般使用數據量較大的應用程序會使用持久對象,內存使用 有可能迅速地增長。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,并且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值 的80%。

    ??? Tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。

    ??? JAVA_OPTS='-Xms【初始化內存大小】

    ??? -Xmx【可以使用的最大內存】'

    ??? 需要把這個兩個參數值調大。

    Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下設置:

    ? 主要功能為JVM性能參數調優
    ?

    rem 以下配置為JVM參數調優 set JAVA_OPTS= -server rem 以服務器模式啟動,啟動速度慢,但更穩定,性能更好 -Xms8192M rem 由于本機內存為16G,這里就設置成8G(實際并未達到最大內存的80%) -Xmx8192M rem -Xms與-Xmx設成一樣的值,避免JVM因為頻繁的GC導致性能大起大落 -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M rem 內存永久保留區域 -XX:MaxPermSize=300M rem 內存永久保留區域 -XX:+DisableExplicitGC rem 禁止System.gc(),免得誤調用gc方法影響性能 -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC rem 對年輕代采用多線程并行回收,這樣收得快; -XX:+CMSParallelRemarkEnabled rem 帶CMS相關的是并發回收(CMS垃圾收集器) -XX:+UseCMSCompactAtFullCollection rem 帶CMS相關的是并發回收(CMS垃圾收集器) -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly rem 帶CMS相關的是并發回收(CMS垃圾收集器) -Djava.awt.headless=true

    ?1).JAVA_OPTS'-Xms256m-Xmx512m'

    表示初始化內存為256MB,可以使用的最大內存為512MB。

    另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有關,應該通過分 析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那么完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內存的需要一致,完全收集就很 快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的性能,要把堆的 大小設大,保證垃圾收集不在整個基準測試的過程中出現。

    ???? 如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5秒。如果垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的詳 細輸出,研究垃圾收集參數對性能的影響。一般說來,你應該使用物理內存的80%作為堆大小。當增加處理器時,記得增加內存,因為分配可以并行進行,而垃圾 收集不是并行的。

    2.打開conf/server.xml,并更改一下內容

    maxThreads 客戶請求最大線程數
    minSpareThreads Tomcat初始化時創建的 socket 線程數
    maxSpareThreads Tomcat連接器的最大空閑 socket 線程數
    enableLookups 若設為true, 則支持域名解析,可把 ip 地址解析為主機名
    redirectPort 在需要基于安全通道的場合,把客戶請求轉發到基于SSL 的 redirectPort 端口
    acceptAccount 監聽端口隊列最大數,滿了之后客戶請求會被拒絕(不能小于maxSpareThreads )
    connectionTimeout 連接超時
    minProcessors 服務器創建時的最小處理線程數
    maxProcessors 服務器同時最大處理線程數
    URIEncoding URL統一編碼
    ?

    <!-- 調優之前的配置 tomcat默認配置<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8"/>--> <!-- 調優之后的配置 --><Connector port="8080" protocol="HTTP/1.1"URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"useURIValidationHack="false"compression="on" compressionMinSize="2048"compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"redirectPort="8443"/>

    保存后,啟動tomcat進行壓力測試。結果最后錯誤率還是沒有改變(這里其實Tomcat的并發性能已經提高了)

    3.我想可能是mysql數據的連接問題,于是編輯了數據庫連接文件datasource.properties,將最大連接數與最長等待空間編輯如下

    #初始連接數 db.initialSize = 20 #定義最大連接數 db.maxActive = 200 #定義最大空間 db.maxIdle = 20 #定義最小空間 db.minIdle = 10 #定義最長等待時間 db.maxWait = 2000 db.defaultAutoCommit = true db.minEvictableIdleTimeMillis = 3600000

    最后測試結果,系統性能明顯提高,并發量增大并且穩定

    測試為每秒500次請求同一個接口,測試次數10次5000次請求成功,且返回數據無丟失。

    并發量500無壓力,并發量800無壓力。

    當并發量達到1000時,查看結果報告,1000次中出現三次請求失敗。

    4.經過以上配置,提高了系統性能,并發量接近1000次/s

    ?

    13.Jdk線程類型

    ?

    Hashmap? hashTable區別?? currentHashMap如何保證同步,數據不重復

    集合

    Hashset可以存空值嗎

    Spring bean 是單例的嗎?? 默認單例? 可以修改

    隊列queen和棧stack

    Aop場景?slf4j? 事務 Transactional

    Feign是什么?如何使用?

    Redis部署單機? 集群? 哨兵模式的區別

    性能優化? 如 查垃圾收集情況得命令

    項目管理理論? 敏捷開發等

    ?

    Mysql 主鍵和唯一索引的區別?

    主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。

    主鍵創建后一定包含一個唯一性索引,唯一性索引并不一定就是主鍵。

    唯一性索引列允許空值,而主鍵列不允許為空值。

    主鍵列在創建時,已經默認為非空值 + 唯一索引了。

    主鍵可以被其他表引用為外鍵,而唯一索引不能。

    一個表最多只能創建一個主鍵,但可以創建多個唯一索引。

    主鍵和唯一索引都可以有多列。

    主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。

    在 RBO 模式下,主鍵的執行計劃優先級要高于唯一索引。 兩者可以提高查詢的速度。

    ?

    索引的類型?

    普通索引、唯一索引、全文索引

    ?


    1.字符串截取用什么方法

    2.查找一個字符串中字符的位置用什么方法

    3.想要獲取一個字符串中的一個單詞 (這個單詞有可能不在字符串中)

    4.詳細描述下list

    5.什么是事務,怎么利用事務

    6.簡述下重載與重寫的區別,兩者父類與子類的返回值要求相同嗎?

    7.現場給我出了一個數據庫題目,一個表,是描述奧運會中每個國家每個項目所獲得的獎牌數,求每個國家所獲得獎牌總數

    8.簡述下三大框架

    9.描述你所做過的項目,談談其中所包含的技術

    ?貓跡商城:使用了springmvc框架,mybatis作為數據持久化的中間件,mysql做數據庫,redis作為分布式緩存。

    ?一物一碼營銷系統:使用springboot框架,微服務思想,多模塊開發,mybatis-plus工具,mysql數據庫,redis做緩存。部分功能采用多線程開發,提高生產效率

    ?招商證券案例管理系統:非開源微服務架構,

    中信銀行-動卡空間-積分游戲:采用springboot框架,mybatis作為中間件,mysql數據庫,redis緩存,接入eureka服務注冊中心,kafka分布式消息訂閱與發布系統,開發時保證業務代碼的行覆蓋率不低于85%,并編寫單元測試。

    10.怎么更改oracle字符集

    11.數據庫怎么優化查詢

    12.數據結構有哪些算法

    13.什么是存儲過程,簡述下存儲過程與函數的區別

    14.什么是游標

    面向對象是什么 有什么用途 封裝的用途

    數據庫事務的四大特性是什么? 以及什么是隔離性

    事務的四大特性(ACID)

    ?

    如果一個數據庫聲稱支持事務的操作,那么該數據庫必須要具備以下四個特性:

    1、原子性(Atomicity)

    原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

    2、一致性(Consistency)

    一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態。拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉賬,轉幾次賬,事務結束后兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。

    3、隔離性(Isolation)

    隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。

      即要達到這么一種效果:對于任意兩個并發的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在并發地執行。

    4、持久性(Durability)

    ?

      持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

      例如我們在使用JDBC操作數據庫時,在提交事務方法后,提示用戶事務操作完成,當我們程序執行完成直到看到提示后,就可以認定事務以及正確提交,

    即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因為故障而沒有執行事務的重大錯誤。

    事務的隔離級別(默認事務級別為可重復讀)數據庫事務無非就兩種:讀取事務(select)、修改事務(update,insert)修改時允許修改(丟失更新)
    B) 修改時允許讀取(臟讀)
    C) 讀取時允許修改(不可重復讀)
    D) 讀取時允許插入(幻讀)
    從上到下問題越來越不嚴重,但所需的性能開銷卻越大。

    臟讀
      臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。

    不可重復讀
      不可重復讀是指在對于數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔,被另一個事務修改并提交了。

    虛讀(幻讀)
      幻讀是事務非獨立執行時發生的一種現象。

    低級別的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。

    MySQL數據庫的四種事務隔離級別

    Read Uncommitted(讀取未提交內容)

    ?

    ?????? 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read);

    Read Committed(讀取提交內容)

    ?????? 這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果;

    Repeatable Read(可重讀)

    ?????? 這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。

    ?????? 簡單的說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。

    ?????? InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題

    Serializable(可串行化)

    ?????? 這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

    ???????? 這四種隔離級別采取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:

    ?

    ???????? 臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個RollBack了操作,則后一個事務所讀取的數據就會是不正確的。

    ???????? 不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。

    ???????? 幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

    ???????? 在MySQL中,實現了這四種隔離級別,分別有可能產生問題如下所示:

    ????????

    ???????? 20151219142625513.jpg (838?267)

      ① Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。

      ② Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。

      ③ Read committed (讀已提交):可避免臟讀的發生。

      ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

    ?

      以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL數據庫中默認的隔離級別為Repeatable read (可重復讀)。

      在MySQL數據庫中,支持上面四種隔離級別,默認的為Repeatable read (可重復讀);而在Oracle數據庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認的為Read committed級別。

    ?

    ?

    問了一個數據庫的查詢語句 怎么查出數據庫中兩條完全相同的數據(select * from noid a group by id,name,age having count(*)>0? 這樣應該可以吧... 當時沒想出來)

    數據庫鎖

    列舉幾個復雜度nlogn的排序算法:歸并排序—遞歸法實現

    怎么用Java實現一個棧的操作 棧:后進先出集合

    什么是方法重寫 什么是方法重載

    什么是多態 怎么實現

    ?

    多線程,線程鎖 sleep和wait區別 同步方法

    這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。

    sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程里調用了b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

    sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以占用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。

    ?

    Spring的常用注解 列舉 以及@controller 和 @service的區別

    事務的注解使用

    Springmvc常用的注解 列舉

    實習項目用到的框架,語言

    1.java基本類型

    2.int byte short 長度

    3.字節和位的關系

    4.哈希碰撞,有沒有其他解決哈希碰撞的原理【沒有,我就給說了一下HashMap解決哈希碰撞的方法】

    5.冪等性

    6.ArrayList LinkList的時間復雜度

    7.數據庫【剛要問,因為我們數據庫數據比較少又是JPA,也沒有涉及SQL優化,所以也沒有怎么聊】

    8.數據庫ACID

    9.幻讀怎么回事

    10.SpringMVC怎么返回實體類【當然是json】

    11.SpringMVC處理流程

    12.只接收GET請求,怎么辦

    13.講彈性EIP項目

    14.講敏感詞引擎項目

    15.共享帶寬項目

    16.JAVA 8新特性,隨便手寫一個Lamda表達式

    ?


    ?

    總結

    以上是生活随笔為你收集整理的java面试题总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。