Msgpack简介
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
MessagePack是一个基于二进制高效的对象序列化Library用于跨语言通信。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。 支持Python、Ruby、Java、C/C++、Javascript等众多语言。 比Google Protocol Buffers还要快4倍。
Graddle依赖管理
// msgpack
compile 'org.msgpack:msgpack:0.6.12' // 依赖javassist和json-simple
//slf-logback
compile 'org.slf4j:jcl-over-slf4j:1.7.7'
compile 'org.slf4j:jcl-over-slf4j:1.7.7' // 依赖lf4j-api,故lf4j-api可以不单独配置
compile 'org.slf4j:slf4j-api:1.7.7'
// javassist
compile 'org.javassist:javassist:3.20.0-GA' // 如果其他有依赖,则可不单独配置
compile 'com.googlecode.json-simple:json-simple:1.1.1'
使用Msgpack解析yii2 session中的数据
yii2将session数据写入redis中,为了在java api中可以使用后台用户登录的信息,则需要通过java解析session数据。 先看看如何使用:
// sessionBytes是byte类型
if (null != sessionBytes) {
MessagePack pack = new MessagePack(); // new一个msgpack对象
Map map = null;
try {
map = (Map) pack.read(sessionBytes); // 通过Msgpack的read读取字节,强制转换为Map对象
} catch (IOException e) {
LOGGER.warn("get request user from redis failed: ", e);
}
if (!com.joyven.util.Utils.isEmpty(map)) {
map.forEach((k, v) -> {
String key = String.valueOf(k);
String value = String.valueOf(v);
if (Const.SESSION_KEY_UID.equals(key)) {
user.setUid(Long.parseLong(trim(value, USER_STRING_REDUNDANCY)));
}
if (Const.SESSION_KEY_USERNAME.equals(key)) {
user.setUsername(trim(value, USER_STRING_REDUNDANCY));
}
if (Const.SESSION_KEY_AVATAR.equals(key)) {
user.setAvatar(trim(value, USER_STRING_REDUNDANCY));
}
if (Const.SESSION_KEY_CST.equals(key)) {
user.setCraftsmanStatus(Integer.parseInt(trim(value,
USER_STRING_REDUNDANCY)) + 1);
}
if (Const.SESSION_KEY_MOBILE.equals(key)) {
user.setMobile(trim(value, USER_STRING_REDUNDANCY));
}
});
}
}
上述代码中常量的定义:
public static final String SESSION_KEY_UID = "\"uid\"";
public static final String SESSION_KEY_USERNAME = "\"un\"";
public static final String SESSION_KEY_AVATAR = "\"avt\"";
public static final String SESSION_KEY_CST = "\"cst\"";
public static final String SESSION_KEY_MOBILE = "\"mbl\"";
public static final String USER_STRING_REDUNDANCY = "\"";
php写入的数据是uid、un、avt、cst、mbl这样的key,经过Msgpack序列化后的key都加上了\"
,强制转换为Map对象后,map中的key并没有去掉这些转义字符,value也不例外,因此使用trim去掉了value两边的\"
。需要注意,如果是yii2的话,一般key都有前缀,此处作者把前缀删掉了,下面所有代码均如此。
此处的trim是经过封装的,和php中trim api类似。
上面的这块代码,Msgpack反序列化可以抽象封装为工具类:
@SuppressWarnings("unchecked")
public static Map getMessagePackValue(final byte[] bytes) throws IOException {
MessagePack pack = new MessagePack();
Map map = (Map) pack.read(bytes);
Map result = new HashMap<>();
if (null != map) {
map.forEach((k, v) -> result.put(trim(String.valueOf(k), USER_STRING_REDUNDANCY),
trim(String.valueOf(v), USER_STRING_REDUNDANCY)));
}
return result;
}
优化getMessagePackValue方法,不再使用trim处理数据
@SuppressWarnings("unchecked")
public static Map getMessagePackValue(final byte[] bytes) throws IOException {
MessagePack pack = new MessagePack();
Map map = (Map) pack.read(bytes, Templates.tMap(Templates.TString,
Templates.TValue));
Map result = new HashMap<>();
if (map != null) {
map.forEach((k, v) -> {
Object object = rawObjToObj(v);
result.put(k, object);
});
}
return result;
}
Msgpack有很多数据模板,这里使用TString模板和TValue模板。相关模板均在org.msgpack.template.Template
类中定义,诸如:TValue、TByte、TShort、TInteger、TLong、TCharacter、TBigInteger、TBigDecimal、TFloat、TBoolean、TString、TByteArray、TByteBuffer、TDate、tNotNullable、tList、tMap、tCollection、tOrdinalEnum。
private static Object rawObjToObj(Object obj) {
Object objResu = null;
if (obj instanceof IntegerValue) {
objResu = ((IntegerValue) obj).asIntegerValue();
} else if (obj instanceof ArrayValue) {
ArrayValue v = ((ArrayValue) obj).asArrayValue();
List ret = new ArrayList<>(v.size());
v.forEach(x -> ret.add(x));
objResu = ret;
} else if (obj instanceof BooleanValue) {
objResu = ((BooleanValue) obj).asBooleanValue();
} else if (obj instanceof FloatValue) {
objResu = ((FloatValue) obj).asFloatValue();
} else if (obj instanceof MapValue) {
MapValue value = ((MapValue) obj).asMapValue();
Map map = new HashMap<>(value.size());
value.forEach((k, v) -> {
map.put(k, rawObjToObj(v));
});
objResu = map;
} else {
objResu = ((RawValue) obj).asRawValue().getString();
}
return objResu;
}
优化后的使用方法
// appId 为php中的session id
public User getAdminUser(String appId) {
byte[] sessionKey = getSessionKey(appId).getBytes();
byte[] sessionAdmin;
User user = new User();
try (Jedis jedis = jedisPool.getResource()) {
jedis.select(RedisDB.DB12);
sessionAdmin = jedis.get(sessionKey);
user.setExpire(jedis.ttl(sessionKey));
}
if (sessionAdmin != null) {
Map map = new HashMap<>();
try {
map = Utils.getMessagePackValue(sessionAdmin);
} catch (IOException e) {
LOGGER.warn("parse session admin error: " + e.getMessage());
}
if (!isEmpty(map)) {
if (map.containsKey("id")) {
if (map.get("id") instanceof IntegerValue) {
user.setAid(((IntegerValue) map.get("id")).longValue());
} else if(!isEmpty((String) map.get("id"))){
user.setAid(Long.parseLong((String) map.get("id")));
} else {
user.setAid(0L);
}
}
if (map.containsKey("un")) {
user.setUsername((String) map.get("un"));
}
if (map.containsKey("rn")) {
user.setRealname((String) map.get("rn"));
}
}
}
return user;
}
错误:org.msgpack.type.intValueImpl cannot be cast to java.lang.Long
先看看这段代码:
if (map.containsKey("id")) {
if (map.get("id") instanceof IntegerValue) {
user.setAid(((IntegerValue) map.get("id")).longValue());
} else if(!isEmpty((String) map.get("id"))){
user.setAid(Long.parseLong((String) map.get("id")));
} else {
user.setAid(0L);
}
}
反序列化后获取id,因为User中id是Long类型,这里面id可能是String,也可能是Integer,因此需要注意。最开的代码是这样写的:
if (map.containsKey("id") && !isEmpty((String) map.get("id"))) {
user.setAid(Long.parseLong((String) map.get("id")));
}
通过Long.parseLong解析id报错,错误:org.msgpack.type.intValueImpl cannot be cast to java.lang.Long,于是修改为下面这般,如果是IntegerValue的实例,则强制转换为Long类型,但是依然报错:
if (map.containsKey("id")) {
if (map.get("id") instanceof IntegerValue) {
user.setAid((Long) map.get("id"));
} else if(!isEmpty((String) map.get("id"))){
user.setAid(Long.parseLong((String) map.get("id")));
} else {
user.setAid(0L);
}
}
最后强制类型转换IntegerValue,再获取longValue,即为上面函数中的那般才解决此错误。
参考资料
你可能感兴趣的:(java,msgpack)
模板-富文本
晓风残月Yuperman
nginx 运维
博主介绍:大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。近期专注:RPA应用研究,主流厂商产品使用,开源RPA应用,包括UI.Vision、taskUI、taskt、OpenRpa、RobotFramework等技术范围:长期专注java体系,软件架构,DDD,多年java、golang、
Java高级:mysql创建用户密码
字节全栈_kYu
java mysql 开发语言
为查询缓存优化你的查询EXPLAIN你的SELECT查询当只要一行数据时使用LIMIT1为搜索字段建索引在Join表的时候使用相当类型的例,并将其索引千万不要ORDERBYRAND()避免SELECT*永远为每张表设置一个ID使用ENUM而不是VARCHAR从PROCEDUREANALYSE()取得建议尽可能的使用NOTNULLPreparedStatements无缓冲的查询把IP地址存成UNSI
101算法javaScript描述【3】
2401_89317507
算法 javascript java
通常情况下,不能出现超过连续三个相同的罗马数字并且罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况:I可以放在V(5)和X(10)的左边,来表示4和9。X可以放在L(50)和C(100)的左边,来表示40和90。C可以放在D(500)和M(1
LeetCode—406.根据身高重建队列(Queue Reconstruction by Height)——分析及代码(Java)
江南土豆
数据结构与算法 LeetCode Java 题解
LeetCode—406.根据身高重建队列[QueueReconstructionbyHeight]——分析及代码[Java]一、题目二、分析及代码1.贪心算法(1)思路(2)代码(3)结果三、其他一、题目假设有打乱顺序的一群人站成一个队列。每个人由一个整数对(h,k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。编写一个算法来重建这个队列。注意:总人数少于1100人。示
java xml dom 解析_解析 XML DOM
十二月极光
java xml dom 解析
解析XMLDOM大多数浏览器都内建了供读取和操作XML的XML解析器。解析器把XML转换为JavaScript可存取的对象。实例W3School提供的实例独立于浏览器和平台。这些实例可在所有现代浏览器中运行。解析XML所有现代浏览器都内建了用于读取和操作XML的XML解析器。解析器把XML读入内存,并把它转换为可被JavaScript访问的XMLDOM对象。微软的XML解析器与其他浏览器中的解析器
JavaScript网页设计实战:微信登录 + 获取用户头像和昵称
James吖
javascript 微信 前端 开发语言 目标检测 ecmascript 神经网络
引言在现代Web开发中,社交媒体登录已经成为提升用户体验的一个重要组成部分。微信登录因其广泛的用户基础和便捷的登录方式,深受开发者和用户的喜爱。本文将通过一个实战案例,介绍如何在JavaScript网页应用中集成微信登录功能,并获取用户的头像和昵称。前提条件在开始之前,请确保你已经具备以下条件:已经在微信开放平台上注册并创建了应用,获取到了AppID和AppSecret。了解基本的HTML、CSS
lua-文件操作代码大全
James吖
lua java java
1.创建新文件--使用File类import"java.io.File"--导入File类File(文件路径).createNewFile()--使用io库io.open("/sdcard/aaaa",'w')2.创建新文件夹--使用File类import"java.io.File"--导入File类File(文件夹路径).mkdir()--创建多级文件夹File(文件夹路径).mkdirs()-
2025最新版Java面试八股文大全
m0_74823452
java 面试 开发语言
一、Java并发面试题1、ThreadLocal1.1谈谈你对ThreadLocal的理解?ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。它不是针对程序的全局变量,只是针对当前线程的全局变量。1.2ThreadLocal底层实现原理?Threadlocal内部有一个非常关键的内部类ThreadlocalMap,里面定义了一个由key-
XML DOM 改变节点值
shangaoo
xml java 前端
nodeValue属性用于改变节点值。setAttribute()方法用于改变属性值。尝试一下-实例下面的实例使用XML文件books.xml。函数loadXMLDoc(),位于外部JavaScript中,用于加载XML文件。改变元素的文本节点本例使用nodeValue属性来改变"books.xml"中第一个元素的文本节点。通过使用setAttribute来改变属性值本例使用setAttribut
XMLDOM之浏览器差异
dengguxinghe4335
javascript xhtml ViewUI
DOM解析中的浏览器差异所有现代浏览器都支持w3cDOM规范,不过浏览器之间是有差异的,重要的区别有两点:加载XML的方式;处理空白和换行的方式;1、加载XML的方式:所有现代浏览器都内建了用于读取和操作XML的XML解析器。解析器把XML读入内存,并把它转换为可被JavaScript访问的XMLDOM对象;微软的XML解析器与其他浏览器中的解析器是有差异的。微软的解析器支持对XML文件和XML字
LeetCode:406. 根据身高重建队列(Java 贪心)
Cosmoshhhyyy
LeetCode leetcode 算法 职场和发展
目录406.根据身高重建队列题目描述:实现代码与解析:贪心原理思路:406.根据身高重建队列题目描述:假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[hi,ki]表示第i个人的身高为hi,前面正好有ki个身高大于或等于hi的人。请你重新构造并返回输入数组people所表示的队列。返回的队列应该格式化为数组queue,其中queu
RPC 和 RESTFUL
快乐的小三菊
java 基础 java
一、网络分层聊今天的话题之前,先普及个关于网络架构的分层的知识,在当前的世界中,有两套网络的参考模型,一套是OSI参考模型,一套是TCP/IP的参考模型。对于java开发而言,我们只需要知道现在用的是TCP/IP模型,这个模型分为四层就可以了。OSI参考模型(OpenSystemsInterconnectionReferenceModel):包括七层,这个模型过于理想化,未能在因特网中进行广泛推广
JavaScript-黑马程序员-前端零基础
羊羊的代码笔记本
javascript 前端 html
目录1.初识JavaScript1.1浏览器执行js1.2js的组成1.3js三种书写方式1.4JavaScript输入输出语句2.变量2.1变量是一个装东西的容器2.2变量是使用2.3更新变量2.4声明多个变量1.初识JavaScript是一种高级编程语言1.1浏览器执行js浏览器分成两部分:渲染引擎和js引擎渲染引擎:用来解析HTML和CSS,俗称内核js引擎:也称为js解释器。用来读取网页中
仓库管理系统,Java+Vue,含源码及详细文档,助力高效仓储管理
瓯雅爱分享
源码下载 软件工程 java mysql vue 源代码管理
前言:仓库管理系统是一个关键的供应链管理软件,它帮助企业和组织有效地追踪库存、管理仓库运营,并优化物流流程。以下是对仓库管理系统各部分的详细解释:一、入库管理入库管理模块负责处理所有入库操作,包括接收货物、验收、分类、上架等步骤。它具有以下功能:预约入库:允许供应商或运输公司提前通知仓库,以便做好接收准备。货物验收:检查货物的数量、质量、规格等是否与订单相符。分类与编码:根据货物的属性进行分类,并
JAVA深拷贝与浅拷贝(呕心沥血之作)
Ra1n .
JAVA java intellij-idea 软件工程
JAVA深拷贝与浅拷贝①对于Java拷贝的理解②浅拷贝一、图解二、代码举例三、适用情况③深拷贝一、图解二、代码举例三、适用情况①对于Java拷贝的理解 在JAVA语言中,我们常常会需要用到拷贝操作,当我们需要用到拷贝一个JAVA对象的时候,JAVA中常见的有四种拷贝方式: 一、使用stream(这是java中传统的文件复制方式。这里创建两个文件-source和destination。然后从so
java map深拷贝_java Map深度复制问题
weixin_39860732
java map深拷贝
展开全部这里的pos是基础类型,不是引用类型,不需要拿出来单独复制,浅clone就可e5a48de588b63231313335323631343130323136353331333332613737以了,但是attr这个map需要进行深度复制,因为这个是引用类型,复制后的对象修改该属性依然会影响源对象clone方法可以简单写为@OverrideprotectedObjectclone()thro
java map深拷贝_关于HashMap的浅拷贝深拷贝
K8S技术社区
java map深拷贝
Map中存储的都是String,不是基本数据类型的,这个有很大影响;putAll()和clone()对基本数据类型的数据是没有问题的,但是引用类型还是不行。HashMap的浅拷贝clone()方法一、创建一个HashMap对象source,进行赋值,然后再克隆一个对象targetMap出来。通过改变targetMap的值,观察source与targetMap的变化。HashMapsource=ne
MapUtils常用方法
qq_41482600
java基础 开发语言
1、摘要MapUtils是一个用于处理Map对象的实用工具类,它提供了许多方便的方法来执行常见的操作,如获取值、设置默认值、合并Map等。本文将介绍MapUtils的常见用法,以帮助你更轻松地处理Map数据。2、前言在Java编程中,Map是一种常用的数据结构,用于存储键值对。然而,处理Map数据时,经常需要进行一些繁琐的操作,例如检查键是否存在,获取键对应的值,或者在键不存在时设置默认值。为了简
SpringBoot核心组件详细解析
德乐懿
后端 spring boot 后端 java
SpringBoot核心组件详细解析SpringBoot作为当前Java领域最流行的微服务框架之一,其核心组件的设计与应用对于开发高效、稳定的应用程序至关重要。本文将详细解析SpringBoot的核心组件,包括SpringBoot框架本身、Spring、SpringMVC、数据库连接池等,通过阐述每个组件的作用、特点、使用场景,并结合实际案例,深入分析SpringBoot核心组件之间的关联性和依赖
python爬虫之JS逆向入门,了解JS逆向的原理及用法(18)
盲敲代码的阿豪
python之爬虫系统教学 python 爬虫 javascript JS逆向
文章目录1.JS逆向是什么?2、如何分析加密参数并还原其加密方式?2.1分析JS加密的网页2.2编写python代码还原JS加密代码3、案例测试4、操作进阶(通过执行第三方js文件实现逆向)4.1python第三方模块(execjs)4.2调用第三方js文件完成逆向操作4.3总结1.JS逆向是什么?什么是JS加密?我们在分析某些网站的数据接口时,经常会遇到一些密文参数,这些参数实际就是通过Java
读书笔记-《Spring技术内幕》(一)IoC容器的实现
萝卜青今天也要开心
spring java 后端 笔记
如今已是2024年,掌握Spring早已是Java从业人员的基本要求。Spring帮我们屏蔽掉了许多繁琐的工作,使我们可以把重心放在业务逻辑上。但也因此,要深刻体会到Spring带来的便捷性,反倒需要与没有使用Spring时作对比。为此,我特地翻了下上大学时用JaveWeb开发的项目(无框架),希望能让大家更好理解。01SpringIoC容器概述Spring的架构图如上所示,IoC与AOP都是Sp
关于Java中的Map的浅拷贝和深拷贝问题
不生气的打工人
使用笔记
关于Java中的Map的浅拷贝和深拷贝问题发生背景生产打印的log会有图片的Base64码这并不是我们实际日志中需要关心的东西想定的解决案是在切面打印日志类中删除掉打印log的字段使用过程根据方法的参数做区分定位到对应的参数是删除掉参数中的图片字段代码if(args.length==1&&args[0]instanceofMap){MapargMap=(Map)args[0];argMap.rem
SpringSecurity相关面试试题及答案解析
HappyAcmen
java面试题相关总结 面试 职场和发展
SpringSecurity是一个功能强大且高度可定制的Java安全框架,主要用于保护基于Java的应用程序。文章目录1.核心功能2.核心组件3.工作原理4.相关试题1.什么是SpringSecurity?它的主要功能是什么?2.简述一下Authentication和Authorization的区别?3.SpringSecurity的核心组件有哪些?4.如何在SpringSecurity中实现身份
Java Map 深拷贝方法
qq_41482600
java基础 java 开发语言
1、JSON.parseObject(JSON.toJSONString(map))importcom.alibaba.fastjson.JSON;importorg.apache.commons.lang3.SerializationUtils;importjava.util.HashMap;importjava.util.Map;publicclassJSONDemo{publicstatic
Java 在包管理与模块化中的优势:与其他开发语言的比较
nbsaas-boot
开发语言 java
在开发复杂的、规模庞大的软件系统时,包管理和模块化设计起着至关重要的作用。它们不仅决定了代码的组织和可维护性,还直接影响到团队协作效率、扩展性和性能。在众多编程语言中,Java凭借其成熟的生态系统、强类型系统和标准化的包管理机制,成为了大型企业级应用开发的首选之一。本文将探讨Java在包管理和模块化方面的优势,并与其他流行语言(如Rust、Go、Python、JavaScript和C#)进行对比,
推荐篇:一探Selenium Java自动化测试架构的奥秘
俞予舒Fleming
推荐篇:一探SeleniumJava自动化测试架构的奥秘selenium-java-test-automation-architectureReady-to-useUITestAutomationArchitectureusingJavaandSeleniumWebDriver.项目地址:https://gitcode.com/gh_mirrors/se/selenium-java-test-au
Github 2025-02-01 开源项目月报 Top20
老孙正经胡说
github 开源 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,本月(2025-02-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量Python项目8TypeScript项目3JupyterNotebook项目2Rust项目2HTML项目2C++项目1Ruby项目1JavaScript项目1Svelte项目1非开发语言项目1Go项目1Ollama:本地大型语言模型设置与运行创建周
python注意事项:range遍历越索引现象、列表边遍历边修改出现的问题
JU HE
python 基础(语法以及多线程等操作) python 开发语言
文章目录前言一、range遍历越索引现象QS1:遍历range(2,2)会发生什么?不会报错,但是也不会遍历到任何内容QS1:遍历range(3,2)会发生什么?不会报错,但是也不会遍历到任何内容二、列表边遍历边修改注意事项(Java的List系列集合使用for-each循环或Iterator遍历集合时也会有下面问题)1避免直接修改列表长度:特别是边遍历边append和pop元素2边遍历边修改里面
Kafka 单机和集群环境部署教程
闲人编程
大数据集群部署教程 kafka 分布式 集群 部署 单机 zookeeper
目录一、Kafka单机环境部署1.环境准备2.安装Java3.安装ZooKeeper3.1下载并解压ZooKeeper3.2配置ZooKeeper3.3启动ZooKeeper3.4验证ZooKeeper是否正常运行4.安装Kafka4.1下载并解压Kafka4.2配置Kafka4.3创建日志目录4.4启动KafkaBroker4.5验证Kafka是否正常运行5.Kafka单机部署的注意事项二、Ka
(尚硅谷 Java 学习 B 站大学版)Day 13 面向对象 方法
亢从文_Jackson
java 学习 开发语言
4-5类的成员之二:方法(Method)一、“万事万物皆对象”**:(理解)1、在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构>Scanner,String等>文件:File>网络资源:URL2、涉及到java语言与前端html、后端数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象二、内存解析说明1、引用类型的变量,只可能存储两类值:nu
插入表主键冲突做更新
a-john
有以下场景:
用户下了一个订单,订单内的内容较多,且来自多表,首次下单的时候,内容可能会不全(部分内容不是必须,出现有些表根本就没有没有该订单的值)。在以后更改订单时,有些内容会更改,有些内容会新增。
问题:
如果在sql语句中执行update操作,在没有数据的表中会出错。如果在逻辑代码中先做查询,查询结果有做更新,没有做插入,这样会将代码复杂化。
解决:
mysql中提供了一个sql语
Android xml资源文件中@、@android:type、@*、?、@+含义和区别
Cb123456
@+ @ ? @*
一.@代表引用资源
1.引用自定义资源。格式:@[package:]type/name
android:text="@string/hello"
2.引用系统资源。格式:@android:type/name
android:textColor="@android:color/opaque_red"
数据结构的基本介绍
天子之骄
数据结构 散列表 树、图 线性结构 价格标签
数据结构的基本介绍
数据结构就是数据的组织形式,用一种提前设计好的框架去存取数据,以便更方便,高效的对数据进行增删查改。正确选择合适的数据结构,对软件程序的高效执行的影响作用不亚于算法的设计。此外,在计算机系统中数据结构的作用也是非同小可。例如常常在编程语言中听到的栈,堆等,就是经典的数据结构。
经典的数据结构大致如下:
一:线性数据结构
(1):列表
a
通过二维码开放平台的API快速生成二维码
一炮送你回车库
api
现在很多网站都有通过扫二维码用手机连接的功能,联图网(http://www.liantu.com/pingtai/)的二维码开放平台开放了一个生成二维码图片的Api,挺方便使用的。闲着无聊,写了个前台快速生成二维码的方法。
html代码如下:(二维码将生成在这div下)
? 1
&nbs
ImageIO读取一张图片改变大小
3213213333332132
java IO image BufferedImage
package com.demo;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @Description 读取一张图片改变大小
* @author FuJianyon
myeclipse集成svn(一针见血)
7454103
eclipse SVN MyEclipse
&n
装箱与拆箱----autoboxing和unboxing
darkranger
J2SE
4.2 自动装箱和拆箱
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
4.2.1 autoboxing和unboxing
在Java中,所有要处理的东西几乎都是对象(Object)
ajax传统的方式制作ajax
aijuans
Ajax
//这是前台的代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+
只用jre的eclipse是怎么编译java源文件的?
avords
java eclipse jdk tomcat
eclipse只需要jre就可以运行开发java程序了,也能自动 编译java源代码,但是jre不是java的运行环境么,难道jre中也带有编译工具? 还是eclipse自己实现的?谁能给解释一下呢问题补充:假设系统中没有安装jdk or jre,只在eclipse的目录中有一个jre,那么eclipse会采用该jre,问题是eclipse照样可以编译java源文件,为什么呢?
&nb
前端模块化
bee1314
模块化
背景: 前端JavaScript模块化,其实已经不是什么新鲜事了。但是很多的项目还没有真正的使用起来,还处于刀耕火种的野蛮生长阶段。 JavaScript一直缺乏有效的包管理机制,造成了大量的全局变量,大量的方法冲突。我们多么渴望有天能像Java(import),Python (import),Ruby(require)那样写代码。在没有包管理机制的年代,我们是怎么避免所
处理百万级以上的数据处理
bijian1013
oracle sql 数据库 大数据 查询
一.处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 o
mac 卸载 java 1.7 或更高版本
征客丶
java OS
卸载 java 1.7 或更高
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
成功执行此命令后,还可以执行 java 与 javac 命令
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
成功执行此命令后,还可以执行 java
【Spark六十一】Spark Streaming结合Flume、Kafka进行日志分析
bit1129
Stream
第一步,Flume和Kakfa对接,Flume抓取日志,写到Kafka中
第二部,Spark Streaming读取Kafka中的数据,进行实时分析
本文首先使用Kakfa自带的消息处理(脚本)来获取消息,走通Flume和Kafka的对接 1. Flume配置
1. 下载Flume和Kafka集成的插件,下载地址:https://github.com/beyondj2ee/f
Erlang vs TNSDL
bookjovi
erlang
TNSDL是Nokia内部用于开发电信交换软件的私有语言,是在SDL语言的基础上加以修改而成,TNSDL需翻译成C语言得以编译执行,TNSDL语言中实现了异步并行的特点,当然要完整实现异步并行还需要运行时动态库的支持,异步并行类似于Erlang的process(轻量级进程),TNSDL中则称之为hand,Erlang是基于vm(beam)开发,
非常希望有一个预防疲劳的java软件, 预防过劳死和眼睛疲劳,大家一起努力搞一个
ljy325
企业应用
非常希望有一个预防疲劳的java软件,我看新闻和网站,国防科技大学的科学家累死了,太疲劳,老是加班,不休息,经常吃药,吃药根本就没用,根本原因是疲劳过度。我以前做java,那会公司垃圾,老想赶快学习到东西跳槽离开,搞得超负荷,不明理。深圳做软件开发经常累死人,总有不明理的人,有个软件提醒限制很好,可以挽救很多人的生命。
相关新闻:
(1)IT行业成五大疾病重灾区:过劳死平均37.9岁
读《研磨设计模式》-代码笔记-原型模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* Effective Java 建议使用copy constructor or copy factory来代替clone()方法:
* 1.public Product copy(Product p){}
* 2.publi
配置管理---svn工具之权限配置
chenyu19891124
SVN
今天花了大半天的功夫,终于弄懂svn权限配置。下面是今天收获的战绩。
安装完svn后就是在svn中建立版本库,比如我本地的是版本库路径是C:\Repositories\pepos。pepos是我的版本库。在pepos的目录结构
pepos
component
webapps
在conf里面的auth里赋予的权限配置为
[groups]
浅谈程序员的数学修养
comsci
设计模式 编程 算法 面试 招聘
浅谈程序员的数学修养
批量执行 bulk collect与forall用法
daizj
oracle sql bulk collect forall
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎。通常可以在SELECT INTO、
FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT。本文将逐一描述BULK COLLECT在这几种情形下的用法。
有关FORALL语句的用法请参考:批量SQL之 F
Linux下使用rsync最快速删除海量文件的方法
dongwei_6688
OS
1、先安装rsync:yum install rsync
2、建立一个空的文件夹:mkdir /tmp/test
3、用rsync删除目标目录:rsync --delete-before -a -H -v --progress --stats /tmp/test/ log/这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
Yii CModel中rules验证规格
dcj3sjt126com
rules yii validate
Yii cValidator主要用法分析:
yii验证rulesit 分类: Yii yii的rules验证 cValidator主要属性 attributes ,builtInValidators,enableClientValidation,message,on,safe,skipOnError
基于vagrant的redis主从实验
dcj3sjt126com
vagrant
平台: Mac
工具: Vagrant
系统: Centos6.5
实验目的: Redis主从
实现思路
制作一个基于sentos6.5, 已经安装好reids的box, 添加一个脚本配置从机, 然后作为后面主机从机的基础box
制作sentos6.5+redis的box
mkdir vagrant_redis
cd vagrant_
Memcached(二)、Centos安装Memcached服务器
frank1234
centos memcached
一、安装gcc
rpm和yum安装memcached服务器连接没有找到,所以我使用的是make的方式安装,由于make依赖于gcc,所以要先安装gcc
开始安装,命令如下,[color=red][b]顺序一定不能出错[/b][/color]:
建议可以先切换到root用户,不然可能会遇到权限问题:su root 输入密码......
rpm -ivh kernel-head
Remove Duplicates from Sorted List
hcx2013
remove
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,Given 1->1->2, return 1->2.Given 1->1->2->3->3, return&
Spring4新特性——JSR310日期时间API的支持
jinnianshilongnian
spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
浅谈enum与单例设计模式
247687009
java 单例
在JDK1.5之前的单例实现方式有两种(懒汉式和饿汉式并无设计上的区别故看做一种),两者同是私有构
造器,导出静态成员变量,以便调用者访问。
第一种
package singleton;
public class Singleton {
//导出全局成员
public final static Singleton INSTANCE = new S
使用switch条件语句需要注意的几点
openwrt
c break switch
1. 当满足条件的case中没有break,程序将依次执行其后的每种条件(包括default)直到遇到break跳出
int main()
{
int n = 1;
switch(n) {
case 1:
printf("--1--\n");
default:
printf("defa
配置Spring Mybatis JUnit测试环境的应用上下文
schnell18
spring mybatis JUnit
Spring-test模块中的应用上下文和web及spring boot的有很大差异。主要试下来差异有:
单元测试的app context不支持从外部properties文件注入属性
@Value注解不能解析带通配符的路径字符串
解决第一个问题可以配置一个PropertyPlaceholderConfigurer的bean。
第二个问题的具体实例是:
Java 定时任务总结一
tuoni
java spring timer quartz timertask
Java定时任务总结 一.从技术上分类大概分为以下三种方式: 1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务; 说明: java.util.Timer定时器,实际上是个线程,定时执行TimerTask类 &
一种防止用户生成内容站点出现商业广告以及非法有害等垃圾信息的方法
yangshangchuan
rank 相似度计算 文本相似度 词袋模型 余弦相似度
本文描述了一种在ITEYE博客频道上面出现的新型的商业广告形式及其应对方法,对于其他的用户生成内容站点类型也具有同样的适用性。
最近在ITEYE博客频道上面出现了一种新型的商业广告形式,方法如下:
1、注册多个账号(一般10个以上)。
2、从多个账号中选择一个账号,发表1-2篇博文