Web Service筆記(五):CXF開發RESTful風格的Web Service
前言:
4、可以使用瀏覽器的工具除錯:如 Firefox 的RESTClient 和chrome的REST Console。
一、配置Spring的配置檔案
1、需要引入新的 jar 包。
2、配置 applicationContext-server.xml 檔案。使用 jaxrs:server ,記得引入jaxrs 的schema 約束。
1)address:為地址,如 http://localhost:8080/Java_WS_Server/rest/
2)serviceBeans:暴露的ws服務類。也可以使用“#beanId”,引入。
二、Restful 服務類需要實現jax_rs規範。就像ws的服務類需要實現jax_ws規範一樣。<!-- REST WebService 介面--> <jaxrs:server id="restfulServer" address="/rest"> <jaxrs:inInterceptors> </jaxrs:inInterceptors> <jaxrs:serviceBeans> <bean class="cn.rest.rest.SurpolicyEntrence"></bean> </jaxrs:serviceBeans> <jaxrs:extensionMappings> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </jaxrs:extensionMappings> <jaxrs:languageMappings> <entry key="en" value="en-gb"/> </jaxrs:languageMappings> </jaxrs:server>
1、在 javax.ws.rs.* 中定義,都是一些註解,是 JAX-RS (JSR 311) 規範的一部分。
2、具體的註解如下:
1)@Path:定義資源基 URI。由上下文根和主機名組成,如:
http://localhost:8080/Java_WS_Server/rest/surpolicy
2)@GET/@POST:這意味著以下方法可以響應 HTTP GET 或是 HTTP POST方法。
3)@Produces:響應內容 MIME 型別。如
@Produces(MediaType.TEXT_PLAIN) @Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
4)@Context: 使用該註釋注入上下文物件,比如 Request、Response、UriInfo、ServletContext 等。
@Context HttpServletRequest servletRequest
@Context HttpServletResponse servletResponse
@Context
private UriInfo uriInfo;
5)@PathParam("contact"):該註釋將引數注入方法引數的路徑。其他可用的註釋有 @FormParam、@QueryParam 等。
3、一般來說,服務類與方法上應該分別標註註解 @Path,用於區分訪問路徑。
@Path(value = "/surpolicy")
public class SurpolicyEntrence {}
@Path("/sendXml")
public String sendXml(String requestXML) {}
三、簡單的 RESTful 服務
1、服務類程式碼:
/**
* 簡單服務方法
* @param input
* 訪問地址:http://localhost:8080/Java_WS_Server/rest/surpolicy/sendString/queryParams_aa
* @return
*/
@GET
@Path("/sendString/{input}")
// @Produces("text/plain")
@Produces(MediaType.TEXT_PLAIN)
public String sendStringParam(@PathParam("input") String input) {
System.out.println("接收的引數: \r\n" + input);
String tReturn = "成功返回";
return tReturn;
}
啟動服務後,訪問http://localhost:8080/Java_WS_Server,有Available RESTful services的內容,說明發布成功。
2、分析:
1)前提:服務類的path定義為如下,故所有的方法的訪問地址都為
http://localhost:8080/Java_WS_Server/rest/surpolicy/ + "方法自己的地址"。/rest 為在配置檔案中配置的address地址
@Path(value = "/surpolicy")
public class SurpolicyEntrence {}
2)@Path("/sendString/{input}") :用瀏覽器的rest 工具訪問的時候,必須把引數放在url地址後面。如:
http://localhost:8080/Java_WS_Server/rest/surpolicy/sendString/queryParams_aa
3)訪問的結果如下:
後臺顯示:表示成功。返回的資訊可以在 RestClient 中檢視。
接收的引數:
queryParams_aa
3、客戶端程式碼:本文中的客戶端統一使用 org.apache.cxf.jaxrs.client.WebClient 實現。
其他實現方式見:
1)WebClient 可以使用spring注入,也可以手工建立:
// 手動建立webClient物件,注意這裡的地址是釋出的那個/rest地址
// String url = "http://localhost:8080/Java_WS_Server/rest/";
// client = WebClient.create(url);
// 從Spring Ioc容器中拿webClient物件,或者直接用注入
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
client = ctx.getBean("webClient", WebClient.class);
使用spring,需要配置 applicationContext-client.xml 程式碼: <bean id="webClient" class="org.apache.cxf.jaxrs.client.WebClient" factory-method="create">
<constructor-arg type="java.lang.String" value="http://localhost:8080/Java_WS_Server/rest/" />
</bean>
2)先初始化 webClient物件
public void init() {
// 手動建立webClient物件,注意這裡的地址是釋出的那個/rest地址
// String url = "http://localhost:8080/Java_WS_Server/rest/";
// client = WebClient.create(url);
// 從Spring Ioc容器中拿webClient物件,或者直接用注入
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
client = ctx.getBean("webClient", WebClient.class);
}
3)簡單服務的訪問方法:
/**
* 測試服務端的簡單方法
*/
public void sendString(){
String tResponseMsg = client.path("surpolicy/ping/{input}","我來ping一下。。").accept(MediaType.TEXT_PLAIN).get(String.class);
System.out.println(tResponseMsg);
}
4)顯示:
服務端:
接收的引數:
我來ping一下。。
客戶端:
成功返回
四、以XML為互動內容的 RESTful 服務
(一)需要使用 jaxb 來對映Xml與javaBean。
1、接收的javaBean 程式碼。
package cn.rest.bean;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* UserBean.java
*
* @title User的傳輸資料類
* @description
* @author SAM-SHO
* @Date 2014-11-25
*/
@XmlRootElement(name = "USER")
public class UserBean {
private String name;
private String age;
private UserAddress userAddress;//地址
private List<UserPhone> phoneList ;//手機
@XmlElement(name="NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "AGE")
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@XmlElement(name = "UserAddress")
public UserAddress getUserAddress() {
return userAddress;
}
public void setUserAddress(UserAddress userAddress) {
this.userAddress = userAddress;
}
@XmlElementWrapper(name = "PhoneList")
@XmlElement(name = "UserPhone")
public List<UserPhone> getPhoneList() {
return phoneList;
}
public void setPhoneList(List<UserPhone> phoneList) {
this.phoneList = phoneList;
}
}
package cn.rest.bean;
public class UserPhone {
private String type;//電話號碼型別
private String num;//電話號碼
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
}
package cn.rest.bean;
import javax.xml.bind.annotation.XmlElement;
public class UserAddress {
private String homeAddress;//家庭地址
private String workAddress;//公司地址
@XmlElement(name = "HomeAddress")
public String getHomeAddress() {
return homeAddress;
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
@XmlElement(name = "WorkAddress")
public String getWorkAddress() {
return workAddress;
}
public void setWorkAddress(String workAddress) {
this.workAddress = workAddress;
}
}
2、返回的javaBean 程式碼。
package cn.rest.bean.response;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 返回商城退保結果物件
* @author SAM
*
*/
@XmlRootElement(name = "RETURN")
public class ReturnDTO {
protected String code;
protected String msg;
@XmlElement(name="Code")
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@XmlElement(name="MSG")
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3、轉換工具類。
package cn.rest.util;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.xml.sax.InputSource;
import cn.rest.bean.UserBean;
/**
*
* ObjectAndXmlHandle.java
*
* @title jaxb處理xml解析
* @description
* @author SAM-SHO
* @Date 2014-11-25
*/
public class ObjectAndXmlHandle {
public static UserBean parseXml2OUserBean(String xml) {
try {
JAXBContext context = JAXBContext.newInstance(UserBean.class);
InputSource is = new InputSource();
StringReader xmlStr = new StringReader(xml);
is.setCharacterStream(xmlStr);
Unmarshaller unmarshaller = context.createUnmarshaller();
UserBean user = (UserBean) unmarshaller.unmarshal(is);
return user;
} catch (JAXBException e) {
e.printStackTrace();
return null;
}
}
public static void Object2Xml(Object object) {
// FileWriter writer = null;
try {
JAXBContext context = JAXBContext.newInstance(object.getClass());
Marshaller marshal = context.createMarshaller();
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshal.setProperty("jaxb.encoding", "utf-8");
marshal.marshal(object, System.out);
// writer = new FileWriter("shop.xml");
// marshal.marshal(object, writer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(二)、服務端方法程式碼
1、把 xml 以 String 的方法傳輸。
/**
* 接受XML ,推薦使用。
* 地址:http://localhost:8080/Java_WS_Server/rest/surpolicy/sendXml
* 設定 Content-Type: APPLICATION/XML(可以不設)
* body 中設定 xml內容
*/
@POST
@Path("/sendXml")
@Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public String sendXml(String requestXML) {
System.out.println("接收的引數:\r\n " + requestXML);
UserBean tUserBean = ObjectAndXmlHandle.parseXml2OUserBean(requestXML);
String tReturn = tUserBean.getName()+ " 你好,你的請求成功返回";
return tReturn;
}
2、RESTClient 工具訪問,xml放在 Body 中,可以不設定 Content-Type
3、客戶端訪問程式碼:
/**
* 傳送XML報文
*/
private void sendRequestXml() {
String tRequestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><USER><AGE>27</AGE><NAME>SAM-SHO</NAME><PhoneList><UserPhone><num>13612345678</num><type>移動</type></UserPhone><UserPhone><num>13798765432</num><type>聯通</type></UserPhone></PhoneList><UserAddress><homeAddress>蘇州高新區</homeAddress><workAddress>蘇州園區</workAddress></UserAddress></USER>";
String tResponseMsg = client.path("surpolicy/sendXml").accept(MediaType.APPLICATION_XML).post(tRequestXml, String.class);
System.out.println("返回的資訊: \r\n" + tResponseMsg);
}
五、以JavaBean為互動內容的 RESTful 服務1、服務端方法程式碼
/**
*接收Bean
*
* @param user
* http://localhost:8080/Java_WS_Server/rest/surpolicy/sendBean
* 需要設定 Content-Type: application/xml
* body 中設定 xml內容
* @return
*/
@POST
@Path("/sendBean")
@Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public ReturnDTO sendBean(UserBean user) {
//轉成報文
ObjectAndXmlHandle.Object2Xml(user);
System.out.println(user.getUserAddress().getHomeAddress());
ReturnDTO tReturnDTO = new ReturnDTO();
tReturnDTO.setCode("1");
tReturnDTO.setMsg(user.getName()+ " ,請求成功,已返回");
return tReturnDTO;
}
2、RESTClient訪問
1)一定要設定 headers資訊,設定 Content-Type: application/xml ,不然訪問不了。
2)需要設定 Content-Type。
3)正確訪問:
5)成功返回:
3、客戶端訪問:
/**
* 傳送Bean
*/
private void sendRequestBean() {
UserBean tUserBean = new UserBean();
tUserBean.setName("SAM-SHO");
tUserBean.setAge("27");
UserAddress tUserAddress = new UserAddress();
tUserAddress.setWorkAddress("蘇州園區");
tUserAddress.setHomeAddress("蘇州高新區");
tUserBean.setUserAddress(tUserAddress);
List<UserPhone> phoneList = new ArrayList<UserPhone>();
UserPhone tUserPhone = new UserPhone();
tUserPhone.setType("移動");
tUserPhone.setNum("13612345678");
phoneList.add(tUserPhone);
tUserPhone = new UserPhone();
tUserPhone.setType("聯通");
tUserPhone.setNum("13798765432");
phoneList.add(tUserPhone);
tUserBean.setPhoneList(phoneList);
ClientConfiguration config = WebClient.getConfig(client);
config.getHttpConduit().getClient().setReceiveTimeout(90000);//設定超時
ReturnDTO tReturnDTO = client.path("surpolicy/sendBean").accept(MediaType.APPLICATION_XML).acceptEncoding("utf-8").post(tUserBean,ReturnDTO.class );
System.out.println("返回的資料:" + tReturnDTO.getMsg());
}
六、服務端與客戶端完整程式碼如下:
1、服務端
package cn.rest.rest;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import cn.rest.bean.UserBean;
import cn.rest.bean.response.ReturnDTO;
import cn.rest.util.ObjectAndXmlHandle;
/**
*
* SurpolicyEntrence.java
*
* @title CXF RESTful風格WebService
* @description
* @author SAM-SHO
* @Date 2014-11-24
*/
@Path(value = "/surpolicy")
public class SurpolicyEntrence {
/**
* 簡單服務方法
* @param input
* 訪問地址:http://localhost:8080/Java_WS_Server/rest/surpolicy/sendString/queryParams_aa
* @return
*/
@GET
@Path("/sendString/{input}")
// @Produces("text/plain")
@Produces(MediaType.TEXT_PLAIN)
public String sendStringParam(@PathParam("input") String input) {
System.out.println("接收的引數: \r\n" + input);
String tReturn = "成功返回";
return tReturn;
}
/**
* 接受XML ,推薦使用。
* 地址:http://localhost:8080/Java_WS_Server/rest/surpolicy/sendXml
* 設定 Content-Type: APPLICATION/XML(可以不設)
* body 中設定 xml內容
*/
@POST
@Path("/sendXml")
@Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public String sendXml(String requestXML) {
System.out.println("接收的引數:\r\n " + requestXML);
UserBean tUserBean = ObjectAndXmlHandle.parseXml2OUserBean(requestXML);
String tReturn = tUserBean.getName()+ " 你好,你的請求成功返回";
return tReturn;
}
/**
*接收Bean
*
* @param user
* http://localhost:8080/Java_WS_Server/rest/surpolicy/sendBean
* 需要設定 Content-Type: application/xml
* body 中設定 xml內容
* @return
*/
@POST
@Path("/sendBean")
@Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public ReturnDTO sendBean(UserBean user) {
//轉成報文
ObjectAndXmlHandle.Object2Xml(user);
System.out.println(user.getUserAddress().getHomeAddress());
ReturnDTO tReturnDTO = new ReturnDTO();
tReturnDTO.setCode("1");
tReturnDTO.setMsg(user.getName()+ " ,請求成功,已返回");
return tReturnDTO;
}
}
2、客戶端
package cn.rest.client;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.ClientConfiguration;
import org.apache.cxf.jaxrs.client.WebClient;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.rest.bean.UserAddress;
import cn.rest.bean.UserBean;
import cn.rest.bean.UserPhone;
import cn.rest.bean.response.ReturnDTO;
public class RestClient {
private static WebClient client;
/**
* @param args
*/
public static void main(String[] args) {
RestClient tRestClient = new RestClient();
tRestClient.init();
//1-簡單測試
// tRestClient.sendString();
// 2-傳送XML報文
// tRestClient.sendRequestXml();
// 2-傳送Bean
tRestClient.sendRequestBean();
}
public void init() {
// 手動建立webClient物件,注意這裡的地址是釋出的那個/rest地址
// String url = "http://localhost:8080/Java_WS_Server/rest/";
// client = WebClient.create(url);
// 從Spring Ioc容器中拿webClient物件,或者直接用注入
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
client = ctx.getBean("webClient", WebClient.class);
}
/**
* 測試服務端的簡單方法
*/
public void sendString(){
String tResponseMsg = client.path("surpolicy/sendString/{input}","我來ping一下。。").accept(MediaType.TEXT_PLAIN).get(String.class);
System.out.println(tResponseMsg);
}
/**
* 傳送XML報文
*/
private void sendRequestXml() {
String tRequestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><USER><AGE>27</AGE><NAME>SAM-SHO</NAME><PhoneList><UserPhone><num>13612345678</num><type>移動</type></UserPhone><UserPhone><num>13798765432</num><type>聯通</type></UserPhone></PhoneList><UserAddress><homeAddress>蘇州高新區</homeAddress><workAddress>蘇州園區</workAddress></UserAddress></USER>";
String tResponseMsg = client.path("surpolicy/sendXml").accept(MediaType.APPLICATION_XML).post(tRequestXml, String.class);
System.out.println("返回的資訊: \r\n" + tResponseMsg);
}
/**
* 傳送Bean
*/
private void sendRequestBean() {
UserBean tUserBean = new UserBean();
tUserBean.setName("SAM-SHO");
tUserBean.setAge("27");
UserAddress tUserAddress = new UserAddress();
tUserAddress.setWorkAddress("蘇州園區");
tUserAddress.setHomeAddress("蘇州高新區");
tUserBean.setUserAddress(tUserAddress);
List<UserPhone> phoneList = new ArrayList<UserPhone>();
UserPhone tUserPhone = new UserPhone();
tUserPhone.setType("移動");
tUserPhone.setNum("13612345678");
phoneList.add(tUserPhone);
tUserPhone = new UserPhone();
tUserPhone.setType("聯通");
tUserPhone.setNum("13798765432");
phoneList.add(tUserPhone);
tUserBean.setPhoneList(phoneList);
ClientConfiguration config = WebClient.getConfig(client);
config.getHttpConduit().getClient().setReceiveTimeout(90000);//設定超時
ReturnDTO tReturnDTO = client.path("surpolicy/sendBean").accept(MediaType.APPLICATION_XML).acceptEncoding("utf-8").post(tUserBean,ReturnDTO.class );
System.out.println("返回的資料:" + tReturnDTO.getMsg());
}
}
相關推薦
Web Service筆記(五):CXF開發RESTful風格的Web Service
前言: 4、可以使用瀏覽器的工具除錯:如 Firefox 的RESTClient 和chrome的REST Console。 一、配置Spring的配置檔案 1、需要引入新的 jar 包。 2、配置 applicationContext-server.xml
Web Service筆記(三):wsdl 與 soap協議詳解
一、WSDL語言:(web service definition language - web service定義語言) (一)簡介: 2、wsdl 文件描述了 ws 主要的3個方面: 1)WHATA:該 ws 包含”什麼“操作,即有幾個方法。 2)HOW:該 ws
javascript學習筆記(五):異常捕獲和事件處理
log 類型 按鈕 輸入 button lan yellow logs 代碼 異常捕獲 Try{ 發生異常的代碼塊 }catch(err){ 異常信息處理 } 1 <!DOCTYPE html> 2 <html> 3 <head
Unity3D之Mecanim動畫系統學習筆記(五):Animator Controller
浮點 key 發現 菜單 融合 stat mon 好的 project 簡介 Animator Controller在Unity中是作為一種單獨的配置文件存在的文件類型,其後綴為controller,Animator Controller包含了以下幾種功能: 可以對
Python筆記(五):異常處理和數據存儲
utf-8 load 模塊 修改 val 麻煩 數據存儲 poke 關閉 註:和上一篇有關聯 (一) finally 和 輸出異常信息 try: the_man = open(r‘C:\Users\123456\Desktop\test.txt‘)
Python網絡爬蟲筆記(五):下載、分析京東P20銷售數據
9.png amp F12 不存在 strong xls sco 列表 std (一) 分析網頁 下載下面這個鏈接的銷售數據 https://item.jd.com/6733026.html#comment 1、 翻頁的時候,谷歌F12的Network頁簽可以
hadoop學習筆記(五):HBase體系結構和數據模型
ems 服務器端 們的 code 修改 保存 重新 table lpad 1. HBase體系結構 一個完整分布式的HBase的組成示意圖如下,後面我們再詳細談其工作原理。 1)Client 包含訪問HBase的接口並維護cache來加快對HBase的訪問。 2)Zooke
學習筆記(五):使用決策樹演算法檢測POP3暴力破解
1.資料蒐集 載入KDD 99中的資料: def load_kdd99(filename): x=[] with open(filename) asf: for line in f: line=line.st
機器學習筆記(五):樸素貝葉斯分類器
一、概述 1.1 簡介 樸素貝葉斯(Naive Bayesian)是基於貝葉斯定理和特徵條件獨立假設的分類方法,它通過特徵計算分類的概率,選取概率大的情況進行分類,因此它是基於概率論的一種機器學習分類方法。因為分類的目標是確定的,所以也是屬於監督學習。 Q1:什麼是基於概率論的方
Java Web學習筆記(五)
GenertcServlet 是一個Servlet,是Servlet介面和ServletConfig介面的實現類,是一個抽象類,其中的service方法為抽象方法。 如果新建的Servlet程式直接繼承GenertcServlet會使開發更簡潔。 具體實現: 在Ge
學習筆記(五):Java異常機制
主要從這幾個方面來說說Java中的異常: 圖1.知識體系1. 異常:指的是程式在執行過程中,出現的非正常的情況,最終會導致JVM的非正常停止。 異常的繼承體系如下: 圖1.1 異常的繼承體系 Throwable類是 Java 語言中所有錯誤或異常的父類
Web學習筆記(一):HTTP請求
HTTP請求流程 手頭有本《Web安全深度剖析》,感覺很裝逼,就看了看。 客戶端傳送Request請求,服務端返回Response請求 客戶端一般就是我們用的瀏覽器,服務端一般是高效能的計算機(組),比如www.baidu.com就代表一個伺服器的地址,即域名
Spring學習筆記(五):Spring JDBC 框架及應用示例
JDBC 框架概述 在使用普通的 JDBC 資料庫時,就會很麻煩的寫不必要的程式碼來處理異常,開啟和關閉資料庫連線等。但 Spring JDBC 框架負責所有的低層細節,從開始開啟連線,準備和執行 SQL 語句,處理異常,處理事務,到最後關閉連線。 所以當從資料庫中獲取資
Go語言學習筆記(五):變數作用域
Go語言變數型別 Go語言變數型別分為三種:區域性變數,全域性變數,形式引數 型別 定義 描述 區域性變數 在函式內定義的變數 作用域只在函式體內 全域性變數 在函式外定義的變數 全域性變數可以在整個包甚至外部包(被匯出後)
安卓開發學習筆記(五):史上最簡單且華麗地實現Android Stutio當中Webview控制元件https/http協議的方法
一.我們先在XML當中自定義一個webview(Second_layout.xml) 程式碼如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.an
機器學習筆記(五):支援向量機(SVM)
支援向量機是目前機器學習的眾多演算法中使用得最為廣泛的演算法之一,本文主要介紹支援向量機的概念與原理。 目錄 什麼是支援向量機 硬間隔線性支援向量機 軟間隔線性支援向量機 非線性支援向量機 一、什麼是支援向量機 &nbs
javascript資料結構與演算法筆記(五):連結串列
javascript資料結構與演算法筆記(五):連結串列 一:簡介 二:ES6版LinkedList類 一:簡介 連結串列儲存有序的元素集合,但不同於陣列,連結串列中的元素在記憶體中並不是連續放置的。每個 元素由一個儲
各種音視訊編解碼學習詳解之 編解碼學習筆記(五):Mpeg系列——AAC音訊
最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解成很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyo
java Concurrent包學習筆記(五):Semaphore
一、Semaphore 是什麼 訊號量Semaphore是一個併發工具類,用來控制可同時併發的執行緒數,其內部維護了一組虛擬許可,建構函式初始化的時候可以指定許可的總數量 每次執行緒執行操作時先通過acquire方法獲得許可,執行緒獲得許可後Semaphore 的許可數量會減1,執行完畢再通過
演算法快學筆記(五):散列表
1. 介紹 當需要根據給定的值需要快速得到想要值的時候,散列表是一個非常有用的資料結構,假設你在一家雜貨店上班。有顧客來買東西時,你得在一個本子中查 找價格,如果本子的內容不是按字母順序排列的,你可以使用簡單查詢法,從頭到尾以一個一個的找,時間複雜度為O(n),如果本子的內容是按字母順序