java開發面試問題

1.類加載進虛擬機的過程

class文件 -加載-效驗-準備-解析-初始化
因爲class文件說白了jvm獲取後只是一串很長的字符串,在內存中根本就沒什麼變量,執行類初始化話代碼等等,所以jvm根據此字符串做出相應的處理,也就是上面的步驟,纔會變成用戶可用的類。

還有這些步驟的順序只是表示按順序開始,但不是一個步驟結束纔開始另一個步驟,步驟之間是交錯運行的。

加載

完成三件事:
1.獲取class文件的二進制流
2.將二進制流轉換成相對應的數據結構並保存在方法區中
3.在堆中生成對應的class對象。

判斷類是否相等,是由類的加載器和類的全限定名決定的。即使是同一個class文件,由不同的類加載器加載,在虛擬機中加載出來的這2個類都是不相等的。

在這個過程中,獲取class文件的二進制流這一步我們有很大的控制權限,任何形式獲取class文件二進制流都是可以的,只要我們想得到,例如從網絡,磁盤,甚至是自己運行時構造一個class文件再加載進來都是可以的。寫好相應的類加載器都是可以的。

校驗

這裏我們會想爲什麼需要校驗?到底需要校驗哪些數據呢?其實class文件不一定是由java代碼經過編譯而來,
甚至有可能是直接寫字節碼得來的,class文件裏的內容更像是一種底層語言,而java只是讓這個語言的語法符合高層語言寫法的一種封裝,
所以class文件不可信,也是需要通過類似語言的校驗,例如語法,文件類型,結構等等每一行的語句都需要通過校驗才能保證其正確性。
只有文件正確性保證了,才能保證jvm的安全,代碼的正常運行。

準備

準備階段需要準備什麼?這個階段主要跟類變量相關,爲類變量分配內存地址,並且清空分配的內存地址。

解析

把符號引用解析爲直接引用。
1.非數組類的符號引用解析
	根據類的全名去加載類,如果有父類繼續加載父類,加載成功後查看有沒權限,有權限則加載成功。
2.字段引用解析
	先加載字段所屬類,然後在類中查找字段,如果找不到繼續往父類找,找到並判斷字段的權限。
3.類方法解析
	跟字段解析相似。
4.接口方法解析
	先加載字段所屬接口,然後在接口中查找對應的方法。

初始化

執行編譯生成的init方法和自己編寫的靜態方法,給字段置初始值

2.Solr中文詞庫配置

教程地址

3.索引會不會失效

  1. 如果條件中有or,即使其中有條件帶索引也不會使用(這也是爲什麼儘量少用or的原因)注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引
    在這裏插入圖片描述
    .
  2. 對於使用 like 查詢, 查詢如果是 ‘%aaa’ 不會使用索引,而 ‘aaa%’ 會使用到索引。
  3. 如果條件中有 or, 有條件沒有使用索引,即使其中有條件帶索引也不會使用,換言之, 就是要求使用的所有字段,都必須單獨使用時能使用索引。
    4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
    在這裏插入圖片描述
     5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引 如:表裏只有一條數據。

4.springboot

SpringBoot優缺點

SpringBoot優缺點
優點:
1、快速構建項目。
2、對主流開發框架的無配置集成。
3、項目可獨立運行,無須外部依賴Servlet容器。
4、提供運行時的應用監控。
5、極大的提高了開發、部署效率。
6、與雲計算的天然集成。
缺點:
1、如果你不認同spring框架,也許這就是缺點。
SpringBoot幾個常用的註解
1@RestController@Controller指定一個類,作爲控制器的註解 
(2@RequestMapping方法級別的映射註解,這一個用過Spring MVC的小夥伴相信都很熟悉 
(3@EnableAutoConfiguration@SpringBootApplication是類級別的註解,根據maven依賴的jar來自動猜測完成正確的spring的對應配置,只要引入了spring-boot-starter-web的依賴,默認會自動配置Spring MVC和tomcat容器
(4@Configuration類級別的註解,一般這個註解,我們用來標識main方法所在的類,完成元數據bean的初始化。
(5@ComponentScan類級別的註解,自動掃描加載所有的Spring組件包括Bean注入,一般用在main方法所在的類上 
(6@ImportResource類級別註解,當我們必須使用一個xml的配置時,使用@ImportResource@Configuration來標識這個文件資源的類。 
(7@Autowired註解,一般結合@ComponentScan註解,來自動注入一個Service或Dao級別的Bean
(8@Component類級別註解,用來標識一個組件,比如我自定了一個filter,則需要此註解標識之後,Spring Boot纔會正確識別。
springboot自動配置的原理
在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration

會自動去maven中讀取每個starter中的spring.factories文件  該文件裏配置了所有需要被創建spring容器中的bean

5.sql優化的

	從用`explain`關鍵字分析SQL語句開始

在這裏插入圖片描述
含義詳解地址

6.Freemarker靜態化頁面實現流程

衆所周知,隨着網站的訪問量增加,如何給用戶以良好的訪問體驗就顯得尤爲重要。提升網站性能便成爲一些網站面臨的一大難題,像hao123這樣的導航網站要提升網站的性能只要部署的web服務器數量足夠就可以承載超大規模的訪問量,如果是一個動態的網站呢?例如像鳳凰新聞、網易新聞這樣的CMS系統,淘寶、京東這樣的大型購物網站由於這些網站都使用到了數據庫這也就很難做到單純的通過增加web服務器數量的方式來有效的提升網站的性能,但是這些網站並沒有出現或者說極少出現因爲訪問量過大而造成頁面響應緩慢的問題。這其中有什麼樣的技術手段使得這些大型的動態網站能夠有如此高的性能呢?目前提升網站性能的方法通常有HTML靜態化、圖片服務器分離、數據庫集羣、負載均衡、代碼優化、壓縮JS和CSS文件等等。其中HTML靜態化的目的其實就是降低HTTP請求個數從而降低數據庫的操作從而達到提高網站運行速度,這也是一個最有效的提升網站性能的方法之一。本文將通過具體案例講解如何採用FreeMarker將動態網頁靜態化從而達到提升網站性能的目的。

1,動態網頁和靜態網頁差異?

1)靜態網頁:

	a、靜態網頁的內容穩定,頁面加載速度快。

  b、靜態網頁的沒有數據庫支持,在網站製作和維護方面的工作量較大。

  c、靜態網頁的交互性差,有很大的侷限性。

2)動態網頁:

  a、交互性好。

  b、動態網頁的信息都需要從數據庫中讀取,每打開一個一面就需要去獲取一次數據庫,如果訪問人數很多,
  也就會對服務器增加很大的荷載,從而影響這個網站的運行速度。

  通過上面的比較我們不難看出,要提升網站的性能,我們只要把動態網頁做成靜態網頁就會在運行速度方面有顯著的提升,
  但是問題出來了,如果將所有頁面都做成靜態頁面顯然是不切實際的。有什麼辦法能讓我們的網站即能有動態網頁的交互性,
  又有靜態網頁的加載速度呢?FreeMarker便能實現這樣的需求:實現動態網頁靜態化。
Freemarker 頁面靜態化技術使用入門案例

在訪問 新聞、活動、商品 詳情頁面時, 路徑可以是 xx【id】.html, 服務器端根據請求 id, 動態生成 html 網頁,下次訪問數據時,無需再查詢數據,直接將 html 靜態頁面返回。這樣一來就減 少 數 據 庫 交 互 , 從而提高查詢性能。
Struts2 默認使用 freemarker 實現 自定義標籤模板,項目導入 struts2 就已經導入了freemarker jar 包。
使用Freemarker步驟:
1、 安裝 freemarker eclipse 編輯插件。
將 “freemarker_eclipseplugin” 複製 eclipse 的 dropins 文件夾 ,重啓開發工具。
2、 編輯 freemarker 的模板文件。
通常模板文件 放在 WEB-INF 下 或者 classes 下。
${變量} , 需要在程序中指定變量,合併到模板文件 一同輸出。

hello.ftl模板文件代碼:

<html>
    <title>
        ${title}
    </title>
    <body>
        ${msg}
    </body>
</html>

Java測試類FreemarkerTest代碼:

public class FreemarkerTest {
    @Test
    public void testOutput() throws IOException, TemplateException {
        // 配置對象, 配置模板位置
        Configuration configuration = new Configuration(
                Configuration.VERSION_2_3_22);
        configuration.setDirectoryForTemplateLoading(new File(
                "src/main/webapp/WEB-INF/templates"));

        // 獲取模板對象
        Template template = configuration.getTemplate("hello.ftl");

        // 動態數據對象
        Map<String, Object> paramterMap = new HashMap<String, Object>();
        paramterMap.put("title", "你我他學習吧");
        paramterMap.put("msg", "你好,這是第一個Freemarker案例!");

        // 合併輸出
        template.process(paramterMap, new PrintWriter(System.out));
    }
}

7.商品模塊多少個表

分類表:
(商品分類編號, 分類名稱, 父分類編號)
(1, 男裝, 0)
(2, 褲子, 1)
(3, 外套, 1)
(4, 內褲, 1)
(5, 襪子, 1)
商品表:
(商品編號, 商品名稱, 商品分類編號, 賣家編號, SPU銷量, 評論數)
(1, '褲子名', 2, 1, 0)
(2, '外套名', 3, 1, 0)
(3, '內褲名', 4, 1, 0)
(4, '襪子名', 5, 1, 0)
(庫存表):
(編號, 商品編號, SKU屬性, 價格, 庫存, SKU銷量)
(1, 1, [1:1,2:3], 99, 400, 0) 其中 [1:1,2:3] 表示 "顏色爲黑色,尺碼爲X"
(2, 1, [1:1,2:4], 99, 200, 0) 其中 [1:1,2:4] 表示 "顏色爲黑色,尺碼爲XL"
(3, 1, [1:2,2:3], 99, 300, 0) 其中 [1:2,2:3] 表示 "顏色爲白色,尺碼爲X"
(4, 1, [1:2,2:4], 99, 100, 0) 其中 [1:2,2:4] 表示 "顏色爲白色,尺碼爲XL"
上面只列出商品1這個分類的4個SKU.

8.購物車模塊多少張表

1.訂單表
2.商品記錄表
3.購物車記錄表
4.收藏記錄表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章