02軟通動力-上海中信-阿貝斯-尚哲-實點實分網絡科技-。。。


面試總結

軟通動力電話面試:
1.JDBC和hibernate的區別

(1)hibernate和jdbc主要區別就是,hibernate先檢索緩存中的映射對象( 即hibernate操作的是對象),而jdbc則是直接操作數據庫.

(2)Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架,和App Server,和EJB沒有什么必然的聯系。Hibernate可以用在任何JDBC可以使用的場合
(3)Hibernate是一個和JDBC密切關聯的框架,所以Hibernate的兼容性和JDBC驅動,和數據庫都有一定的關系,但是和使用它的Java程序,和App Server沒有任何關系,也不存在兼容性問題。
還有一點,正確的使用JDBC技術,它的效率一定比hibernate要好,因為hibernate是基於jdbc的技術.

 

2.Echarts的實現原理

Canvas
基於像素
單個html,類似於畫筆在畫布上畫畫
Echarts基於canvas畫圖
Svg
基於對象模型
多個圖形元素
高保真

 


3.ajax是如何進行前后台交互的

1、url 請求地址
2、type 請求方式,默認是'GET',常用的還有'POST'
3、dataType 設置返回的數據格式,常用的是'json'格式,也可以設置為'html'
4、data 設置發送給服務器的數據
5、success 設置請求成功后的回調函數
6、error 設置請求失敗后的回調函數
7async 設置是否異步,默認值是'true',表示異步

 

上海中信信息發展有限公司:
1.SSM之間有什么關系,各自的作用

1.持久層:DAO層(mapper層)(屬於mybatis模塊)

DAO層:主要負責與數據庫進行交互設計,用來處理數據的持久化工作。

DAO層的設計首先是設計DAO的接口,也就是項目中你看到的Dao包。

然后在Spring的xml配置文件中定義此接口的實現類,就可在其他模塊中調用此接口來進行數據業務的處理,而不用關心接口的具體實現類是哪個類,這里往往用到的就是反射機制,DAO層的jdbc.properties數據源配置,以及有 關數據庫連接的參數都在Spring的配置文件中進行配置。

ps:(有的項目里面Dao層,寫成mapper,當成一個意思理解。)
2.業務層:Service層(屬於spring模塊)

Service層:主要負責業務模塊的邏輯應用設計。也就是項目中你看到的Service包。

Service層的設計首先是設計接口,再設計其實現的類。也就是項目中你看到的service+impl包。

接着再在Spring的xml配置文件中配置其實現的關聯。這樣我們就可以在應用中調用Service接口來進行業務處理。

最后通過調用DAO層已定義的接口,去實現Service具體的實現類。

ps:(Service層的業務實現,具體要調用到已定義的DAO層的接口.)

3.控制層/表現層:Controller層(Handler層) (屬於springMVC模塊)

Controller層:主要負責具體的業務模塊流程控制,也就是你看到的controller包。

Controller層通過要調用Service層的接口來控制業務流程,控制的配置也同樣是在Spring的xml配置文件里面,針對具體的業務流程,會有不同的控制器。

4.View層 (屬於springMVC模塊)

負責前台jsp頁面的展示,此層需要與Controller層結合起來開發。

Jsp發送請求,controller接收請求,處理,返回,jsp回顯數據。

 


2.使用Oracle的驅動是什么

oracle數據庫的驅動是固定的,連接時,直接寫oracle.jdbc.driver.OracleDriver即可

3.MVC模式實現技術有哪些

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式:

Model(模型)表示應用程序核心(比如數據庫記錄列表)。

View(視圖)顯示數據(數據庫記錄)。

Controller(控制器)處理輸入(寫入數據庫記錄)。
MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。
  通常模型對象負責在數據庫中存取數據。
View(視圖)是應用程序中處理數據顯示的部分。
  通常視圖是依據模型數據創建的。
Controller(控制器)是應用程序中處理用戶交互的部分。
  通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
MVC 分層有助於管理復雜的應用程序,因為您可以在一個時間內專門關注一個方面。例如,您可以在不依賴業務邏輯的情況下專注於視圖設計。同時也讓應用程序的測試更加容易。
MVC 分層同時也簡化了分組開發。不同的開發人員可同時開發視圖、控制器邏輯和業務邏輯。

 


4.get和post的區別

5.redis緩存機制

數據庫緩存:
sql語句時key值,查詢結果resultSet是value,當同一個查詢語句訪問時(select * from t_product),只要曾經查詢過,調用緩存直接返回resultSet,節省了數據庫讀取磁盤數據的時間。

持久層緩存:
減少了連接數據庫的時間;減少了resultSet封裝成對象的過程。

業務層和控制層的緩存:
減少調用層次。

描述緩存在業務層的邏輯:

查詢商品信息

判斷當前查詢在緩存是否有數據

  如果有數據,直接返回,當前請求結束;

  如果沒有數據,查詢持久層數據庫數據,獲取數據存儲再緩存一份,供后續訪問使用;

緩存雪崩/緩存擊穿
海量請求訪問服務器,服務器的性能由緩存支撐,一旦一定范圍的緩存數據未命中,請求的數據訪問涌入數據庫;承受不了壓力造成宕機--重啟--海量請求並未消失--宕機--重啟,系統長時間不可用;這種情況就是緩存的雪崩。

 

多飛網絡科技:
1.==和equals()的區別

對於==,比較的是值是否相等如果作用於基本數據類型的變量,則直接比較其存儲的 “值”是否相等;如果作用於引用類型的變量,則比較的是所指向的對象的地址 對於equals方法,注意:equals方法不能作用於基本數據類型的變量,
equals繼承Object類,比較的是是否是同一個對象如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址;
諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容。

2.++i和i++的區別

i++是先賦值,然后再自增;++i是先自增,后賦值。

3.hibernate是通過什么對象訪問數據庫的

Hibernate,對於java來說很重要的一個東西,用於持久層。之前看了很多配置的,都不行,自己來寫一個配置成功的。

環境:jdk1.8,eclipse-jee-oxygen,mysql-connector-java-5.1.46,hibernate 5.2.

首先要確保你的jdk,eclipse和mysql裝好。然后下載jar包,mysql和hibernate的jar包。

然后安裝JBoss插件,eclipse中Help-----eclipse market里面輸入JBoss並搜索,找到JBoss之后,install,這里只需要對應hibernate的那些即可。

4.Oracle的存儲方式

一、文件系統
    (最簡單的方式)
     從本機存儲划分出一部分空間給數據提供存儲。
     1.使用方式:
      ① 對這塊區域做一個格式化(這是windows的稱呼。在Linux和Unix系統中,叫創建文件系統。)
      ② 對磁盤進行掛載(windows中叫盤符)      ## 對訪問區域的一個接口

      2.特點:
           優點:數據文件容易訪問,管理方便。
           缺點:訪問性能受到影響,中間多了一層文件系統
二、裸設備
    該存儲空間沒有經過格式化,數據直接存放在該存儲空間上。
    普通用戶無法訪問,只有數據庫軟件才能夠直接訪問。
   1.特點
           優點:少了文件系統中間層,訪問更加快捷,I/O性能比文件系統會提高20%
           缺點:管理不方便,不能夠cp,rf等操作。但是可以用Oracle工具處理(dd、RMAN)
三、ASM磁盤
      ASM:Automatic Storage Management(Oracle 10g以后)
      提供OMF管理方式:
      手工建庫時:db_create_file_dest=+DISK1
      日志文件:   db_create_logfile_dest=+DISK1
      ASM磁盤,通過asm instance進行管理。數據庫實例直接訪問asm實例,這樣訪問方式更加緊密直接
      Oracle 11g以后,允許操作系統和ASM之間進行交互
四、啟動管理ASM的實例
      1.編輯ASM初始化參數文件內容 $ORACLE_HOME/dbs/init+ASM.ora
      *.background_dump_dest='/u01/app/oracle/admin/+ASM/bdump'
      *.core_dump_dest='/u01/app/oracle/admin/+ASM/bdump'
      *.instance_type='asm'
      *.large_pool_size=12M
      *.remote_login_passwordfile='SHARED'
      *.user_dump_dest='/u01/app/oracle/admin/+ASM/bdump'
      2.啟用ASM實例
      $ export ORACLE_SID=+ASM
      $ sqlplus / as sysdba
      SQL> startup nomount
      ASM instance started
      Total System Global Area  82736155 bytes
      Fixed Size                         6254372 byyes
      Variable Size                     73625362 bytes
      ASM Cache                        25173827 bytes
     
3.(第一次使用ASM)啟動時會報錯 ORA-29701 unable to connect to Cluster Manager 需要做如下處理: $ cd $ORACLE_HOME/bin $ su root(以root身份執行,但是不更改環境變量) $ ./localconfig delete $ ./localconfig add 5.裸設備綁定關系 /dev/raw/raw2: bound to major 58,minor 0 /dev/raw/raw3: bound to major 58,minor 1 /dev/raw/raw4: bound to major 58,minor 2 /dev/raw/raw5: bound to major 58,minor 3 6.創建磁盤組 create diskgroup disk1 normal redundancy failgroup fg1 disk '/dev/raw/raw1' name d1 failgroup fg2 disk '/dev/raw/raw2' name d2 failgroup fg3 disk '/dev/raw/raw3' name d3 failgroup fg4 disk '/dev/raw/raw4' name d4 failgroup fg5 disk '/dev/raw/raw5' name d5 failgroup fg6 disk '/dev/raw/raw6' name d6; 注:external redundancy (主)表明冗余度僅要求一個故障組,假設這個磁盤對 於正在運行的數據庫操作 normal redundancy 標准冗余度提供雙向鏡像,要求一個磁盤中要有兩個故 障組 high redundancy 提供三向鏡像,要求一個磁盤中要有三個磁盤組 create diskgroup disk1 external redundancy disk '/dev/raw/raw3'; 在一個磁盤組中的各個磁盤中的文件,被粗糙的或精細的分割,粗糙分割為1M為單位分布於所有的磁盤中,適用於數據倉庫,精細分割為128KB位單位分布文件,適用於OLTP。 7.查看新的可用磁盤組 SQL> select GROUP_NUMBER,name,type,total_mb,free_mb from v$asm_diskgroup; SQL> select group_number,disk_number,name,failgroup,create_date,path from v$asm_disk;
    
8.刪除磁盤組 drop diskgroup disk1 drop diskgroup disk1 including contents;(磁盤組中有數據庫對象) 9.為磁盤組添加磁盤 alter diskgroup disk1 ass failgroup fg4 disk '/dev/raw/raw4' name d4; 10.從磁盤組中刪除一個磁盤成員 alter diskgroup disk1 drop disk d4; 11.可以同時對磁盤組進行DROP和ADD操作,這樣只發生一次平衡操作,減少CPU和I/O時間 aletr diskgroup disk1 add failgroup fg4 disk '/dev/raw/raw4' name d4 group disk d3;

 

北京愛朗格瑞:
1.hibernate如何處理sql語句

hibernate本來就支持 原sql 調用執行sql的方法就行了 調用方法的時候注意看所需的參數
@Autowired
private SessionFactory sessionFactory;
sessionFactory.getCurrentSession().createSQLQuery(sql);

2.JDBC是如何處理sql中傳入的參數的

一、數組形式的參數
  優點: 針對簡單sql,可以節約部分內存空間。減少代碼量、易讀。
  缺點:
    1、相同的參數不可以復用,讓array占用更多的空間。(當然,以現在的硬件來說,這點空間/內存、多余添加數組值花費的時間 完全微不足道)
    2、如果是in的參數,要動態拼接(?)占位符。(個人認為最麻煩、繁瑣的,擴展:oracle對in最大支持1000)
    3、如果sql中參數過多,其實不好閱讀修改。
個人習慣用List添加參數,然后再把List轉換成Array。
好處是:如果用數組,當sql存在動態條件,那么無法確定數組長度。而用List就不需要自己去維護。
二、map形式的參數
  優點:
    1、解決了in參數的問題。
    2、參數值可以復用。
三、javaBean形式的參數
如果參數是通過JavaBean傳到dao層,那么不用把bean轉換成map。相對的如果是通過map傳到dao層的,也用map形式也無需轉換成javaBean。

3.SVN中標記和標記合並的作用

SVN的“合並(Merge)”功能:這個功能是用來將分支(branch)與主干(Trunk)合並用的。通過自動合並,可以將大部分文件的變動合並到一起,形成一個集合全部改動的文件。
SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,相較於RCS、CVS,它采用了分支管理系統,它的設計目標就是取代CVS。互聯網上很多版本控制服務已從CVS遷移到Subversion。

4.使用vue.js開發

那么什么是Vue組件呢?它是vue.js最強大的功能之一,是可擴展的html元素,是封裝可重用的代碼,同時也是Vue實例,可以接受相同的選項對象(除了一些根級特有的選項) 並提供相同的生命周期鈎子。
組件系統是Vue.js其中一個重要的概念,它提供了一種抽象,讓我們可以使用獨立可復用的小組件來構建大型應用,任意類型的應用界面都可以抽象為一個組件樹:
那么什么是組件呢?
組件可以擴展HTML元素,封裝可重用的HTML代碼,我們可以將組件看作自定義的HTML元素。

使用組件的好處?

提高開發效率

方便重復使用

簡化調試步驟

提升整個項目的可維護性

便於多人協同開發

掌緣信息科技:
1.Linux基本操作命令,如何查看文件內容

查看文件內容的命令:
cat     由第一行開始顯示內容,並將所有內容輸出
tac     從最后一行倒序顯示內容,並將所有內容輸出
more    根據窗口大小,一頁一頁的現實文件內容
less    和more類似,但其優點可以往前翻頁,而且進行可以搜索字符
head    只顯示頭幾行
tail    只顯示最后幾行
nl      類似於cat -n,顯示時輸出行號
tailf   類似於tail -f 

1.cat 與 tac (不常用)
cat的功能是將文件從第一行開始連續的將內容輸出在屏幕上。
cat語法:cat [-n]  文件名 (-n : 顯示時,連行號一起輸出)

tac的功能是將文件從最后一行開始倒過來將內容數據輸出到屏幕上。
tac語法:tac 文件名。

2.more和less(常用)
more功能類似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能 。more命令從前向后讀取文件,因此在啟動時就加載整個文件。
命令格式:
more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 
命令功能:
more命令和cat的功能一樣都是查看文件里的內容,但有所不同的是more可以按頁來查看文件的內容,還支持直接跳轉行等功能。
命令參數:
+n      從笫n行開始顯示
-n       定義屏幕大小為n行
+/pattern 在每個檔案顯示前搜尋該字串(pattern),然后從該字串前兩行之后開始顯示  
-c       從頂部清屏,然后顯示
-d       提示“Press space to continue,’q’ to quit(按空格鍵繼續,按q鍵退出)”,禁用響鈴功能
-l        忽略Ctrl+l(換頁)字符
-p       通過清除窗口而不是滾屏來對文件進行換頁,與-c選項相似
-s       把連續的多個空行顯示為一行
-u       把文件內容中的下畫線去掉
常用操作命令:
Enter    向下n行,需要定義。默認為1行
Ctrl+F   向下滾動一屏
空格鍵  向下滾動一屏
Ctrl+B  返回上一屏
=       輸出當前行的行號
:f     輸出文件名和當前行的行號
V      調用vi編輯器
!命令   調用Shell,並執行命令 
q       退出more
使用實例:
實例1:顯示文件中從第3行起的內容
命令:
cat test.log                   #顯示所有日志內容
more +3 test.log               #從第三行開始顯示日志內容
實例2.將日志內容設置為每屏顯示4行
命令:
more -4 test.log
實例3.從文件中查找第一個出現"liu"字符串的行,並從該處前兩行開始顯示輸出
命令:
more +/liu test.log
實例4.當一個目錄下的文件內容太多,可以用more來分頁顯示。這得和管道 | 結合起來
命令:
cat test.log | more -5   #“|”表示管道,作用是可以將前面命令的輸出當做后面命令的輸入
 
less 工具也是對文件或其它輸出進行分頁顯示的工具,應該說是linux正統查看文件內容的工具,功能極其強大。less 的用法比起 more 更加的有彈性。 在 more 的時候,我們並沒有辦法向前面翻, 只能往后面看,但若使用了 less 時,就可以使用 [pageup] [pagedown] 等按 鍵的功能來往前往后翻看文件,更容易用來查看一個文件的內容!除此之外,在 less 里頭可以擁有更多的搜索功能,不止可以向下搜,也可以向上搜。

命令格式:
less [參數]  文件 

命令功能:
less 與 more 類似,但使用 less 可以隨意瀏覽文件,而 more 僅能向前移動,卻不能向后移動,而且 less 在查看之前不會加載整個文件。

命令參數:
-b <緩沖區大小> 設置緩沖區的大小
-e  當文件顯示結束后,自動離開
-f  強迫打開特殊文件,例如外圍設備代號、目錄和二進制文件
-g  只標志最后搜索的關鍵詞
-i  忽略搜索時的大小寫
-m  顯示類似more命令的百分比
-N  顯示每行的行號
-o <文件名> 將less 輸出的內容在指定文件中保存起來
-Q  不使用警告音
-s  顯示連續空行為一行
-S  行過長時間將超出部分舍棄
-x <數字> 將“tab”鍵顯示為規定的數字空格
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重復前一個搜索(與 / 或 ? 有關)
N:反向重復前一個搜索(與 / 或 ? 有關)
b  向后翻一頁
d  向后翻半頁
h  顯示幫助界面
Q  退出less 命令
u  向前滾動半頁
y  向前滾動一行
空格鍵 滾動一行
回車鍵 滾動一頁
[pagedown]: 向下翻動一頁
[pageup]:   向上翻動一頁
使用實例:
實例1:ps查看進程信息並通過less分頁顯示同時顯示行號

命令:
ps -ef|less -N
實例2.瀏覽多個文件

命令:

less test2.log test.log
說明:

輸入 :n后,切換到 test.log

輸入 :p 后,切換到test2.log

ps:當正在瀏覽一個文件時,也可以使用 :e命令 打開另一個文件。

命令:

less file1

:e file2
 

附加備注
  (1)全屏導航

ctrl + F - 向前移動一屏

ctrl + B - 向后移動一屏

ctrl + D - 向前移動半屏

ctrl + U - 向后移動半屏

  (2)單行導航

j - 向前移動一行

k - 向后移動一行

  (3)其它導航

G - 移動到最后一行

g - 移動到第一行

q / ZZ - 退出 less 命令

  (4)其它有用的命令

v - 使用配置的編輯器編輯當前文件

h - 顯示 less 的幫助文檔

&pattern - 僅顯示匹配模式的行,而不是整個文件

  (5)標記導航

當使用 less 查看大文件時,可以在任何一個位置作標記,可以通過命令導航到標有特定標記的文本位置:

ma - 使用 a 標記文本的當前位置

'a - 導航到標記 a 處

  (6)查找

more, less 都具備查找功能,按/ 然后輸入要找的字串,再按 Enter 即可,按 n(next) 會繼續找,大寫的 N 則是往回(上)找,按 q(quit)或者ZZ離開

 

3.head和tail(常用)
head和tail通常使用在只需要讀取文件的前幾行或者后幾行的情況下使用。head的功能是顯示文件的前幾行內容

head的語法:head [n number] 文件名 (number 顯示行數)

 

tail的功能恰好和head相反,只顯示最后幾行內容

tail的語法:tail [-n number] 文件名

查看日志文件的前1000行

  1. head -n 1000 日志文件

查看日志文件最后1000行

tail -f -n 1000 日志文件  (實時打印最新的日志信息)
tail -1000n 日志文件(實時打印最新的日志信息)
tail -1000 日志文件(打印出日志文件的最后1000條信息)
tail -n +1000 日志文件(從第1000行開始顯示日志信息)
查看日志文件的中間多少行

cat 日志文件 |  head -n 3000 | tail -n + 1001
4.nl (不常用)
nl的功能和cat -n一樣,同樣是從第一行輸出全部內容,並且把行號顯示出來

nl的語法:nl 文件名

 

2.設計模式在編碼過程中如何體現的

1、開閉原則:一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展。a、抽象化的基本功能不變,不會被修改;b、把可變性的封裝起來。
2、里氏轉換原則:父類可以被子類代替。里氏轉換原則是對開閉原則的一個補充,違反里氏轉換原則就是違反開閉原則,並且是代理模式的基礎。
使用時需注意以下幾點:
    1、子類必須實現父類所有方法;
    2、盡量把父類設計成抽象類或接口;
    3、依賴倒轉原則:抽象類不依賴於細節,細節應當依賴於抽象,高層模塊不應當依賴於底層模塊,都依賴與抽象。
4、接口隔離原則:使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴於它不需要的那些接口; 5、迪米特原則:一個對象應盡可能少的了解其他對象。各個對象建的耦合度比較低,都能夠獨立運行; 6、聚合原則:用聚合類達到代碼復用,而不是用繼承關系來復用代碼; 7、單一原則:一個類只負責一個功能領域的相應職責。

南京微小寶:
1.jsp內置對象各個作用

1、request對象
request 對象是 javax.servlet.httpServletRequest類型的對象。 該對象代表了客戶端的請求信息,主要用於接受通過HTTP協議傳送到服務器的數據。(包括頭信息、系統信息、請求方式以及請求參數等)。request對象的作用域為一次請求。

2、response對象
response 代表的是對客戶端的響應,主要是將JSP容器處理過的對象傳回到客戶端。response對象也具有作用域,它只在JSP頁面內有效。

3、session對象
session 對象是由服務器自動創建的與用戶請求相關的對象。服務器為每個用戶都生成一個session對象,用於保存該用戶的信息,跟蹤用戶的操作狀態。session對象內部使用Map類來保存數據,因此保存數據的格式為 “Key/value”。 session對象的value可以使復雜的對象類型,而不僅僅局限於字符串類型。

4、application對象
 application 對象可將信息保存在服務器中,直到服務器關閉,否則application對象中保存的信息會在整個應用中都有效。與session對象相比,application對象生命周期更長,類似於系統的“全局變量”。

5out 對象
out 對象用於在Web瀏覽器內輸出信息,並且管理應用服務器上的輸出緩沖區。在使用 out 對象輸出數據時,可以對數據緩沖區進行操作,及時清除緩沖區中的殘余數據,為其他的輸出讓出緩沖空間。待數據輸出完畢后,要及時關閉輸出流。

6、pageContext 對象
pageContext 對象的作用是取得任何范圍的參數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等對象。pageContext對象的創建和初始化都是由容器來完成的,在JSP頁面中可以直接使用 pageContext對象。

7、config 對象
config 對象的主要作用是取得服務器的配置信息。通過 pageConext對象的 getServletConfig() 方法可以獲取一個config對象。當一個Servlet 初始化時,容器把某些信息通過 config對象傳遞給這個 Servlet。 開發者可以在web.xml 文件中為應用程序環境中的Servlet程序和JSP頁面提供初始化參數。

8、page 對象
page 對象代表JSP本身,只有在JSP頁面內才是合法的。 page隱含對象本質上包含當前 Servlet接口引用的變量,類似於Java編程中的 this 指針。

9、exception 對象
exception 對象的作用是顯示異常信息,只有在包含 isErrorPage="true" 的頁面中才可以被使用,在一般的JSP頁面中使用該對象將無法編譯JSP文件。excepation對象和Java的所有對象一樣,都具有系統提供的繼承結構。exception 對象幾乎定義了所有異常情況。在Java程序中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 對象,並把 exception 對象傳送到在page指令中設定的錯誤頁面中,然后在錯誤頁面中處理相應的 exception 對象。

 


2.冒泡算法

 1 public class MyBubbleSort {
 2 
 3     public static void main(String[] args) {
 4         int[] arr = {3, 2, 5, 1, 8, 1, 11, 8};
 5         int[] results = bubbleSort(arr);
 6         for(int item : results){
 7             System.out.print(item + "   ");
 8         }
 9     }
10 
11     /**
12      * 冒泡排序,升序排列
13      * 數組當中比較小的數值向下沉,數值比較大的向上浮!
14      */
15     public static int[] bubbleSort(int[] arr) {
16         // 外層for循環控制循環次數
17         for(int i=0;i<arr.length;i++){
18             int tem = 0;
19             // 內層for循環控制相鄰的兩個元素進行比較
20             for(int j=i+1;j<arr.length;j++){
21                if(arr[i]>arr[j]){
22                    tem = arr[j];
23                    arr[j]= arr[i];
24                    arr[i] = tem;
25                }
26             }
27         }
28         return arr;
29     }
30 }

南京實點實分網絡科技:
1.JAVA序列化

----什么是序列化?
--1--java序列化是指把java對象轉換為字節序列的過程,而java反序列化是指把字節序列恢復為java對象的過程
--2--序列化:對象序列化的最主要的用處就是在傳遞和保存對象的時候,保證對象的完整性和可傳遞性。序列化是把對象轉換成有序字節流,以便在網絡上傳輸或者保存在本地文件中。序列化后的字節流保存的java對象的狀態以及相關的描述信息。序列化機制的核心作用就是對象狀態的保存與重建。
--3--反序列化:客戶端從文件中或網絡上獲得序列化后的對象字節流后,根據字節流中所保存的對象狀態及描述信息,通過反序列化重建對象。
--4--序列化就是把實體對象狀態按照一定的格式寫入到有序字節流,反序列化就是從有序字節流重建對象,恢復對象狀態

----為什么需要序列化與反序列化
當兩個進程進行遠程通信時,可以相互發送各種類型的數據,包括文本,圖片,音頻,視頻等,而這些數據都會以二進制的形式在網絡上傳送。
當兩個java進行進行通信時,要傳送對象,怎么傳對象,通過序列化與反序列化。
也就是說,發送方需要把對象轉換為字節序列,然后在網絡上傳送,另一方面,接收方需要從字節序列中恢復出java對象

----序列化的好處
--1--永久性保存對象,保存對象的字節序列到本地文件或者數據庫中,實現了數據的持久化,通過序列化可以把數據永久的保存到硬盤上,
--2--利用序列化實現遠程通信,可以在網絡上傳送對象的字節序列。
--3--在進程間傳遞對象

----序列化算法步驟
--1--把對象實例相關的類元數據輸出
--2--遞歸輸出類的超類描述直到不再有超類
--3--類元數據完了以后,開始從最懂曾的超類開始輸出對象實例的實際數據值。
--4--從上至下遞歸輸出實例的數據

----Java 如何實現序列化和反序列化
--1-- JDK類庫中序列化API
java.io.ObjectOutputStream: 表示輸出對象流
它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中;
--2--java.io.ObjectInputStream:表示對象輸入流
它的readObject()方法源輸入流中讀取字節序列,再把它們反序列化成為一個對象,並將其返回

 

--2--實現序列化的要求
只有實現了Serializable或Externalizable接口的對象才能被序列化,否則拋出異常!

--3--實現java對象序列化與反序列化的方法
例 a 類,它的對象需要序列化,有3種方法
如果類a僅僅實現了Serializable接口,則
ObjectOutputStream采用默認的序列化方式,對a對象的非transient實例變量進行序列化
ObjectInputStream采用默認的反序列化方式,對a對象的非transient實例變量進行反序列化
如果類a僅僅實現了Serializable接口,並且還定義了a對象的writeObject(ObjectOutputStream out) 和readObject(ObjectInputStream in),則
ObjectOutputStream調用a對象的writeObject(ObjectOutputStream out)的方法進行序列化
ObjectInputStream調用a對象的readObject(ObjectInputStream in)的方法進行序列化
如果a類實現了ExternaInalizable接口,且User類必須實現readExternam(ObjectInput in)和wiriteExternal(ObjectOutput out)方法,則
ObjectOutputStream調用a對象的wiriteExternal(ObjectOutput out)的方法進行序列化
ObjectInputStream調用a對象的readExternam(ObjectInput in)的方法進行序列化‘’

 ----JDK類庫中序列化的步驟
--1--創建一個對象輸出流,它可以包裝一個奇特類型的目標輸出流,如文件輸出流:
objectOutputStream oos=new objectOutputStream(new FileOutStream(c:\\object.out));
--2--通過對象輸出流writeObject()方法寫對象:
oos.writeObject(new a("xiaoxiao","145263","female"));

----JDK類庫中反序列化的步驟
--1--創建一個對象輸入流,它可以包裝一個其他類型輸入流,如文件輸入流:
objectInputStream ois=new ObjectInputStream(new FileInputStream("object.out"));
--2--通過對象輸出流的readObject()方法讀取對象:
a aa=(a)ois.readObject();
--3--為了正確讀數據,完成反序列化,必須保證向對象輸出流寫對象的順序與從對象輸入流中讀對象的順序一致

 

2.如何以遞歸算法輸出一個文件夾下的文件和文件目錄

import java.io.File;
 
public class TestFile {
    public static void main(String[] args) {
        File f=new File("D:\\shixun");
        printFile(f,0);
    }
    public static void printFile(File file,int level) {
        //打印樹狀的層次關系
        for(int i=0;i<level;i++) {
            System.out.print("*");
        }
        //輸出目錄或者文件的名字
        System.out.println(file.getName());
        if(file.isDirectory()) {//判斷file是否為目錄
            File [] listFiles=file.listFiles();
            for(File temp:listFiles) {
                //自己調用自己
                printFile(temp,level+1);
            }
        }
    }
 
}

3.Object的8種常用方法

getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(),  wait(), finalize()

阿貝斯:
1.servlet的生命周期

Servlet 生命周期包括三部分:
1.初始化:Web 容器加載 servlet,調用 init()方法
2.處理請求:當請求到達時,運行其 service()方法。service()自動派遣運行與請求相對應的doXXX(doGet 或者 doPost)方法。
3.銷毀:服務結束,web 容器會調用 servlet 的 distroy()方法銷毀 servlet。

2.map有哪些是線程安全的

JAVA中線程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap。

java中map中線程安全怎么實現:
同步的map就是Hashtable, concurrenthashmap。
你看到的Hashtable就是直接在hashmap上加了個鎖,concurrenthashmap就是分成多個分段鎖。

java代碼中線程安全級別:
絕對線程安全。
在任何環境下,調用者都不需要考慮額外的同步措施,都能夠保證程序的正確性。
這個定義要求很嚴格,java里面滿足這個要求的類比較少,對於實現jsr133規范(java內存模型)的jdk(一般指jdk5.0之上),一般的不變類都是滿足絕地線程安全的。比如 String,Integer類。一般情況下,定義了如果一個類里面所有字段都是final類型的,一般都認為這個類是不變的。不變類都是絕對線程安全的。

相對線程安全   
在一般情況下,調用者都不需要考慮線程同步,大多數情況下,都能夠正常運行。jdk里面大多數類都是相對安全的。最常見的例子是java里面Vector類。

 

3.上傳文件使用的什么類來接收

尚哲智能:
1.什么是事務,作用是什么

一個事務是有下列屬性的一個工作單元: 
原子性(ATOMICITY): 
一個事務要被完全的無二義性的做完或撤消。在任何操作出現一個錯誤的情況下,構成事務的所有操作的效果必須被撤消,數據應被回滾到以前的狀態。 

一致性(CONSISTENCY): 
一個事務應該保護所有定義在數據上的不變的屬性(例如完整性約束)。在完成了一個成功的事務時,數據應處於一致的狀態。換句話說,一個事務應該把系統從一個一致-狀態轉換到另一個一致狀態。舉個例子,在關系數據庫的情況下, 
一個一致的事務將保護定義在數據上的所有完整性約束。 

隔離性(ISOLATION): 
在同一個環境中可能有多個事務並發執行,而每個事務都應表現為獨立執行。串行的執行一系列事務的效果應該同於並發的執行它們。這要求兩件事: 

在一個事務執行過程中,數據的中間的(可能不一致)狀態不應該被暴露給所有的其他事務。 
兩個並發的事務應該不能操作同一項數據。數據庫管理系統通常使用鎖來實現這個特征。 

持久性(DURABILITY): 
一個被完成的事務的效果應該是持久的。

 

2.SQL優化的方案

1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=0

3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20

5.in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

6.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'

7.應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2

8.應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
應改為:
select id from t where name like 'abc%'

9.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

10.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,
否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

11.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)

12.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)

13.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,
如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。

14.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,
因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。
一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

15.盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,並會增加存儲開銷。
這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對於數字型而言只需要比較一次就夠了。

16.盡可能的使用 varchar 代替 char ,因為首先變長字段存儲空間小,可以節省存儲空間,
其次對於查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

17.任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

18.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

19.臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。

20.在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,
以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。

21.如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。

22.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該考慮改寫。

23.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

24.與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。
在結果集中包括“合計”的例程通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。
25.盡量避免大事務操作,提高系統並發能力。26.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

 

3.JAVA的內存模型

程序計數器:線程私有;記錄指令執行的位置;
虛擬機棧:線程私有;生命周期和線程一致;存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
本地方法棧:線程私有;為虛擬機使用到的 Native 方法服務。 堆:線程共享;JVM 所管理的內存中最大的一塊區域,主要是存放對象實例和數組; 方法區:線程共享;存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

4.js中常用函數方法

1:常規寫法
//函數的寫法
function run{
 alert("常規寫法") //這里是你函數的內容
}
//調用
run()

2:匿名函數寫法
var run = function(){
    alert("這是一種聲明函數的寫法,左邊是一個變量,右邊是一個函數的表達式,
  意思就是把一個匿名函數的表達式賦值給了一個變量myrun,只是聲明了一個變量指向了一個函數對象")//這里是你函數的內容
}
run()

3:將方法作為一個對象
//作為對象方法,函數寫法,這里創建了兩個函數外面用{}包裹起來
var Text = {
    run1 : function(){
        alert("這個必須放在一個對象內部,放在外邊會出錯")//這里是函數內容
    },
    run2 : function(){
        alert("這個必須放在一個對象內部,放在外邊會出錯")//這里是函數內容
    }
}
Text.run1()//調用第一個函數
Text.run2()//調用第二個函數

4.構造函數中給對象添加方法 
javascript中的每個對象都有prototype屬性,Javascript中對象的prototype屬性的解釋是:返回對象類型原型的引用。

// 給對象添加方法
var funName = function(){};
  funName.prototype.way = function(){
        alert('這是在funName函數上的原始對象上加了一個way方法,構造函數中用到');
    }
    // 調用
    var funname = new text();// 創建對象
    funname.way();//調用對象屬性

5.自執行函數
js自執行函數查到了幾種不同寫法,放上來給大家看看
//方法1:最前最后加括號 
(
function(){alert(1);}()
); 
/*這是jslint推薦的寫法,好處是,能提醒閱讀代碼的人,這段代碼是一個整體。 
例如,在有語法高亮匹配功能的編輯器里,光標在第一個左括號后時,最后一個右括號也會高亮,看代碼的人一眼就可以看到這個整體。 */

//方法2:function外面加括號 
(function(){alert(1);})(); 
//這種做法比方法1少了一個代碼整體性的好處。

//方法3:function前面加運算符,常見的是!與void 。
!function(){alert(1);}(); 
void function(){alert(2);}(); 

5.如何使用異常,異常有哪些

從根本上講所有的異常都屬於Throwable的子類,從大的方面講分為Error(錯誤)和Exception(異常)。Eror是程序無法處理的異常,當發生Error時程序線程會終止運行。我們一般意義上講的異常就是指的Exception,這也是面試官常問的問題。

下面就簡單說一下關於Exception(以下都簡稱異常)的一點理解。

異常分為運行時異常(RuntimeException,又叫非檢查時異常)和非運行時異常(又叫檢查異常)。下面列舉一下常見的運行時異常:

NullPointerException - 試圖訪問一空對象的變量、方法或空數組的元素

ArrayIndexOutOfBoundsException - 數組越界訪問

NoClassDefFoundException - JAVA運行時系統找不到所引用的類

ArithmeticException - 算術運算中,被0除或模除

ArrayStoreException - 數據存儲異常,寫數組操作時,對象或數據類型不兼容

ClassCastException - 類型轉換異常

IllegalArgumentException - 方法的參數無效

IllegalThreadStateException - 試圖非法改變線程狀態,比方說試圖啟動一已經運行的線程

NumberFormatException - 數據格式異常,試圖把一字符串非法轉換成數值(或相反)

SecurityException - 如果Applet試圖執行一被WWW瀏覽器安全設置所禁止的操作

IncompatibleClassChangeException - 如改變了某一類定義,卻沒有重新編譯其他引用了這個類的對象。如某一成員變量的聲明被從靜態改變為非靜態,但其他引用了這個變量的類卻沒有重新編譯,或者相反。如刪除了類聲明中的某一域或方法,但沒有重新編譯那些引用了這個域或方法的類

OutOfMemoryException - 內存不足,通常發生於創建對象之時

IncompatibleTypeException - 試圖實例化一個接口,Java運行時系統將拋出這個異常

UnsatisfiedLinkException - 如果所需調用的方法是C函數,但Java運行時系統卻無法連接這個函數

InternalException - 系統內部故障所導致的異常情況,可能是因為Java運行時系統本身的原因。如果發現一可重現的InternalException,可以直接給Sun公司發電郵。

 

6.spring中AOP和IOC

IOC:控制反轉也叫依賴注入。利用了工廠模式
將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啟動的時候,spring會把你在配置文件中配置的bean都初始化好,然后在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類(假設這個類名是A),分配的方法就是調用A的setter方法來注入,而不需要你在A里面new這些bean了。
注意:面試的時候,如果有條件,畫圖,這樣更加顯得你懂了.

AOP:面向切面編程。(Aspect-Oriented Programming)
AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但並不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。在OOP設計中,它導致了大量代碼的重復,而不利於各個模塊的重用。
將程序中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然后注入到目標對象(具體業務邏輯)中去。

實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼.

 


7.JDK1.8有什么新特性

1、default關鍵字 2、Lambda 表達式 3、函數式接口 4.方法與構造函數引用 5、局部變量限制 6、Date Api更新 7、流

 

江蘇金茂電子商務:
1.JAVA如何實現一個賬號只能一個用戶登錄,其他人無法登錄

1 .在用戶登錄時,把用戶添加到一個ArrayList中
2 .再次登錄時查看ArrayList中有沒有該用戶,如果ArrayList中已經存在該用戶,則阻止其登錄
3 .當用戶退出時,需要從該ArrayList中刪除該用戶,這又分為三種情況
① 使用注銷按鈕正常退出
② 點擊瀏覽器關閉按鈕或者用Alt+F4退出,可以用JavaScript捕捉該頁面關閉事件,
執行一段Java方法刪除ArrayList中的用戶
③ 非正常退出,比如客戶端系統崩潰或突然死機,可以采用隔一段時間session沒活動就刪除該session所對應的用戶來解決,這樣用戶需要等待一段時間之后就可以正常登錄。

 

2.SQL查詢一張表中重復數據的方法

1.查詢出所有數據進行分組之后,和重復數據的重復次數的查詢數據,先列下:
select  count(username) as '重復次數',username from xi group by username  having count(*)>1 order by username desc

2.查找表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷
select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

3.查找表中多余的重復記錄(多個字段)
select * from people a
where (a.peopleId,a.seq) in  (select peopleId,seq from people group by peopleId,seq  having count(*) > 1)

 

3.如何實現批量更新

--創建表
create table test1
(
  a varchar2(100),
  b varchar2(100)
);  

create table test2
(
  a varchar2(100),
  b varchar2(100)
);
--插入語句 
declare i number; 
begin
for i in 1..10 loop  
insert into test1(a,b)values(i,i);
end loop; 
for i in 1..5 loop  
insert into test2(a,b)values(i,i||i);
end loop; 
end; 
--查詢一下:
select t.*,t.rowid from test1 t
select t.*,t.rowid from test2 t  
--全都更新的方式:
update test1 t1
set t1.b = (select t2.b from test2 t2 where t1.a = t2.a) 
--如果沒有以下語句結果就不一樣了,請注意
where exists
(select '' from test2 t2 where t1.a = t2.a);
--開始批量更新
declare
 countpoint number := 0;
begin
 for row_id in (select t1.rowid,t2.b from test1 t1,test2 t2 where t1.a = t2.a) loop
 
  update test1 t1
    set t1.b = row_id.b
   where t1.rowid = row_id.rowid;
 
  countpoint := countpoint + 1;
  if mod(countpoint, 5) = 0 then
   dbms_output.put_line('countpoint:' || countpoint);
   commit;
  end if;
 end loop;
 commit;
end;  
--刪除數據
delete test1;
delete test2;
--刪除表
drop table test1;
drop table test2; 

 

4.Switch函數中放什么類型的參數

jdk1.7以前的版本switch(expr1)中,expr1是一個整數表達式,整數表達式可以是int基本類型或Integer包裝類型,由於,byte,short,char都可以隱含轉換為int,
所以,這些類型以及這些類型的包裝類型也是可以的。因此傳遞給 switch 和case 語句的參數應該是 intshortchar 或者 byte,還有enum。 long,string 都不能作用於swtich。 在jdk 1.7中switch的參數類型可以是字符串類型。

 

南京數族公司:
1.java容器有哪些

數組,String,java.util下的集合容器

數組長度限制為 Integer.Integer.MAX_VALUE;

String的長度限制: 底層是char 數組 長度 Integer.MAX_VALUE 線程安全的

List:存放有序,列表存儲,元素可重復

Set:無序,元素不可重復

Map:無序,元素可重復

 

2.第三方支付接口用過沒講一講
3.hashtable和hashmap的區別

 1、繼承的父類不同
      Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。
      2、線程安全性不同
      javadoc中關於hashmap的一段描述如下:此實現不是同步的。如果多個線程同時訪問一個哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須保持外部同步。
      Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize的。在多線程並發的環境下,可以直接使用Hashtable,不需要自己為它的方法實現同步,
但使用HashMap時就必須要自己增加同步處理。(結構上的修改是指添加或刪除一個或多個映射關系的任何操作;僅改變與實例已經包含的鍵關聯的值不是結構上的修改。)
這一般通過對自然封裝該映射的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用 Collections.synchronizedMap 方法來“包裝”該映射。最好在創建時完成這一操作,
以防止對映射進行意外的非同步訪問。
Map m
= Collections.synchronizedMap(new HashMap(...)); Hashtable 線程安全很好理解,因為它每個方法中都加入了Synchronize。這里我們分析一下HashMap為什么是線程不安全的: HashMap底層是一個Entry數組,當發生hash沖突的時候,hashmap是采用鏈表的方式來解決的,在對應的數組位置存放鏈表的頭結點。對鏈表而言,新加入的節點會從頭結點加入。

 

4.redis持久化

RDB 持久化:該機制可以在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。
AOF 持久化:記錄服務器執行的所有寫操作命令,並在服務器啟動時,通過重新執行這些命令來還原數據集。AOF
文件中的命令全部以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還可以在后台對 AOF 文件
進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小
無持久化:讓數據只在服務器運行時存在。
同時應用 AOF 和 RDB:當 Redis 重啟時, 它會優先使用 AOF 文件來還原數據集, 因為 AOF 文件保存的
數據集通常比 RDB 文件所保存的數據集更完整

 

5.hashmap線程不安全,如何使他安全
6.token存redis時,redis崩潰怎么辦
7.mycat分庫分表

1、分區
  對業務透明,分區只不過把存放數據的文件分成了許多小塊,例如mysql中的一張表對應三個文件.MYD,MYI,frm。
根據一定的規則把數據文件(MYD)和索引文件(MYI)進行了分割,分區后的表呢,還是一張表。分區可以把表分到不同的硬盤上,但不能分配到不同服務器上。
優點:數據不存在多個副本,不必進行數據復制,性能更高。
缺點:分區策略必須經過充分考慮,避免多個分區之間的數據存在關聯關系,每個分區都是單點,如果某個分區宕機,就會影響到系統的使用。
2、分片
  對業務透明,在物理實現上分成多個服務器,不同的分片在不同服務器上。如HDFS。
3、分表
同庫分表:所有的分表都在一個數據庫中,由於數據庫中表名不能重復,因此需要把數據表名起成不同的名字。
優點:由於都在一個數據庫中,公共表,不必進行復制,處理更簡單。
缺點:由於還在一個數據庫中,CPU、內存、文件IO、網絡IO等瓶頸還是無法解決,只能降低單表中的數據記錄數。表名不一致,會導后續的處理復雜(參照mysql meage存儲引擎來處理)
不同庫分表:由於分表在不同的數據庫中,這個時候就可以使用同樣的表名。
優點:CPU、內存、文件IO、網絡IO等瓶頸可以得到有效解決,表名相同,處理起來相對簡單。
缺點:公共表由於在所有的分表都要使用,因此要進行復制、同步。一些聚合的操作,join,group by,order等難以順利進行。
4、分庫
  分表和分區都是基於同一個數據庫里的數據分離技巧,對數據庫性能有一定提升,但是隨着業務數據量的增加,原來所有的數據都是在一個數據庫上的,
網絡IO及文件IO都集中在一個數據庫上的,因此CPU、內存、文件IO、網絡IO都可能會成為系統瓶頸。 當業務系統的數據容量接近或超過單台服務器的容量、QPS
/TPS接近或超過單個數據庫實例的處理極限等。此時,往往是采用垂直和水平結合的數據拆分方法,把數據服務和數據存儲分布到多台數據庫服務器上。 分庫只是一個通俗說法,更標准名稱是數據分片,采用類似分布式數據庫理論指導的方法實現,對應用程序達到數據服務的全透明和數據存儲的全透明

 

8.linux常用命令

https://blog.csdn.net/qq_23329167/article/details/83856430

9.springmvc工作原理和注解

1、  用戶發送請求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到請求調用HandlerMapping處理器映射器。

3、  處理器映射器找到具體的處理器(可以根據xml配置、注解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一並返回給DispatcherServlet。

4、  DispatcherServlet調用HandlerAdapter處理器適配器。

5、  HandlerAdapter經過適配調用具體的處理器(Controller,也叫后端控制器)。

6、  Controller執行完成返回ModelAndView。

7、  HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。

8、  DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。

9、  ViewReslover解析后返回具體View。

10、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。

11、 DispatcherServlet響應用戶。

  


10.springboot常用注解

1、@Component:放在類上,把普通類實例化到spring容器中。可以說很多注解都是基於這個注解的。

2、@Bean: 放在方法上,用@Bean標注方法等價於XML中配置bean,這個方法一般返回一個實體對象,告訴spring這里產生一個對象,然后這個對象會交給Spring管理。產生這個對象的方法Spring只會調用一次,隨后這個Spring將會將這個Bean對象放在自己的容器中。

3、@Configuration:標注當前類是配置類,並會將當前類內聲明的一個或多個以@Bean注解標記的方法的實例納入到srping容器中,並且實例名就是方法名。(其實就是靠@Component注解)

4、@ConfigurationProperties:將配置文件中的參數映射成一個對象,通過prefix來設定前綴,然后將后面的和對象的屬性名一致就能實現注入(當然這個對象需要注入的屬性需要提供get和set方法 - - - 因為spring底層其實就是通過反射調用該對象的set方法)

 


11.zookeeper

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。
它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。 ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。 ZooKeeper包含一個簡單的原語集, [
1] 提供Java和C的接口。 ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的接口,代碼在$zookeeper_home\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。

 

家哇網絡:
1.ArrayList和LinkedList的區別

ArrayList 是動態數組結構,有索引,查詢快(時間復雜度O(1)),增刪慢(因為要移動索引)
LinkedList是鏈表結構,無索引,有指向前后的指針,查詢需要從頭開始向下尋找(時間復雜度O(n)),增刪快(只需要修改鏈表中指針的指向,不需要移動其他)

2.requestBody和resourceBody的作用

@RequestBody:

作用:

主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);

 

3.如何實現上傳文件
4.JAVA如何實現定時任務

普通thread
這是最常見的,創建一個thread,然后讓它在while循環里一直運行着,通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現。

用Timer和TimerTask
上面的實現是非常快速簡便的,但它也缺少一些功能。
用Timer和TimerTask的話與上述方法相比有如下好處:

當啟動和去取消任務時可以控制
第一次執行任務時可以指定你想要的delay時間
在實現時,Timer類可以調度任務,TimerTask則是通過在run()方法里實現具體任務。
Timer實例可以調度多任務,它是線程安全的。
當Timer的構造器被調用時,它創建了一個線程,這個線程可以用來調度任務:

ScheduledExecutorService
ScheduledExecutorService是從Java SE 5的java.util.concurrent里,做為並發工具類被引進的,這是最理想的定時任務實現方式。
相比於上兩個方法,它有以下好處:
相比於Timer的單線程,它是通過線程池的方式來執行任務的
可以很靈活的去設定第一次執行任務delay時間
提供了良好的約定,以便設定執行的時間間

 


5.文件流有哪些

字節流和字符流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM