java遞歸簡單例子 java遞歸查詢所有子節(jié)點
- 夕逆IT
- 數(shù)據(jù)庫
- 2023-08-13
- 188
大家好,今天來為大家解答java遞歸簡單例子這個問題的一些問題點,包括java遞歸查詢所有子節(jié)點也一樣很多人還不知道,因此呢,今天就來為大家分析分析,現(xiàn)在讓我們一起來看...
大家好,今天來為大家解答java遞歸簡單例子這個問題的一些問題點,包括java遞歸查詢所有子節(jié)點也一樣很多人還不知道,因此呢,今天就來為大家分析分析,現(xiàn)在讓我們一起來看看吧!如果解決了您的問題,還望您關(guān)注下本站哦,謝謝~
如何用java打開一個本地文件
publicstaticvoidgetFileSize(Stringpath){
//傳入文件路徑
Filefile=newFile(path);
//測試此文件是否存在
if(file.exists()){
//如果是文件夾
//這里只檢測了文件夾中第一層如果有需要可以繼續(xù)遞歸檢測
if(file.isDirectory()){
intsize=0;
for(Filezf:file.listFiles()){
if(zf.isDirectory())continue;
size+=zf.length();
}
System.out.println("文件夾"+file.getName()+"Size:"+(size/1024f)+"kb");
}else{
System.out.println(file.getName()+"Size:"+(file.length()/1024f)+"kb");
}
//如果文件不存在
}else{
System.out.println("此文件不存在");
}
}
Java中的冒泡排序是如何實現(xiàn)的
謝邀。冒泡排序還是比較好理解的,主要是要理解其核心思想。如果從小到大排序,每一輪排序就找出未完成排序序列中的最大值,然后放在最后,直到排序完成為止。
(冒泡排序過程及結(jié)果展示)
一般而言,冒泡排序有以下步驟:
設(shè)數(shù)組長度為N,比較前后相鄰的兩個數(shù)據(jù),如果前值大于后值,就將這兩個值交換。
重復(fù)以上步驟,從第0個數(shù)據(jù)到N-1個數(shù)據(jù)進(jìn)行遍歷,最大值就會沉在下方。
以上就是冒泡排序的基本思想,按照這個定義很快就能寫出代碼:
測試代碼:
運行結(jié)果如下:
0,1,1,2,3,3,4,7,8,9,12,22,65當(dāng)然,如果序列本身有一部分是有序序列,或者本來就排序已經(jīng)完成,那么遍歷會帶來不少開銷,可以設(shè)置一個布爾值進(jìn)行開關(guān)操作。如果已經(jīng)完成排序,那么中止遍歷,如果未完成,繼續(xù)遍歷。
如果你對學(xué)習(xí)人工智能和科技新聞感興趣,可以訂閱我的頭條號,我會在這里發(fā)布所有與算法、機器學(xué)習(xí)以及深度學(xué)習(xí)有關(guān)的有趣文章。偶爾也回答有趣的問題,有問題可隨時在評論區(qū)回復(fù)和討論,看到即回。
(碼字不易,若文章對你幫助可點贊支持~)
如何才能成為java架構(gòu)師我為大家來分析一下
一:編程基礎(chǔ)
不管是C還是C++,不管是Java還是PHP,想成為一名合格的程序員,基本的數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)還是要有的。下面幾篇文章從思想到實現(xiàn),為你梳理出常用的數(shù)據(jù)結(jié)構(gòu)和經(jīng)典算法。
1-1常用數(shù)據(jù)結(jié)構(gòu)
數(shù)組、鏈表、堆、棧、隊列、Hash表、二叉樹等
1-2算法思想
算法時間復(fù)雜度和空間復(fù)雜度的分析計算
算法思想:遞推、遞歸、窮舉、貪心、分治、動態(tài)規(guī)劃、迭代、分枝界限
1-3經(jīng)典算法
經(jīng)典排序:插入排序、冒泡排序、快排(分劃交換排序)、直接選擇排序、堆排序、合并排序
經(jīng)典查找:順序查找、二分查找、二叉排序樹查找
1-4高級數(shù)據(jù)結(jié)構(gòu)
B+/B-數(shù)、紅黑樹、圖等
1-5高級算法
圖的深度優(yōu)先搜索、圖的廣度優(yōu)先搜索、拓?fù)渑判?、Dijkstra算法(單源最短路徑)、霍夫曼編碼、輾轉(zhuǎn)相除法、最小生成樹等
二:Java語言基礎(chǔ)
誕生不過二十余年的Java語言憑借其跨平臺、面向?qū)ο蟆⑦m合于分布式計算的特性,廣泛應(yīng)用于Web網(wǎng)站、移動設(shè)備、桌面應(yīng)用中,并且已經(jīng)連續(xù)多年穩(wěn)居TOBIE編程語言排行榜前列,最近更是登上冠軍寶座。Java有哪些優(yōu)秀而又與眾不同的地方首先一定要清楚。
2-1基礎(chǔ)語法
Java語法格式,常量和變量,變量的作用域,方法和方法的重載,運算符,程序流程控制,各種基本數(shù)據(jù)類型及包裝類
2-2重要:集合類
Collection以及各種List、Set、Queue、Map的實現(xiàn)以及集成關(guān)系,實現(xiàn)原理
Collections和Arrays
2-3其他JavaAPI
String和StringBuffer,System和Runtime類,Date和DateFomat類
java.lang包
java.util包(集合類體系、規(guī)則表達(dá)式、zip,以及時間、隨機數(shù)、屬性、資源和Timer等)
java.math包
java.net包
java.text包(各種格式化類等)
java.security包
2-4面向?qū)ο?、面向接?/p>
對象的三大特性:封裝、繼承和多態(tài),優(yōu)缺點
如何設(shè)計類,類的設(shè)計原則
this關(guān)鍵字,final關(guān)鍵字,static關(guān)鍵字
對象的實例化過程
方法的重寫和重載;方法和方法的參數(shù)傳遞過程
構(gòu)造函數(shù)
內(nèi)部類,抽象類,接口
對象的多態(tài)性(子類和父類之間的轉(zhuǎn)換、父類紙箱子類的引用),抽象類和接口在多態(tài)中的應(yīng)用
2-5JVM內(nèi)存模型、垃圾回收
2-6關(guān)于異常
Throwable/Error/Exception,CheckedExceptionvs.UncheckedException,異常的捕捉和拋出,異常捕捉的原則,finally的使用
2-7多線程
線程和進(jìn)程的概念
如何在程序中創(chuàng)建多線程,線程安全問題,線程之間的通訊
線程的同步
死鎖問題的剖析
線程池
2-8IO
java.io包,理解IO體系的基于管道模型的設(shè)計思路以及常用IO類的特性和使用場合。
File及相關(guān)類,字節(jié)流InputStream和OutputStream,字符流Reader和Writer,以及相應(yīng)緩沖流和管道流,字節(jié)和字符的轉(zhuǎn)化流,包裝流,以及常用包裝類使用
分析IO性能
2-9XML
熟悉SAX、DOM以及JDOM的優(yōu)缺點并且能夠使用其中的一種完成XML的解析及內(nèi)容處理;這幾種解析方法的原理
2-10一些高級特性
反射、代理、泛型、枚舉、Java正則表達(dá)式
2-11網(wǎng)絡(luò)編程
網(wǎng)絡(luò)通信協(xié)議原理及適用場景,Socket編程,WEB服務(wù)器的工作原理
2-11JDK1.5、JDK1.6、JDK1.7、JDK1.8每個版本都比前面一個版本添加了哪些新特性,進(jìn)行了哪些提升
三:數(shù)據(jù)庫相關(guān)
前面說到了數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫簡單來說就像是電子化的檔案柜,是按照一定的數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫。
3-1理論基礎(chǔ)
數(shù)據(jù)庫設(shè)計原則和范式
事務(wù)(ACID、工作原理、事務(wù)的隔離級別、鎖、事務(wù)的傳播機制)
3-2各種數(shù)據(jù)庫優(yōu)缺點、使用場景分析
MySQL/SQLServer/Oracle以及各種NoSQL(Redis、MongoDB、Memcached、HBase、CouchDB等)
3-2SQL語句
數(shù)據(jù)庫創(chuàng)建,權(quán)限分配,表的創(chuàng)建,增刪改查,連接,子查詢
觸發(fā)器、存儲過程、事務(wù)控制
3-3優(yōu)化
索引原理及適用,大表查詢優(yōu)化,多表連接查詢優(yōu)化,子查詢優(yōu)化等
3-4分庫、分表、備份、遷移
導(dǎo)入、導(dǎo)出,分庫、分表,冷備熱備,主從備份、雙機熱備、縱向擴(kuò)展、橫向擴(kuò)展
3-5JDBC
JDBCConnection、Statement、PreparedStatement、CallableStatement、ResultSet等不同類的使用
連接池(配置使用、實現(xiàn)原理)
ORM,DAO
四:JavaWeb核心技術(shù)(包括部分前端)
Html5/Css/JS原生/jQuery
Ajax(跨域等)
JSP/JavaBean/Servlet/EL/JSTL/TabLib
JSF
JSON
EJB
序列化和反序列化
規(guī)則引擎
搜索引擎
模板引擎
緩存
身份認(rèn)證
測試
集群
持久化
生成靜態(tài)頁技術(shù)
高性能
安全
事務(wù)JTA
其他需要了解的,如:管理JMX、安全JCCA/JAAS、集成JCA、通信JNDI/JMS/JavaMain/JAF、SSI技術(shù)
五、主流框架及工具
Struts1/Struts2
Spring(IoC、AOP等),SpringMVC
持久化:Hibernate/MyBatis
日志:Log4j
單元測試:JUnit
消息隊列:ActiveMQ、RabbitMQ等
負(fù)載均衡:Nginx/HaProxy
Web服務(wù)器:Tomcat、JBoss、Jetty、Resin、WebLogic、WebSphere等
通信:WebService(cxf的soap、restful協(xié)議)
緩存:Redis、Memcached
工作流:Activity、JBPM
搜索引擎:lucene,基于lucene封裝的solr
模板引擎:Velocity、FreeMaker
大數(shù)據(jù):Hadoop(HDFS和MapReduce)
構(gòu)建工具:Ant/Maven
六、JavaWeb系統(tǒng)設(shè)計與架構(gòu)
Java設(shè)計模式
JAVA與UML建模
面向服務(wù)架構(gòu):SOA/SCA/ESB/OSGI/EAI,微服務(wù)
工作2年還是只會增刪改查,Java程序員如何進(jìn)階
做JAVA開發(fā)的三年一個坎,你應(yīng)該慶幸你還有一年的時間可以用來提升,讓自己不要后悔!
不過話說回來,在平時的工作中其實90%的工作量都是增刪改查,或者是對增刪改查的改進(jìn),那些所謂的高并發(fā),多線程,高可用系統(tǒng),分布式系統(tǒng),負(fù)載均衡,緩存,數(shù)據(jù)庫讀寫分離,分庫分表等等全部都是圍繞增刪改查來做改進(jìn)的!
比如說緩存是因為數(shù)據(jù)庫的讀寫壓力大的時候,為增加讀寫效率而引進(jìn)的,使用緩存的內(nèi)存讀寫代替了數(shù)據(jù)庫的硬盤讀寫!
比如說數(shù)據(jù)庫的讀寫分離或者分庫分表都是在單點數(shù)據(jù)庫的壓力過大,性能低的時候引入的無論架構(gòu)怎么設(shè)計都是為了得到更好的讀寫效率!
再比如說,高可用,分布式都為了避免單點服務(wù)出現(xiàn)異常,導(dǎo)致讀寫服務(wù)不可用,從而引入的集群部署或者分布式部署!
由此可見,增刪改查是我們最核心的功能,只不過我們引入了其他的架構(gòu),完善我們的功能,讓我們的增刪改查更加的快速!
在實際的開發(fā)過程中,要多思考系統(tǒng)的瓶頸在哪?增刪改查的壓力在哪?怎么改進(jìn)?不要網(wǎng)上搜一堆亂七八糟的,覺得很屌的東西,學(xué)完之后發(fā)現(xiàn)他根本不知道是做什么的,一切的開發(fā)圍繞我們的業(yè)務(wù)來展開,然后才是增強體驗性,搭建快速穩(wěn)定的架構(gòu)!
那我們應(yīng)該怎么來進(jìn)階呢?
1,大局觀:不要只是盯著自己開發(fā)的功能,要知道整個系統(tǒng)的整個架構(gòu)是什么?使用什么技術(shù)?服務(wù)之間怎么通信?整個服務(wù)的性能怎么優(yōu)化?全面的來考慮,不然晉升的肯定不會是你!
2,不要一心撲在公司的工作上,要有自己的時間去學(xué)習(xí)最新的技術(shù),去拓寬自己的知識,明白別的公司用的是什么?主流開發(fā)技術(shù)開發(fā)是什么?
3,一定要多總結(jié),不管是平時的工作中或者學(xué)習(xí)中都能學(xué)到很多有用的東西,要把它轉(zhuǎn)化成demo記錄在自己的技術(shù)文檔里面,方便以后自己查閱和使用!不是做過就算了,一定要記錄下來!
我晚上加班的時候,除非有急事,不然都學(xué)習(xí)自己的!然后才能感覺自己有很大的提升!我自己記錄了很多做過的,學(xué)過的JAVA相關(guān)技術(shù),以后會一直分享,需要的話請關(guān)注!
如何將java中的遞歸與流相結(jié)合
沒懂你的意思
尾遞歸究竟是好是壞
無論什么遞歸,在實際工作都不建議使用。但是遞歸這種思想,在數(shù)據(jù)結(jié)構(gòu)與算法相關(guān)的課程中還是很重要的,尤其是可以優(yōu)化這個思想,解決一些迭代問題。
普通遞歸大多數(shù)人了解普通遞歸,都是在計算機相關(guān)專業(yè)經(jīng)典本科書籍譚浩強的《C語言程序設(shè)計》中,但是求n!階乘其實用遞歸是不明智的,因為除了速度慢,使用遞歸還無法預(yù)測計算過程中內(nèi)存的使用情況,如果發(fā)生了OOM就會影響整個項目。
遞歸的百度百科解釋是程序調(diào)用自身的編程技巧,也就是說在程序中調(diào)用了自己,如下圖,可以看到在shi_er這個函數(shù)中,又調(diào)用shi_er自身,從而達(dá)到了十進(jìn)制轉(zhuǎn)換二進(jìn)制的目的。遞歸的能力在于用有限的語句來定義對象的無限集合。一般來說,構(gòu)成遞歸需具備的條件:
1.子問題須與原始問題為同樣的事,且更為簡單;
2.不能無限制地調(diào)用本身,須有個出口,化簡為非遞歸狀況處理。
但是,如果沒有滿足上述條件,又輕易調(diào)用遞歸,就會有無限死循環(huán)的風(fēng)險,這也是我么在實際工作中不推薦使用遞歸的的原因。
尾遞歸從上面的代碼我們可以看到,普通遞歸是從初始狀態(tài)開始計算,而尾遞歸是從最后開始計算,函數(shù)調(diào)用是出現(xiàn)在函數(shù)的尾部,直接讓被調(diào)用的函數(shù)返回時越過調(diào)用者,返回到調(diào)用者的調(diào)用者去。尾遞歸是極其重要的,因為用尾遞歸的話,可以避免對函數(shù)對堆棧和內(nèi)存的無法估計的消耗,無須保存中間函數(shù)的堆棧。
再舉一個用尾遞歸實現(xiàn)斐波那契數(shù)列的例子
intFibonacciTailRecursive(intn,intret1,intret2)
{
if(n==0)
returnret1;
returnFibonacciTailRecursive(n-1,ret2,ret1+ret2);
}
綜上,尾遞歸能夠比普通遞歸更加安全,但是總的來說,基于我的經(jīng)驗,實際工作中并不推薦使用遞歸。如果能夠?qū)δ阌兴鶐椭?,歡迎點贊留言。
我是蘇蘇思量,來自BAT的Java開發(fā)工程師,每日分享科技類見聞,歡迎關(guān)注我,與我共同進(jìn)步。
END,本文到此結(jié)束,如果可以幫助到大家,還望關(guān)注本站哦!
本文鏈接:http:///su/2001.html