2025年Java校園招聘面試常見(jiàn)問(wèn)題及詳細(xì)答案歸總_第1頁(yè)
2025年Java校園招聘面試常見(jiàn)問(wèn)題及詳細(xì)答案歸總_第2頁(yè)
2025年Java校園招聘面試常見(jiàn)問(wèn)題及詳細(xì)答案歸總_第3頁(yè)
2025年Java校園招聘面試常見(jiàn)問(wèn)題及詳細(xì)答案歸總_第4頁(yè)
2025年Java校園招聘面試常見(jiàn)問(wèn)題及詳細(xì)答案歸總_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2025年Java校園招聘面試常見(jiàn)問(wèn)題及詳細(xì)答案歸總Java基礎(chǔ)語(yǔ)法與特性Java面向?qū)ο蟮乃拇蠛诵奶匦允欠庋b、繼承、多態(tài)和抽象。封裝通過(guò)訪問(wèn)控制符(private、protected、public)限制屬性和方法的訪問(wèn)范圍,確保數(shù)據(jù)安全性,例如將用戶類的年齡屬性設(shè)為private,僅通過(guò)setAge()方法校驗(yàn)后賦值。繼承允許子類復(fù)用父類代碼,通過(guò)extends關(guān)鍵字實(shí)現(xiàn),需注意Java不支持多繼承但支持接口多實(shí)現(xiàn),例如Student類繼承Person類獲取姓名、年齡等基礎(chǔ)屬性。多態(tài)分為編譯時(shí)多態(tài)(方法重載,同一類中方法名相同參數(shù)不同)和運(yùn)行時(shí)多態(tài)(方法重寫,子類重寫父類方法,JVM通過(guò)動(dòng)態(tài)綁定調(diào)用實(shí)際類型方法),典型應(yīng)用如打印不同形狀面積時(shí),調(diào)用Shape父類的draw()方法實(shí)際執(zhí)行子類Circle或Rectangle的實(shí)現(xiàn)。抽象通過(guò)abstract類或接口定義規(guī)范,強(qiáng)制子類實(shí)現(xiàn)核心方法,例如定義一個(gè)抽象類Payment,包含抽象方法pay(),具體子類Alipay、WeChatPay分別實(shí)現(xiàn)支付邏輯。JDK17作為長(zhǎng)期支持版本(LTS),企業(yè)級(jí)應(yīng)用中常見(jiàn)問(wèn)題包括其新特性:密封類(sealedclass)通過(guò)permits關(guān)鍵字限制子類,防止無(wú)關(guān)類繼承,提升代碼安全性;模式匹配(instanceof模式匹配)允許直接在條件判斷中提取對(duì)象屬性,例如if(objinstanceofStrings){System.out.println(s.length());}簡(jiǎn)化類型檢查和轉(zhuǎn)換;VectorAPI(JEP414)提供向量計(jì)算的高效實(shí)現(xiàn),比循環(huán)操作數(shù)組更優(yōu);switch表達(dá)式增強(qiáng)支持yield返回值,簡(jiǎn)化多條件判斷邏輯;ZGC垃圾收集器成為默認(rèn)選項(xiàng),進(jìn)一步降低停頓時(shí)間。JVM內(nèi)存模型與垃圾回收J(rèn)VM內(nèi)存主要分為堆、方法區(qū)(元空間,JDK8后替代永久代)、虛擬機(jī)棧、本地方法棧和程序計(jì)數(shù)器。堆是最大的內(nèi)存區(qū)域,存儲(chǔ)對(duì)象實(shí)例和數(shù)組,被所有線程共享,是GC的主要區(qū)域,分為年輕代(Eden區(qū)+兩個(gè)Survivor區(qū))和老年代。虛擬機(jī)棧為線程私有,存儲(chǔ)棧幀(局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口),每個(gè)方法調(diào)用對(duì)應(yīng)一個(gè)棧幀入棧,方法執(zhí)行完畢出棧,若棧深度超過(guò)限制會(huì)拋出StackOverflowError。垃圾回收的核心是確定哪些對(duì)象可回收??蛇_(dá)性分析算法通過(guò)GCRoots(如棧中引用的對(duì)象、方法區(qū)靜態(tài)變量引用的對(duì)象)標(biāo)記存活對(duì)象,不可達(dá)對(duì)象為可回收。年輕代對(duì)象生命周期短,采用復(fù)制算法(Eden區(qū)+FromSurvivor區(qū)存活對(duì)象復(fù)制到ToSurvivor區(qū),清空原區(qū)域);老年代對(duì)象存活時(shí)間長(zhǎng),采用標(biāo)記-清除或標(biāo)記-整理算法。G1收集器(JDK9默認(rèn))將堆劃分為多個(gè)Region,優(yōu)先回收價(jià)值高的Region,降低停頓時(shí)間;ZGC通過(guò)顏色指針和讀屏障實(shí)現(xiàn)并發(fā)標(biāo)記,停頓時(shí)間控制在10ms以內(nèi),適合大內(nèi)存場(chǎng)景。類加載機(jī)制分為加載、鏈接(驗(yàn)證、準(zhǔn)備、解析)、初始化三個(gè)階段。加載階段通過(guò)類加載器(BootstrapClassLoader、ExtensionClassLoader、ApplicationClassLoader)將.class文件加載到內(nèi)存;鏈接的驗(yàn)證階段檢查字節(jié)碼格式是否合法,準(zhǔn)備階段為靜態(tài)變量分配內(nèi)存并賦默認(rèn)值(如int賦0),解析階段將符號(hào)引用轉(zhuǎn)為直接引用;初始化階段執(zhí)行類構(gòu)造器<clinit>()方法,按順序初始化靜態(tài)變量和靜態(tài)代碼塊。雙親委派模型指類加載器收到加載請(qǐng)求時(shí)先委托父類加載器,父類無(wú)法加載再自己加載,避免核心類(如java.lang.String)被自定義類覆蓋,破壞場(chǎng)景包括熱部署(OSGi動(dòng)態(tài)加載類)和SPI(如JDBC通過(guò)線程上下文類加載器打破委派)。并發(fā)編程核心線程池的核心參數(shù)包括corePoolSize(核心線程數(shù),即使空閑也保留)、maximumPoolSize(最大線程數(shù))、keepAliveTime(非核心線程空閑存活時(shí)間)、unit(時(shí)間單位)、workQueue(任務(wù)隊(duì)列,如ArrayBlockingQueue、LinkedBlockingQueue)、threadFactory(線程工廠,設(shè)置線程名等)、handler(拒絕策略)。工作流程:新任務(wù)提交時(shí),若運(yùn)行線程數(shù)<corePoolSize則新建線程執(zhí)行;若≥corePoolSize則加入隊(duì)列;隊(duì)列滿且運(yùn)行線程數(shù)<maximumPoolSize則新建非核心線程執(zhí)行;若隊(duì)列滿且線程數(shù)≥maximumPoolSize則觸發(fā)拒絕策略(AbortPolicy拋出異常,DiscardPolicy丟棄任務(wù),DiscardOldestPolicy丟棄隊(duì)首任務(wù),CallerRunsPolicy由調(diào)用線程執(zhí)行)。AQS(AbstractQueuedSynchronizer)是ReentrantLock、CountDownLatch等同步工具的底層框架,通過(guò)volatile修飾的state變量(0表示未占用,1表示已占用)和CLH隊(duì)列(雙向鏈表存儲(chǔ)等待線程)實(shí)現(xiàn)鎖的獲取與釋放。ReentrantLock基于AQS,支持公平鎖(按等待隊(duì)列順序獲?。┖头枪芥i(新線程直接嘗試搶占,提高吞吐量),需手動(dòng)釋放鎖(finally塊中調(diào)用unlock());synchronized是JVM內(nèi)置鎖,早期為重量鎖(依賴OS互斥量),JDK6后優(yōu)化為偏向鎖(標(biāo)記線程ID,無(wú)競(jìng)爭(zhēng)時(shí)無(wú)開(kāi)銷)→輕量級(jí)鎖(CAS嘗試獲取,失敗則升級(jí))→重量級(jí)鎖的鎖膨脹機(jī)制,自動(dòng)釋放鎖(同步塊/方法結(jié)束)。volatile關(guān)鍵字保證變量的可見(jiàn)性(修改后立即刷新到主內(nèi)存,其他線程讀取時(shí)從主內(nèi)存獲取)和禁止指令重排(通過(guò)內(nèi)存屏障實(shí)現(xiàn)),但不保證原子性(如i++操作包含讀取、修改、寫入三步,非原子)。Happens-Before原則定義了操作間的可見(jiàn)性順序,如程序順序規(guī)則(單線程內(nèi)前操作對(duì)后操作可見(jiàn))、volatile變量規(guī)則(寫volatile變量先于讀操作)、鎖規(guī)則(解鎖先于加鎖)、傳遞性規(guī)則等,用于判斷多線程環(huán)境下數(shù)據(jù)是否一致。集合框架深度解析HashMap底層在JDK7中是數(shù)組+鏈表,JDK8優(yōu)化為數(shù)組+鏈表+紅黑樹(shù)(當(dāng)鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64時(shí),鏈表轉(zhuǎn)為紅黑樹(shù),查詢時(shí)間復(fù)雜度從O(n)降至O(logn);當(dāng)紅黑樹(shù)節(jié)點(diǎn)數(shù)≤6時(shí)退化為鏈表)。數(shù)組的初始容量為16(可通過(guò)構(gòu)造函數(shù)指定,但會(huì)調(diào)整為2的冪次,方便位運(yùn)算取模),負(fù)載因子默認(rèn)0.75(平衡空間和時(shí)間:過(guò)小易擴(kuò)容,過(guò)大鏈表過(guò)長(zhǎng))。擴(kuò)容機(jī)制為當(dāng)元素?cái)?shù)量>容量×負(fù)載因子時(shí),數(shù)組長(zhǎng)度翻倍(newCap=oldCap<<1),重新計(jì)算哈希值并遷移元素(JDK8中通過(guò)(e.hash&oldCap)是否為0決定留在原位置或移動(dòng)到原位置+oldCap,避免重新計(jì)算哈希)。ConcurrentHashMap在JDK7中使用分段鎖(Segment數(shù)組,每個(gè)Segment繼承ReentrantLock,鎖定部分桶),并發(fā)度為Segment數(shù)量;JDK8取消Segment,采用CAS+synchronized(僅鎖定鏈表頭節(jié)點(diǎn)或紅黑樹(shù)根節(jié)點(diǎn)),降低鎖粒度。put操作時(shí),若桶為空則CAS插入;若桶不為空且頭節(jié)點(diǎn)未被鎖定(synchronized鎖定頭節(jié)點(diǎn)),則遍歷鏈表或紅黑樹(shù)插入,最后檢查是否需要樹(shù)化。size()方法在JDK8中通過(guò)遍歷baseCount和CounterCell數(shù)組(記錄各線程的增量)累加得到近似值,高并發(fā)下更高效。ArrayList基于動(dòng)態(tài)數(shù)組,默認(rèn)初始容量10,擴(kuò)容時(shí)新容量為原容量的1.5倍(oldCapacity+(oldCapacity>>1)),適合隨機(jī)訪問(wèn)(O(1))但插入/刪除(需移動(dòng)元素,O(n))效率低;LinkedList基于雙向鏈表,節(jié)點(diǎn)包含prev、next和item,插入/刪除(僅需修改指針,O(1))高效但隨機(jī)訪問(wèn)(需遍歷,O(n))慢。Vector通過(guò)synchronized修飾方法實(shí)現(xiàn)線程安全,但鎖粒度大(整個(gè)方法),性能低于CopyOnWriteArrayList(寫時(shí)復(fù)制,讀無(wú)鎖,適合讀多寫少場(chǎng)景)。數(shù)據(jù)庫(kù)與緩存MySQL索引分為主鍵索引(唯一標(biāo)識(shí)行,自動(dòng)創(chuàng)建)、唯一索引(約束字段唯一)、普通索引(加速查詢)、全文索引(針對(duì)文本內(nèi)容)。B+樹(shù)索引是最常用的結(jié)構(gòu),葉子節(jié)點(diǎn)存儲(chǔ)完整數(shù)據(jù)(聚簇索引)或主鍵(非聚簇索引,需回表查詢),相比B樹(shù)更適合磁盤存儲(chǔ)(更矮胖,減少IO次數(shù))。索引優(yōu)化需遵循最左前綴原則(聯(lián)合索引(a,b,c)支持a、a+b、a+b+c查詢),避免在索引列上使用函數(shù)(如WHEREYEAR(create_time)=2023會(huì)失效),優(yōu)先使用覆蓋索引(查詢字段包含在索引中,避免回表)。事務(wù)的ACID特性:原子性(事務(wù)要么全做要么全不做)、一致性(事務(wù)前后數(shù)據(jù)狀態(tài)合法)、隔離性(事務(wù)間互不干擾)、持久性(提交后數(shù)據(jù)永久保存)。隔離級(jí)別從低到高:讀未提交(允許臟讀,A事務(wù)未提交的修改被B讀?。⒆x已提交(避免臟讀,Oracle默認(rèn),B只能讀取A提交后的數(shù)據(jù))、可重復(fù)讀(避免不可重復(fù)讀,MySQL默認(rèn),B多次讀取同一數(shù)據(jù)結(jié)果一致)、串行化(最高隔離,事務(wù)串行執(zhí)行,避免幻讀)。InnoDB通過(guò)MVCC(多版本并發(fā)控制,通過(guò)undo日志記錄歷史版本)實(shí)現(xiàn)讀已提交和可重復(fù)讀,間隙鎖(鎖定索引間隙)防止幻讀(A事務(wù)查詢id>10的記錄,B事務(wù)插入id=15的記錄,A再次查詢時(shí)出現(xiàn)新記錄)。Redis常用數(shù)據(jù)結(jié)構(gòu):String(緩存單個(gè)值,如用戶信息JSON)、Hash(存儲(chǔ)對(duì)象屬性,如user:1001{name:"張三",age:20})、List(消息隊(duì)列,LPUSH/RPOP實(shí)現(xiàn)先進(jìn)先出)、Set(去重集合,如共同好友計(jì)算SINTER)、ZSet(有序集合,帶score排序,如排行榜)。持久化機(jī)制:RDB(定時(shí)快照,通過(guò)bgsave后臺(tái)進(jìn)程提供dump.rdb,適合全量恢復(fù))、AOF(記錄所有寫操作,通過(guò)appendonly.aof文件重放恢復(fù),支持每秒/每次寫/不持久化三種策略,數(shù)據(jù)更安全但文件更大)。緩存穿透(查詢不存在的key,穿透到數(shù)據(jù)庫(kù))解決方案:緩存空值(設(shè)置短過(guò)期時(shí)間)、布隆過(guò)濾器(預(yù)存所有可能的key,查詢前過(guò)濾);緩存擊穿(熱點(diǎn)key過(guò)期,大量請(qǐng)求打到數(shù)據(jù)庫(kù))解決方案:互斥鎖(查詢時(shí)加鎖,僅一個(gè)線程加載數(shù)據(jù))、永不過(guò)期(邏輯過(guò)期,后臺(tái)異步更新);緩存雪崩(大量key同時(shí)過(guò)期)解決方案:分散過(guò)期時(shí)間(加隨機(jī)值)、多級(jí)緩存(本地緩存+Redis)、限流降級(jí)(保護(hù)數(shù)據(jù)庫(kù))。框架原理與實(shí)踐SpringIOC(控制反轉(zhuǎn))通過(guò)容器管理對(duì)象的創(chuàng)建和依賴注入,將對(duì)象間的依賴關(guān)系從代碼中解耦。依賴注入方式包括構(gòu)造器注入(強(qiáng)制依賴,避免空指針)、setter注入(可選依賴,靈活)、字段注入(@Autowired直接注入,簡(jiǎn)化代碼但可能隱藏依賴)。IOC容器啟動(dòng)流程:加載配置(XML/注解)、解析Bean定義(@Component/@Bean)、實(shí)例化Bean(反射創(chuàng)建對(duì)象)、填充依賴(根據(jù)@Autowired/@Resource注入)、執(zhí)行初始化方法(@PostConstruct)、注冊(cè)到BeanFactory中。SpringAOP(面向切面)通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn),將日志、事務(wù)、權(quán)限等非業(yè)務(wù)邏輯封裝為切面(@Aspect),通過(guò)切點(diǎn)(@Pointcut定義匹配規(guī)則)和通知(@Before/@After/@Around等)織入目標(biāo)方法。JDK動(dòng)態(tài)代理基于接口,通過(guò)InvocationHandler攔截方法調(diào)用;CGLIB代理基于繼承,通過(guò)MethodInterceptor提供子類覆蓋方法,適用于無(wú)接口的類。AOP的應(yīng)用場(chǎng)景包括事務(wù)管理(@Transactional標(biāo)記方法,通過(guò)@Around通知開(kāi)啟/提交/回滾事務(wù))、性能監(jiān)控(@Around記錄方法執(zhí)行時(shí)間)、日志記錄(@Before獲取入?yún)?,@AfterReturning記錄結(jié)果)。SpringBoot自動(dòng)配置通過(guò)@EnableAutoConfiguration注解觸發(fā),掃描classpath下META-INF/spring.factories文件,加載所有自動(dòng)配置類(如DataSourceAutoConfiguration、RedisAutoConfiguration)。每個(gè)自動(dòng)配置類通過(guò)@Conditional注解(@ConditionalOnClass存在指定類,@ConditionalOnMissingBean不存在用戶自定義Bean)判斷是否生效,例如只有存在HikariCP類且用戶未自定義DataSource時(shí),才會(huì)自動(dòng)配置HikariDataSource。Starter(如spring-boot-starter-web)封裝了依賴和自動(dòng)配置,用戶只需引入依賴即可快速集成功能。MyBatis工作流程:讀取mybatis-config.xml配置(數(shù)據(jù)源、事務(wù)管理器、映射器位置),通過(guò)SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory;SqlSessionFactory提供SqlSession(操作數(shù)據(jù)庫(kù)的會(huì)話);SqlSession獲取Mapper接口代理對(duì)象(通過(guò)JDK動(dòng)態(tài)代理,將接口方法映射到XML或注解中的SQL);執(zhí)行SQL(如selectList調(diào)用,通過(guò)ParameterHandler處理參數(shù),StatementHandler執(zhí)行SQL,ResultSetHandler封裝結(jié)果);最后關(guān)閉SqlSession。{}表示預(yù)編譯參數(shù)(防止SQL注入),${}表示字符串拼接(用于表名/列名動(dòng)態(tài)替換)。動(dòng)態(tài)SQL通過(guò)<iftest="condition">(條件判斷)、<where>(自動(dòng)添加where并去除多余and/or)、<foreachcollection="list"item="item">(遍歷集合)等標(biāo)簽實(shí)現(xiàn)靈活SQL拼接。一級(jí)緩存是SqlSession級(jí)別的緩存(默認(rèn)開(kāi)啟),相同查詢?cè)谕籗ession內(nèi)直接返回;二級(jí)緩存是Mapper級(jí)別的緩存(需配置<cache/>),多個(gè)Session共享,需注意緩存一致性(更新操作會(huì)清空緩存)。微服務(wù)與分布式SpringCloud核心組件:Nacos(替代Eureka,支持服務(wù)注冊(cè)發(fā)現(xiàn)和配置管理,提供AP/CP模式)、Ribbon(客戶端負(fù)載均衡,支持輪詢、隨機(jī)等策略,已被SpringCloudLoadBalancer替代)、OpenFeign(聲明式HTTP客戶端,基于注解定義接口,自動(dòng)實(shí)現(xiàn)服務(wù)調(diào)用,內(nèi)置負(fù)載均衡)、Resilience4J(輕量級(jí)熔斷降級(jí),支持熔斷、限流、重試,替代Hystrix)、SpringCloudGateway(API網(wǎng)關(guān),支持路由斷言(如Path=/)、過(guò)濾器(全局/局部,如限流、日志))。分布式事務(wù)解決方案:2PC(兩階段提交,協(xié)調(diào)者先詢問(wèn)各參與者是否準(zhǔn)備好,再統(tǒng)一提交/回滾,強(qiáng)一致性但性能差,適合低并發(fā)場(chǎng)景);TCC(Try-Confirm-Cancel,Try階段預(yù)留資源,Confirm階段提交,Cancel階段回滾,需業(yè)務(wù)實(shí)現(xiàn)三個(gè)方法,適合高并發(fā)且資源可補(bǔ)償場(chǎng)景);本地消息表(業(yè)務(wù)操作與消息記錄在同一事務(wù),消息服務(wù)異步處理消息,通過(guò)定時(shí)任務(wù)重試,如支付寶轉(zhuǎn)賬);Seata(阿里開(kāi)源,支持AT(自動(dòng)補(bǔ)償)、TCC、SAGA模式,通過(guò)全局事務(wù)ID協(xié)調(diào)各分支事務(wù))。CAP理論指分布式系統(tǒng)中一致性(C,所有節(jié)點(diǎn)數(shù)據(jù)一致)、可用性(A,每次請(qǐng)求都能得到響應(yīng))、分區(qū)容錯(cuò)性(P,網(wǎng)絡(luò)分區(qū)時(shí)系統(tǒng)仍可用)無(wú)法同時(shí)滿足,需權(quán)衡。BASE理論是對(duì)CAP的妥協(xié),支持基本可用(部分時(shí)間可用)、軟狀態(tài)(允許數(shù)據(jù)暫時(shí)不一致)、最終一致性(經(jīng)過(guò)一段時(shí)間后數(shù)據(jù)一致),適合大多數(shù)分布式場(chǎng)景(如電商訂單狀態(tài)同步)。設(shè)計(jì)模式與項(xiàng)目實(shí)踐單例模式常見(jiàn)實(shí)現(xiàn):餓漢式(類加載時(shí)初始化,線程安全但可能浪費(fèi)資源,如publicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}});懶漢式(首次調(diào)用時(shí)初始化,線程不安全,需加synchronized但影響性能);雙重檢查鎖(DCL,兩次檢查instance是否為null,減少鎖競(jìng)爭(zhēng),需volatile防止指令重排,如publicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();}}}returninstance;}});靜態(tài)內(nèi)部類(利用類加載機(jī)制,線程安全且懶加載,如publicclas

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論