日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java 單鏈表數據結構的增刪改查教程

瀏覽:28日期:2022-08-22 11:39:31

我就廢話不多說了,大家還是直接看代碼吧~

package 鏈表; /** * *1)單鏈表的插入、刪除、查找操作; * 2)鏈表中存儲的是int類型的數據; **/public class SinglyLinkedList { private Node head = null; //查找操作 public Node findByValue(int value){ Node p = head; //從鏈表頭部開始查找 while(p.next != null && p.data != value){//如果數據不相等并且下一個節點不為null,繼續查找 p = p.next; } return p; } //通過index查找 public Node findByIndex(int index){ Node p = head; //從鏈表頭部開始查找 int count = 0; //指針計數器 while(p.next != null && index != count){ //當下個節點不為null,并且計數器不等于index的時候繼續查找 p = p.next; count++; } return p; } //無頭部節點(哨兵),表頭部插入一個值,這種操作和輸入的順序相反,逆序 public void insertToHead(int value){ Node newNode = new Node(value,null); insertToHead(newNode); } //無頭部節點(哨兵),表頭部插入新節點,這種操作和輸入的順序相反,逆序 public void insertToHead(Node newNode){ if(head == null){ head = newNode; }else{ newNode.next = head; head = newNode; } } //鏈表尾部插入,按順序插入,時間復雜度平均為O(n),這個可以優化,定義多一個尾部節點,不存儲任何數據,時間復雜度未O(1) public void insertTail(int value){ Node newNode = new Node(value,null); if(head == null){//鏈表為空 head = newNode; }else{//直接從鏈表頭開始找,知道找到鏈尾節點 Node curr = head; while(curr.next != null){curr = curr.next; } curr.next = newNode; } } //在指定節點后面插入新節點,直接在這個節點后面斷開連接,直接插入 public void insertAfter(Node p,int value){ Node newNode = new Node(value,null); insertAfter(p,newNode); } //在指定節點后面插入新節點,直接在這個節點后面斷開連接,直接插入 public void insertAfter(Node p,Node newNode){ if(p == null){ return; } newNode.next = p.next; p.next = newNode; } //在指定節點前面插入新節點 public void insertBefore(Node p,int value){ Node newNode = new Node(value,null); insertBefore(p,newNode); } //在指定節點前面插入新節點 public void insertBefore(Node p,Node newNode){ if(p == null){ return; } if(p == head){//如果指定節點是頭節點 insertToHead(p); return; } Node curr = head;//當前節點,(查找指定節點p的前一個節點,當curr的下個節點等于指定節點時候,curr就是指定節點的前一個節點 while(curr != null && curr.next != p){//當前節點不為null,當前節點的下個節點不等于指點節點,則繼續查找 curr = curr.next; } if(curr == null){//未找到指定節點p return; } newNode.next = p; curr.next = newNode; } //刪除指定節點 public void deleteByNode(Node p){ if(p == null || p == head){ return; } Node curr = head;//從鏈頭開始查找,curr是當前節點,查找指定節點p的前一個節點,當curr的下個節點等于指定節點時候,curr就是指定節點的前一個節點 while(curr != null && curr.next != p){//當前節點不為null并且,下個節點不等于指定節點時候繼續查找 curr = curr.next; } if(curr == null){//未找到指定節點 return; } curr.next = curr.next.next; } //刪除指定值 public void deleteByValue(int value){ if(head == null){ return; } Node curr = head;//當前節點,從鏈表頭開始查找 Node pre = null;//當前節點的前一個節點,找查找指定的過程,要不斷地保存當前節點的前一個節點 while(curr != null && curr.data != value){ pre = curr; curr = curr.next; } if(curr == null){//未找到指定的值 return ; } if(pre == null){//鏈表頭數據就是指定的值 head = head.next; }else{ pre.next = pre.next.next;//或者pre.next = curr.next; } } //打印鏈表 public void printAll() { Node curr = head; while(curr != null){ System.out.println(curr.data); curr = curr.next; } } //單鏈表數據結構類,以存儲int類型數據為例 public class Node{ private int data; private Node next; public Node(int data, Node next) { this.data = data; this.next = next; } public int getData(){ return data; } } public static void main(String[]args) { 老師代碼.linkedlist06.SinglyLinkedList link = new 老師代碼.linkedlist06.SinglyLinkedList(); System.out.println('hello'); int data[] = {1, 2, 5, 3, 1}; for (int i = 0; i < data.length; i++) { //link.insertToHead(data[i]); link.insertTail(data[i]); } System.out.println('打印原始:'); link.printAll(); }}

補充知識:Hbase+Spring Aop 配置Hbase鏈接的開啟和關閉

Spring 提供了HbaseTemplate 對Hbase數據庫的常規操作進行了簡單的封裝。

get,find方法分別對應了單行數據查詢和list查詢。

這些查詢都要開啟和關閉Hbase數據庫鏈接

@Override public <T> T execute(String tableName, TableCallback<T> action) { Assert.notNull(action, 'Callback object must not be null'); Assert.notNull(tableName, 'No table specified'); HTableInterface table = getTable(tableName); try { boolean previousFlushSetting = applyFlushSetting(table); T result = action.doInTable(table); flushIfNecessary(table, previousFlushSetting); return result; } catch (Throwable th) { if (th instanceof Error) { throw ((Error) th); } if (th instanceof RuntimeException) { throw ((RuntimeException) th); } throw convertHbaseAccessException((Exception) th); } finally { releaseTable(tableName, table); } } private HTableInterface getTable(String tableName) { return HbaseUtils.getHTable(tableName, getConfiguration(), getCharset(), getTableFactory()); } private void releaseTable(String tableName, HTableInterface table) { HbaseUtils.releaseTable(tableName, table, getTableFactory()); }HTableInterface table = getTable(tableName); 獲取數據庫鏈接releaseTable(tableName, table); 釋放鏈接

在HbaseUtils.getHTable:

if (HbaseSynchronizationManager.hasResource(tableName)) { return (HTable) HbaseSynchronizationManager.getResource(tableName); }

看見這個大家應該都有是曾相似的感覺吧,這和Spring事務管理核心類TransactionSynchronizationManager很像,而實現也基本一樣

都是通過ThreadLocal將鏈接保存到當前線程中。

我們要做的就是要像Srping 事務配置一樣,在進入service方法時通過Aop機制將tableNames對應的鏈接加入到線程中。

Spring提供了這個Aop方法攔截器 HbaseInterceptor:

public Object invoke(MethodInvocation methodInvocation) throws Throwable { Set<String> boundTables = new LinkedHashSet<String>(); for (String tableName : tableNames) { if (!HbaseSynchronizationManager.hasResource(tableName)) { boundTables.add(tableName); HTableInterface table = HbaseUtils.getHTable(tableName, getConfiguration(), getCharset(), getTableFactory()); HbaseSynchronizationManager.bindResource(tableName, table); } } try { Object retVal = methodInvocation.proceed(); return retVal; } catch (Exception ex) { if (this.exceptionConversionEnabled) { throw convertHBaseException(ex); } else { throw ex; } } finally { for (String tableName : boundTables) { HTableInterface table = (HTableInterface) HbaseSynchronizationManager.unbindResourceIfPossible(tableName); if (table != null) { HbaseUtils.releaseTable(tableName, table); } else { log.warn('Table [' + tableName + '] unbound from the thread by somebody else; cannot guarantee proper clean-up'); } } } }

很明顯在

Object retVal = methodInvocation.proceed();

也就是我們的service方法執行前去獲取Hbase鏈接并通過HbaseSynchronizationManager.bindResource(tableName, table);綁定到線程中。

finally中releaseTable。

Aop配置如下:

<!-- 自動掃描beans+注解功能注冊 --> <context:component-scan base-package='com.xxx.xxx' /> <!-- 根據配置文件生成hadoopConfiguration --> <hdp:configuration resources='classpath:/hbase-site.xml' /> <!-- hadoopConfiguration == hdp:configuration --><!-- <hdp:hbase-configuration configuration-ref='hadoopConfiguration' /> --> <bean class='org.springframework.data.hadoop.hbase.HbaseTemplate'> <!-- hadoopConfiguration == hdp:configuration --> <property name='configuration' ref='hadoopConfiguration' /> </bean> <bean class='org.springframework.data.hadoop.hbase.HbaseInterceptor'> <property name='configuration' ref='hadoopConfiguration' /> <property name='tableNames'> <list> <value>table_name1</value> <value>table_name2</value> </list> </property> </bean> <!-- 使用aop增強, 織入hbase數據庫鏈接的開啟和關閉 --> <aop:config> <aop:pointcut expression='execution(* com.xxx.xxx.*.service..*(..))' /> <aop:advisor advice-ref='hbaseInterceptor' pointcut-ref='allManagerMethod' /> </aop:config>

Hbase的數據庫表鏈接跟傳統數據庫不太一樣, 開啟鏈接必需要表名, 所以HbaseInterceptor中必需設置private String[] tableNames;

在進入servcie方法時,tableNames中對應的表鏈接都會開啟。這必然會造成浪費,因為并不是每個service都會把表都查詢一遍。

以上這篇Java 單鏈表數據結構的增刪改查教程就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本美女一区| 鲁鲁在线中文| 欧洲亚洲一区二区三区| 天海翼精品一区二区三区| 久久精品国产网站| 性色av一区二区怡红| 久久91导航| 精品美女在线视频| 欧美精品一卡| 国产高清一区| 国产日韩一区二区三区在线播放| 99在线精品免费视频九九视| 欧美日韩在线观看首页| 国产精品第一国产精品| 国产亚洲久久| 日韩精品a在线观看91| 日韩中文字幕| 国产乱人伦精品一区| 亚洲a成人v| 日韩不卡一区二区| 国产精品免费不| 免费在线播放第一区高清av| 99视频+国产日韩欧美| 亚洲欧美日韩在线观看a三区| 亚洲一级特黄| 欧美国产91| 亚洲日本欧美| 91精品国产一区二区在线观看 | 中文字幕av一区二区三区四区| 亚洲在线免费| 亚洲精品一二三区区别| 在线观看一区| 久久av中文| 欧美手机在线| 美女久久99| 91成人超碰| 视频一区日韩| 国产精品激情| 今天的高清视频免费播放成人| 日韩精品午夜视频| 天堂中文av在线资源库| 一本色道精品久久一区二区三区| 国产伦理一区| 美女网站久久| sm久久捆绑调教精品一区| 午夜欧美精品久久久久久久| 国产一卡不卡| 男人天堂欧美日韩| 高清不卡亚洲| 风间由美中文字幕在线看视频国产欧美| 色爱av综合网| 国产欧美三级| 久久亚洲专区| 国产另类在线| 欧美va天堂在线| 久久伊人国产| 中文字幕一区二区三区四区久久 | 蜜臀国产一区| 日本在线一区二区三区| 日韩深夜视频| 久久av网址| 欧美日韩1区2区3区| japanese国产精品| 久久久久黄色| 久久xxx视频| 欧美日韩91| 日韩精品电影一区亚洲| 亚洲国产一区二区三区在线播放 | 国产精品成人一区二区网站软件| 亚洲激情社区| 亚洲播播91| 国产精品videossex| 国产亚洲人成a在线v网站| 午夜国产一区二区| 久久www成人_看片免费不卡| 亚洲免费激情| 美女少妇全过程你懂的久久| 欧美成人基地| 国产一区二区三区黄网站| www.九色在线| 久久一级电影| 99香蕉国产精品偷在线观看| 一区二区日韩免费看| 免费欧美日韩| 日韩影院免费视频| 五月激激激综合网色播| 五月激激激综合网色播| 午夜宅男久久久| 亚洲欧美在线专区| 国产精品天天看天天狠| 日韩中文影院| 欧美日韩国产传媒| 免费成人在线影院| 蜜桃久久精品一区二区| 日韩激情av在线| 免费观看亚洲天堂| 免费看av不卡| 激情偷拍久久| 亚洲免费毛片| 精品亚洲a∨| 香蕉视频成人在线观看| 老司机精品视频网| 亚洲尤物av| 日韩av有码| 亚洲精品免费观看| 久久精品国产99国产| 伊人成人网在线看| 麻豆国产精品一区二区三区| 欧美日韩一区二区高清| 欧美日韩一区二区三区视频播放| 日韩精品视频一区二区三区| 久久网站免费观看| 久久亚洲黄色| 日韩欧美2区| 天堂av在线| 另类小说一区二区三区| 中文不卡在线| 黄色日韩在线| 日韩美女一区二区三区在线观看| 国产欧美一区| 日韩中出av| 亚洲免费毛片| 亚洲香蕉视频| 成人久久一区| 超碰99在线| 日韩精品午夜视频| 亚洲最新av| 在线看片日韩| 日韩高清一区在线 | 青青伊人久久| 另类激情亚洲| 亚洲免费在线| 老司机精品久久| 视频在线观看一区| 麻豆精品91| 欧美日韩一区二区综合| 欧美激情五月| 麻豆成人91精品二区三区| 日韩高清电影免费| 亚洲91网站| 欧美亚洲福利| 久久久国产精品网站| 美女久久99| 久久久久久久久99精品大| 婷婷成人在线| 美女精品在线观看| 日韩在线一区二区| 日韩一区二区三区精品视频第3页| 亚洲美女久久| 精品亚洲自拍| 欧美极品中文字幕| 国产极品模特精品一二| 精品久久不卡| 久久精品亚洲欧美日韩精品中文字幕| 久久久影院免费| 日本不卡视频一二三区| 国产精品va| 久久成人福利| 婷婷综合五月| 欧美久久一区二区三区| 精品三级av| 亚洲精品欧美| 亚洲四虎影院| 午夜在线精品偷拍| 精品无人区麻豆乱码久久久| 天堂√中文最新版在线| 美女91精品| 久久久久美女| 久久亚洲不卡| 日韩电影在线视频| 香蕉久久一区| 好看不卡的中文字幕| 精品三级国产| 欧美日韩亚洲一区三区| 亚洲电影在线| 精品国产乱码久久久| 视频精品一区二区| 久久精品二区三区| 蜜桃精品视频| 国产另类在线| 日本a口亚洲| 伊人成人在线视频| 久久中文字幕一区二区| 亚洲伊人影院| 精品一区亚洲| 99久久久国产精品美女| 精品一区二区三区亚洲| 亚洲精品在线二区| 欧美特黄一级大片| 老牛影视精品| 成人污污视频| 久久精品人人| 久久精品国产久精国产爱| 蜜桃视频在线观看一区二区| 国内精品麻豆美女在线播放视频| 日本午夜精品一区二区三区电影 | 激情欧美一区| 不卡一区综合视频| 色爱av综合网| 99国产精品99久久久久久粉嫩|