1. 程式人生 > >java面試題——java基礎(四)

java面試題——java基礎(四)

table 生命 運行 漸變 於平 單獨使用 標記語言 prepare 新建

java基礎
1.java跨平臺
  由於各個操作系統的指令不完全一樣,在不同的操作系統執行不同的程序代碼,java開發了java虛擬機來屏蔽系統之間的差異,針對不同的系統安裝不同的虛擬機即可。
2.int數據占32字節
  8中基本類型:byte(8)、short(16)、int(32)、long(64)、float(32)、double(64)、char(16)、Boolean(1)
3.java的三大屬性,封裝,多態,繼承,java四大特征,分別是抽象,封裝,多態,繼承。
  繼承:繼承是從已有的類得到繼承信息創建新的類的過程,繼承可以表示為 is-a 關系 。
  多態:方法重載(Overload):編譯時的多態性(也就是前綁定),方法可以根據不同參數類型進行不同調用,方法名字一致。的

     方法重寫(Override):運行時的多態(也稱為後綁定)。
     要實現方法重寫需要做:①.方法重寫,也就是子類繼承父類並重寫了父類已經有的方法。 ②.用父類型引用來引用子類型對象,這樣可以實現調用同樣的方法會根據子類對象的不同表示出不一樣的行為。

  封裝:將對象封裝為一個高度自治和封閉的個體,對象狀態由這個對象自己的行為來讀取和改變。(一個人的姓名、身高、體重由自己的方法獲取或改變)
  抽象:將相同的類的共同特征總結出來,構造成類的過程。包括數據抽象以及行為抽象。數據抽象變成類的成員變量,行為抽象變成類的成員函數。抽象只關心成員變量以及成員函數,並不關系具體的實現細節。
4.有基本類型 為啥要裝箱類型

  裝箱:把基本類型轉換為包裝類型,就是Integer
  拆箱:把包裝類型轉換為基本類型
  java 是面對對象語言,基本的數據類型不具備面向對象的特性。
  integer和int作為ID 。integer直接判斷是否為空即可,int既要判斷是否為0還要判讀為空
  對象緩存:對象緩存
5.“==”與“equals”
  == 直接用來判斷兩個變量的值是否相等,如果是基本類型課直接比較,如果是引用類型要比較對應內存結構首地址
  equals 用來判斷變量對象內容是否一樣
  String=“123”; string= new string(“123”); 用==比較不相等
6.string 、stringBuilder、stringbuffer 字符串就是多個字符的集合
  String 是內容不可變的的字符串
  StringBuilder和stringbuffer可變,底層實現用可變數組(沒有用final修飾)
  StringBuilder是線程不安全的,效率高
  stringbuffer是線程安全的,效率低(底層實現用到了同步鎖)
7.java中的集合,集合分為value 和 key-value
  List 是有序,可以重復
  Set 是無序的 不可以重復,是根據equals 和 hashcode判斷
  map
8.ArrayList 底層實現用數組,使用在查詢比較多,插入刪除比較少
LinkedList 底層實現用的是鏈表,與一樣相反
數組查詢比較快,插入與修改比較慢(需要在內存中是一塊連續的內存,插入修改需要運動內存)
鏈表插入與修改比較快,查詢比較慢(內存不要求連續,查詢需要查找引用地址)
9.HashMap和HashTable
  ①.都是可key-Value
  ②.hashmap可以用null作為key或value
  ③.Hashmap是線不安全的,效率高
  ④.ConcurrentHashMap和CopyOnWriteArrayList保留了線程安全的同時,也提供了更高的並發性。
10.拷貝文件用字符流還是字節流。
  用字節流,因為拷貝文件時,不確定文件是否包含字節流(圖片、聲音、圖像等),為通用選擇字節流。
11.線程的幾種實現方式
  實現方式
    1.通過Thread實現
    2.runnable接口實現
    繼承擴展性不強,java總只支持單繼承,如果一個類型繼承了thread就不能繼承其他的類
    怎麽啟動
    怎麽區分
    給線程設置名稱
12.線程並發庫
  java.util.current包中提供了對線程優化、管理的各項操作,使得線程的使用變得的心應手。
  該包提供了線程的運行,線程池的創建,線程生命周期的控制.
  Java通過 Executors提供四個靜態方法創建四種線程池,分別為:
  ①.newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
  ②.newFixedThreadPool 創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。
  ③.newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
  ④.newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行
  其中:FIFO為先進先出(類似於隊列);LIFO為後進先出(類似於棧)

  作用:1 限制線程的個數,防止系統崩潰,內存溢出
13.設計模式:可以解決過程中可以反復使用的,可以解決特定問題的的設計方式
  單體:飽漢模式和饑餓模式
  ①.構造方法私有化,除自己之外不能創建
  ②.在自己的類中創建一個單實例(飽漢模式是一開始就創建饑餓模式是需要的時候會創建)
  ③.提供一個方法獲取實例對象
  工廠模式:SpringIOC的實現
  代理模式:SpringAOP根據動態代理實現
java Web基礎
14.get與post 都是http請求
  get 查詢 post 改 put增 delete 刪除
  get 請求數據在地址欄顯示,地址欄參數有限制(1024)
  post 請求參數不會在地址欄顯示,參數長度不會顯示,安全性搞一下
15.servlet全稱 java servlet 是java編寫的服務器端程序,主要作用是交互式瀏覽和修改數據,生成動態的web內容。
16.servlet生命周期
  加載、實例化、初始化、處理請求、服務結束
  啟動時加載,加載完成後servet會被實例化,然後容器進行初始化,請求到達時響應請求、完成響應時關閉請求。
17.servlet中forward() 與redirect()的區別
  forward()服務器端轉向 在地址欄不會改變轉向後的地址,這個方法更加高效,盡量使用
  redirect() 客戶端跳轉 瀏覽器會得到跳轉的地址,重新發送請求
18.jsp與servlet的相同與區別
  jsp是servlet的技擴展,jsp會被翻譯為一個繼承httpservlet的類
  servlet是在java中寫html 側重邏輯控制
  jsp是在html中寫java 側重視圖
19.jsp的作用域
  pagecontext
  request
  session
  application

20.session與cookie都是會話跟蹤技術
  cookie 是在客戶端記錄信息
  session是在服務器存在數據 安全 數據量大占內存(購物車的實現)
  cookie是在客戶端是可以禁用的,這時要用cookie+數據庫測試
  主要信息存放在session
21.MVC
  model 模型 javabean
  view 視圖 html、jsp
  controller 控制器 servlet action

經典:JSP+Servlet+javaBean

數據庫基礎
22.數據庫分類
  關系型數據庫(三範式):mysql Oracle SqlServer
  非關系數據庫:redis memcache mogodb Hadoop
  第一範式:數據的不可分割
  第二範式:每一行可以被唯一標識 主鍵
  第三範式:數據庫表中不包含其他數據庫的非主鍵字段 外鍵
23.事務:並發控制的單位
  原子性、一致性、隔離線、持久性
24.mysql默認最大連接數 100
  數據庫只能設置一定數目同時連接
25 mysql分頁和Oracle分頁
  當數據量很大的時候進行分段顯示
  mysql通過limit進行分頁查詢,limit offset size
  Oracle用到的是一個三層嵌套查詢
26.觸發器
27.存儲過程
28.調用jdbc過程(詳細有七部)
  加載驅動
  獲取連接
  設置參數
  釋放連接
29.prepareStatement與statement的好處
  ①.prepareStatement是預編譯的,比statement快
  ②.代碼的客戶維護性和可讀性
  ③.prepareStatement可以防止sql註入
30.數據庫連接池的作用
  ①.限制數據庫的個數,不會因為數據連接過多導致系統奔潰
  ②.數據庫連接不需要每次都去創建或者銷毀,節約了資源
  ③.不需要每次都去創建,響應時間更快
前端基礎
31.html css js的定位
  html 超文本標記語言 定義網頁結構
  css層疊樣式表,美化頁面
  js 驗證表單 做動態交互
32.ajax
  異步的js和xml
  作用:異步刷新頁面,完成局部更新
33.js 和jQuery
  jQuery是js的框架,封裝了js的方法。增強了js的功能,使用便利
34.jQuery選擇
  ID選擇器 通過ID獲取選擇器
  class選擇器,通過標簽選擇器
  標簽選擇器,通過標簽獲取
  通用選擇器,獲取所有的元素 div.myCls
  增次選擇器
  兒子選擇器 後代選擇器
  屬性選擇器 獲取擁有標簽屬性的信息
35.jQuery頁面加載事件

36.html5是最新版版本的html,增加了像畫板、聲音、視頻、web存儲等高級功能,但是太強調語義,導致選擇標簽困難
 css3
  盒子的邊框
  盒子和文字的陰影
  漸變
  轉換、移動、縮放、旋轉
  過渡、動畫都可以做動畫
  可以使用媒體查詢實現響應式網站
  缺點:根據不同瀏覽器處理兼容性,對於有處理工具
37.bootstarp是移動設備優先的UI框架
38.Struts2的執行過程
  攔截 判斷 尋找 執行 響應
  攔截:通過StrutsPrepareAndExecuteFilter攔截
  判斷:通過ActionMapper判斷是否需要尋找Action,如果需要請求交給ActionProxy,ActionProxy通過Configuration Manager範文Struts.xml,找到類
  執行:創建ActionInvocations實例,調用action中對應的結果name
  響應:通過name知道對應結果集響應瀏覽器
39.SpringMvC 的原理
  ①.用戶發送請求,被spring前端控制servlet dispatcherServlet捕獲
  ②.dispatcherServlet對請求url進行解析,得到請求資源標識符(Url),然後根據url調用HandMapping獲得Handler配置的所有相關對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回。
  ③.dispatcherServlet根據獲取的Handler,選擇一個合適的HandlerAdapter。提取Request中的模型數據,填充Handler入參,開始執行Handler(controller),Handler執行完成後,向dispatcherServlet返回一個ModelAndView對象
  ④.dispatcherServlet根據返回的ModelAndView,選擇合適的ViewReSolver(必須是已經註冊到Spring容器中的)ViewReSolver
  ⑤.通過ViewReSolver結合Model和View,來渲染dispatcherServlet將渲染結果返回給客戶端。

技術分享圖片

  ** 核心控制器捕獲請求,查找Handler,執行Handler,選擇ViewReSolver,通過ViewReSolver渲染視圖並返回
40.Struts2和springMVC的區別
  ①.核心控制器不同:Struts2是filter SpringMVC 是servlet
  ②.springMVC快一些,Struts2是基於對象設計,每次請求都會實例一個action,但是springMVC是基於方法
  ③.管理方式不同:SpringMVC 提供了註解方式進行管理,各種功能的註解都比較全,使用簡單,而Struts2需要采用xml配置參數來管理
  ④.參數傳遞:Struts2通過ValueStack繼續傳遞和賦值,而springMVC是通過方法的參數來傳遞
  ⑤.intercepter的實現機制:Struts有自己的intercepter機制,但是SpringMVC用的是獨立AOP方式。,這樣springmvc更加簡潔,開發效率更加高效
  ⑥.ajax返回方式是springMVC是通過註解的方式@responseBody 但是Struts使用插件的方式進行處理

41.Spring 兩大核心,spring是j2EE應用程序框架
  ①.IOC(控制反轉)原理:工廠模式+反射+配置文件
  ②.AOP(面向切面編程) 原理:動態代理在執行前後或者出現異常執行相關邏輯

42.事務傳播特性
  Required 存在一個事務則支持當前事務,如果沒有事務則開啟
  supports 存在事務,支持當前事務,如果沒有則非實物的執行
  mandatory 必要的 存在一個事務則支持當前事務,如果沒有事務則拋出異常
  required_new 總是開啟新事物 存在一個事務則將這個存在的事務掛起
  NOT_SUpport 總是非事務執行,並掛起任何存在的事務
  Never 總是非事務執行,如果存在拋出異常
  Nested 嵌套 如果有就嵌套,沒有就開啟事務
43.spring事務隔離級別
44.ORM  對象關系映射
  ORM框架:為了解決面對對象與關系數據庫存在相互不匹配的現象的技術。
  MyBatis hibernate
45.MyBatis hibernate的區別
  MyBatis 好處:屏蔽jdbc api的底層訪問細節,將sql和java代碼分離,提供了將結果集自動化封裝稱為實體對象和對象的集合的功能。queryForlist返回對象集合,用queryForObject返回單個對象,提供了自動將實體對象屬性傳遞給sql語句的參數。
  hibernate:hibernate是一個全自動的ORM映射工具,他可以自動生成sql語句並執行返回結果集。
差異:hibernate不能處理復雜的sql
46.hibernate的映射狀態
  瞬時狀態
  持久化狀態
  遊離狀態
  刪除狀態

技術分享圖片

47.hibernate緩存
  目的:為提供訪問速度,變數據庫訪問為內存訪問
  一級緩存是session級別,內置不能被卸載
  二級緩存是sessionfactory是的,從應用到應用介紹有效果,是可選的,默認沒有,需要手動開啟
  二級緩存適用數據:很少被修改 經常查詢 不重要
  沒有解決分布式緩存,默認不支持,使用redis
48.webservice是soa(面向服務編程)的架構,她不依賴於語言,不依賴於平臺,通過internet進行http協議的網絡應用間交互。
49.activity 是業務流程管理和工作流系統,核心是超快速、穩定的流程引擎易,易於spring結合。
高級部分
50.查找sql慢查詢用explain
51.數據庫優化
  1.設計遵循第三範式
52.選擇存儲引擎
  MyISAM:對事物要求不高,以查詢和插入為主,不支持外鍵,支持全文索引,支持表鎖
  innodb:對事務要求高,建議使用,支持外鍵,不支持全文索引、支持行鎖
  memory:數據變化頻繁,不需要入庫,同時頻繁查詢與修改,速度極快
53.用索引查詢變快 但是增刪查會變慢
  復合索引,不使用第一部分不會使用索引
  查詢“%kkk%” 不會用到索引
  要求所有字段必須使用都必須單獨使用時能使用索引
  mysql判斷,全表查詢比索引快是使用索引
54分表
  水平分表 按照行數據分表
  垂直分表 按照列分表
  水平分表策略:
    按照時間,具有很強的時效性
    按照id範圍
    通過hash分表,通過一定的算法進行分表
55.優化小技巧
  ddl優化:①第一步 插入之前刪除key,第二部 批量插入 第三部 恢復key
      ②關閉唯一校驗③變多次提交為一次
  dml: 批量插入
  dql:order by 多用索引排序 group by中去掉order by null 子查詢
56.redis保存對象
  json字符串:需要手動轉為json字符串,作為字符串存儲
  字節:需要轉換為字節存儲,數據量大時使用

java面試題——java基礎(四)