Zzzang
发布于 2019-05-10   30人围观   1条评论

转载 - 图解Java常用数据结构(一) - 大道方圆 - 博客园
https://www.cnblogs.com/xdecode/p/9321848.html

基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList LinkedHashMap中的双向列表不再是回环的.HashMap中的单链表是尾插, 而不是头插入等等..

本文目录结构如下:

图片

LinkedList (双链表)

经典的双链表结构, 适用于乱序插入,删除.指定序列操作则性能不如ArrayList,这也是其数据结构决定的.

add(E) / addLast(E)
图片标题

add(index, E)

这边有个小的优化, 他会先判断index是靠近队头还是队尾, 来确定从哪个方向遍历链入.

  1. if (index < (size >> 1)) {
  2. Node<E> x = first;
  3. for (int i = 0; i < index; i++)
  4. x = x.next;
  5. return x;
  6. } else {
  7. Node<E> x = last;
  8. for (int i = size - 1; i > index; i--)
  9. x = x.prev;
  10. return x;
  11. }

靠近队头
图片
靠队尾
图片

get(index)

也是会先判断index, 不过性能依然不好, 这也是为什么不推荐用for(int i = 0; i < lengh; i++)的方式遍历linkedlist, 而是使用iterator的方式遍历.

图片
图片
remove(E)
图片
  

ArrayList (数组)

底层就是一个数组, 因此按序查找快, 乱序插入, 删除因为涉及到后面元素移位所以性能慢.

图片
扩容

  一般默认容量是10, 扩容后, 会length*1.5倍

图片
remove(E)

循环遍历数组, 判断E是否equals当前元素, 删除

查看更多
发布于 2019-05-07   25人围观   0条评论

1.VisualVM连接远程Java虚拟机配置

0.拷贝默认密码权限配置文件

cp $JAVA_HOME/jre/lib/management/jmxremote.password.template jmxremote.password
cp $JAVA_HOME/jre/lib/management/jmxremote.access jmxremote.access

  1. `vi jmxremote.password`
  2. 取消以下两行注释
  3. #monitorRole QED
  4. #controlRole R&D

0.1,修改权限
chmod 600 jmxremote.password
chmod 600 jxmremote.access

1.配置catalina.sh文件

  1. CATALINA_OPTS='-Djava.rmi.server.hostname=192.168.1.1
  2. -Dcom.sun.management.jmxremote
  3. #设置远程监控端口
  4. -Dcom.sun.management.jmxremote.port=8999
  5. #开启用户名和密码验证
  6. -Dcom.sun.management.jmxremote.authenticate=true
  7. #加载密码设置文件
  8. -Dcom.sun.management.jmxremote.password.file=/data/woke/tomcat/tomcat-bss0-18000-8080-8000/conf/jmxremote.password
  9. #加载授权设置
  10. -Dcom.sun.management.jmxremote.access.file=/data/woke/tomcat/tomcat-bss0-18000-8080-8000/conf/jmxremote.access
  11. -Dcom.sun.management.jmxremote.ssl=false' #不进行ssl通信

重启tomcat,使用restart.sh命令
1.VisualVM添加远程主机IP地址
title
2.子节点右键 -> 添加JMX连接
title
3.连接成功界面
title

Visual GC插件,很遗憾,提示"不受此JVM

查看更多
发布于 2019-05-07   24人围观   2条评论

IDEA Remote Debug By Tomcat(War) or SpringBoot(Jar)

IDEA远程调试 (简单版3-4步)
注: 提前检查防火墙端口拦截

1.创建Remote配置

title

2.配置Host Port module-classpath

title

白图注释:

  • 白图标注 2:jar专用探头jvm参数,tomcat不可直接引用
    jar:-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
    tomcat:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
    title

黑图注释:

  • 标注 1:运行远程 JVM 的命令行参数;
    • (jdk1.5-8)Tomcat中catalina.sh下插入
      export JAVA_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005'
    • springboot jar包下
      java "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" -jar xxx.jar
  • 标注 2:传输方式,默认为Socket;
    • Socket:macOS 及 Linux 系统使用此种传输方式;
    • Shared memory: Windows 系统使用此种传输方式。
  • 标注 3:调试模式,默认为Attach
    • Attach:此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;
    • Listen: 此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。
  • 标注 4:服务器 IP 地址,默认为localhost,需要修改为目标服务器的真实 IP 地址;
  • 标注 5:服务器端口号,默认为5005,需要修改为目标服务器的真实端口号;
  • 标注 6:搜索资源是使用的环境变量,默认为<whole project>,即整
查看更多
发布于 2019-04-26   8人围观   0条评论
  1. #绑定ip 默认安全本地127.0.0.1
  2. bind 0.0.0.0
  3. protected-mode yes
  4. #端口
  5. port 6379
  6. #后台守护线程运行
  7. daemonize yes
  8. supervised no
  9. #pid文件
  10. pidfile /var/run/redis_6379.pid
  11. loglevel notice
  12. logfile ""
  13. #数据库个数
  14. databases 16
  15. always-show-logo yes
  16. #秒级持久化策略
  17. save 900 1
  18. save 300 10
  19. save 60 10000
  20. stop-writes-on-bgsave-error yes
  21. rdbcompression yes
  22. rdbchecksum yes
  23. dbfilename dump.rdb
  24. dir ./
  25. #从库策略
  26. slave-serve-stale-data yes
  27. slave-read-only yes
  28. repl-diskless-sync no
  29. repl-diskless-sync-delay 5
  30. repl-disable-tcp-nodelay no
  31. slave-priority 100
  32. requirepass 密码
  33. lazyfree-lazy-expire no
  34. lazyfree-lazy-server-del no
  35. slave-lazy-flush no
  36. appendonly no
  37. appendfilename "appendonly.aof"
  38. appendfsync everysec
  39. no-appendfsync-on-rewrite no
  40. auto-aof-rewrite-percentage 100
  41. auto-aof-rewrite-min-size 64mb
  42. aof-load-truncated yes
  43. aof-use-rdb-preamble no
  44. lua-time-limit 5000
  45. slowlog-log-slower-than 10000
  46. slowlog-max-len 128
  47. latency-monitor-threshold 0
  48. notify-keyspace-events ""
  49. hash-max-ziplist-entries 512
  50. hash-max-ziplist-value 64
  51. list-max-zipli
查看更多
发布于 2019-04-25   17人围观   0条评论

客服系统

目录

|---1 Maven安装及配置 4
|---1.1 Maven安装 4
|---1.2 Maven基础配置 4
|---1.2.1 使用Maven编译运行优客服项目 5
|---1.2.2 pom.xml详细配置 6
|---1.2.3 安装依赖的JAR包 6
|---1.2.4 使用Maven编译系统项目 8
|---1.2.5 运行系统项目 9
|---1.2.6 运行系统项目 10
|---1.3 MyEclipse2014安装配置 11
|---1.3.1 MyEclipse2014安装 11
|---1.3.2 MyEclipse2014中Maven配置 11
|---1.4 系统项目工程Maven化 18
|---1.4.1 Maven标准目录结构说明 18
|---1.4.2 pom.xml详细配置 19
|---1.4.3 在MyEclipse中导入工程 19
|---1.4.4 运行系统项目 22 2 选读内容(maven使用配置及命令) 26
|------2.1 pom.xml配置说明 26
|------2.2 maven命令使用 58 3 服务器运行环境搭建 64
|------------3.1 工具下载 64
|------------3.1.1 下载xftp和xshell这两个软件 64
|------------3.1.2 连接服务器 64
|------------3.2 安装JDK 66
|------------3.3 安装Tomcat 67
|------------3.3.1 下载tomcat 67
|------------3.3.2 Tomcat配置 68
|------------3.3.3 jvm性能参数优化 70
|------------3.3.4 将tomcat部署到服务器 74
|------------3.3.5 启动tomc

查看更多
发布于 2019-04-18   41人围观   0条评论

finally有return 始终返回finally中的return 抛弃 try 与catch中的return

情况1:try{} catch(){}finally{} return x;

  1. try{} catch(){}finally{} return x;
  2. 1 -> 2 -> 3 -> 4

情况2:try{ return x; }catch(){} finally{} return y;

  1. try{ return x; }catch(){} finally{} return y;
  2. try -> x计算[临时栈存]->finally ->return x的结果

情况3:try{ } catch(){return x;} finally{} return y;

  1. try -> catch ->异常catch -> x计算[临时栈存]-> finally -> return x的结果;
  2. 无异常 -> finally -> return y;

情况4:try{ return x; }catch(){} finally{return y;}

  1. try -> x计算[临时栈存] ->finally ->return y

情况5:try{} catch(){return x;}finally{return y;}

  1. try -> catch捕获 -> x计算[临时栈存] ->finally ->return y

情况6:try{ return x;}catch(){return z;} finally{return y;}

  1. try->x计算[临时栈存]->异常catch捕获-> z计算[临时栈存]->finally->return y;
  2. 无异常 -> finally -> return y;

eg1:finally无返回

int x = 1; try{x++; return x;} finally{++x;}
x = 2 ;

x计算后的值不会被finally改变
进入finally会提前栈保存ret

查看更多
发布于 2019-04-09   31人围观   0条评论
  1. #!/bin/sh
  2. #nohup java -Xmx250m -Xms250m -XX:+UseG1GC -jar system-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev >jar_log.out 2>&1 &
  3. #上级文件地址
  4. DIR=/data/woke/tomcat/springboot-manager
  5. #Jar包
  6. APP_NAME=$DIR/system-0.0.1-SNAPSHOT.jar
  7. #springboot环境配置文件
  8. APP_ENV=dev
  9. #使用说明,用来提示输入参数
  10. usage() {
  11. echo "Usage: sh springboot_jar_restart.sh [start|stop|restart|status]"
  12. exit 1
  13. }
  14. #检查程序是否在运行
  15. is_exist(){
  16. pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
  17. #如果不存在返回1,存在返回0
  18. if [ -z "${pid}" ]; then
  19. return 1
  20. else
  21. return 0
  22. fi
  23. }
  24. #启动方法
  25. start(){
  26. is_exist
  27. if [ $? -eq 0 ]; then
  28. echo "${APP_NAME} is already running. pid=${pid}"
  29. else
  30. nohup java -Xmx250m -Xms250m -XX:+UseG1GC -jar ${APP_NAME} --spring.profiles.active=${APP_ENV} >jar_log.out 2>&1 &
  31. fi
  32. }
  33. #停止方法
  34. stop(){
  35. is_exist
  36. if [ $? -eq "0" ]; then
  37. kill -9 $pid
  38. else
  39. echo "${APP_NAME} is not running"
  40. fi
  41. }
  42. #输出运行状态
  43. status(){
  44. is_exist
  45. if [ $? -eq "0" ]; then
  46. echo "${APP_NAME} is r
查看更多
发布于 2019-03-18   14人围观   0条评论

建造者使用案例 eg:

  1. package com.xxx.report.pojo.baidutongji.api;
  2. import com.xxx.report.util.DateTimeUtil;
  3. import org.springframework.beans.BeanUtils;
  4. import java.time.LocalDate;
  5. import java.util.Arrays;
  6. public class BaidutongjiRequestBodyBuilder {
  7. /** 站点id */
  8. private String site_id;
  9. /** 查询起始时间,例:20160501 */
  10. private String start_date;
  11. /** 对比查询起始时间 */
  12. private String start_date2;
  13. /** 查询结束时间,例:20160531 */
  14. private String end_date;
  15. /** 对比查询结束时间 */
  16. private String end_date2;
  17. /** 单次获取数据条数, 用于分页;默认是20; 0表示获取所有数据 */
  18. private Integer max_result = 0;
  19. /** 时间粒度(只支持有该参数的报告): day / hour / week / month */
  20. private String gran;
  21. /** 通常对应要查询的报告 */
  22. private String method;
  23. /** 自定义指标选择, 多个指标用逗号分隔 */
  24. private String metrics;
  25. /** 指标排序, 示例:visitor_count,desc */
  26. private String order;
  27. /** 获取数据偏移, 用于分页;默认0 */
  28. private Integer start_index;
  29. /* --------------------------- 筛选参数, 不是必填项 ----------------------
查看更多
发布于 2019-03-18   10人围观   0条评论

“横放着的金字塔”一样的if else嵌套:

  1. if (true) {
  2. if (true) {
  3. if (true) {
  4. if (true) {
  5. if (true) {
  6. if (true) {
  7. }
  8. }
  9. }
  10. }
  11. }
  12. }

我并没夸大其词,我是真的遇到过了!嵌套6、7层,一个函数几百行,简!直!看!死!人!
if else作为每种编程语言都不可或缺的条件语句,我们在编程时会大量的用到。但if else一般不建议嵌套超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。所以,我们程序员都应该尽量避免过多的if else嵌套。下面将会谈谈我在工作中如何减少if else嵌套的。

在谈我的方法之前,不妨先用个例子来说明if else嵌套过多的弊端。
想象下一个简单分享的业务需求:支持分享链接、图片、文本和图文,分享结果回调给用户(为了不跑题,这里简略了业务,实际复杂得多)。当接手到这么一个业务时,是不是觉得很简单,稍动下脑就可以动手了:
先定义分享的类型、分享Bean和分享回调类:

  1. private static final int TYPE_LINK = 0;
  2. private static final int TYPE_IMAGE = 1;
  3. private static final int TYPE_TEXT = 2;
  4. private static final int TYPE_IMAGE_TEXT = 3;
  5. public class ShareItem {
  6. int type;
  7. String title;
  8. String content;
  9. String imagePath;
  10. String link;
  11. }
  12. public interface ShareListener {
  13. int STATE_SUCC = 0;
  14. int STATE_FAIL = 1;
  15. vo
查看更多
发布于 2019-03-18   13人围观   0条评论

策略模式

策略模式是对算法的封装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。
策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。
title

eg.1 /示例1

会员等级阶梯价格策略

1.策略接口 Strategy

  1. package org.apel.bowen.controller;
  2. import java.math.BigDecimal;
  3. /**计算价格的接口*/
  4. public interface Strategy {
  5. /**
  6. * 计算价格
  7. * @return
  8. */
  9. public BigDecimal calculatePrice();
  10. }

2.实现接口 StrategyImpl

  1. package org.apel.bowen.controller;
  2. import java.math.BigDecimal;
  3. import org.springframework.stereotype.Service;
  4. //普通用户
  5. @Service("generalMember")
  6. public class GeneralMember implements Strategy{
  7. @Override
  8. public BigDecimal calculatePrice() {
  9. return new BigDecimal("100");
  10. }
  11. }
  12. //vip用户
  13. @Service("vipMember")
  14. public class VipMember implements Strategy{
  15. @Override
  16. public BigDecimal calculatePrice() {
  17. return new BigDecimal("80");
  18. }
  19. }
  20. //超级会员
  21. @Service("superMember")
  22. public class SuperMember implements Strategy{
  23. @Override
  24. public BigDecimal calculatePrice() {
  25. return ne
查看更多