数据结构与算法基础--数据结构分类
一、数据结构的分类 按逻辑结构分类 集合 线性结构 非线性结构 按存储结构分类: 顺序存储 链式存储 索引存储 散列存储 二、顺序表 存储空间连续 三、链表 存储空间不连续 3.1 单链表 3.2 循环链表 3.3 双链表 四、顺序表和链表的比较
一、数据结构的分类 按逻辑结构分类 集合 线性结构 非线性结构 按存储结构分类: 顺序存储 链式存储 索引存储 散列存储 二、顺序表 存储空间连续 三、链表 存储空间不连续 3.1 单链表 3.2 循环链表 3.3 双链表 四、顺序表和链表的比较
1、建立共享目录 在windows上建立共享目录 高级共享管理中开启以下配置 2、centos安装samba yum install samba samba-client 3、查看windows共享目录 这里的ip是虚拟机宿主机的IP,后面是访问的用户名%密码 smbclient -L IP -U 用户名%密码 4、访问windows指定共享目录 smbclient //IP/windows建立的共享目录名称 -U windows登录用户名%密码 5、将目录直接挂载到虚拟机中 mount -t cifs -o username="windows用户名",password="密码" //宿主机IP/共享文件夹名称 /挂再到linux的指定目录 到这里修改windows下的目录,在linux配置的挂载目录下也能看到修改了 6、取消挂载 umount linux上挂载的文件路径 so easy~
1、安装vsftpd配置默认启动 yum -y install vsftpd systemctl enable vsftpd.service 2、配置文件 vi /etc/vsftpd/vsftpd.conf 根据自己的需求进行配置 3、添加用户分配权限 useradd ftpuser passwd ftpuser chown -R ftpuser /home/ftpuser/data/ 4、防火墙 ftp端口默认21 firewall-cmd --permanent --zone=public --add-port=21/tcp firewall-cmd --reload 5、启动/关闭ftp systemctl start/stop vsftpd 6、查看服务状态 service vsftpd status 7、win10上测试 ftp ip地址
1、简介 Java有四种锁状态:无锁、偏向锁、轻量锁、重量锁,锁可以逐渐升级,但是不可以降级。 2、锁状态 在Java中对象的锁存储在对象头Mark Word中(该字段存储对象的hashcode或者锁信息) 2.1、偏向锁 2.1.1、获取 当一个线程访问同步代码块并获取锁的时候,会在对象头和栈帧中的锁记录里存储偏向锁的线程ID,以后该线程在进入和退出同步块时,不需要进行CAS加锁和解锁,会查询对象头中Mark Word是否存储着指向该线程的偏向锁,如果成功,表示线程已经获得了锁。如果失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程; 2.1.2、撤销 当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放偏向锁。当另一个线程试图访问偏向锁时,会首先暂停拥有偏向锁的进程,如果线程没有运行,则将对象锁的对象头设置为无锁状态。如果线程正在运行,则会暂停该线程,恢复到无锁状态,或者标记对象不适合作为偏向锁,最后唤醒该线程。 2.1.3、优缺点 偏向锁适用于大多数时候....
volatile允许线程访问这个共享变量,一个字段被声明为volatile,则java内存模型确保所有线程看到这个变量的值是一致的。 有volatile变量修饰的共享变量进行写操作的时候会触发以下两件事: 1.将当前缓存行的数据写回到系统内存; 2.这个写回内存的操作,使其他处理器缓存的该数据的内存地址失效。 如果对声明了volatile的变量进行写操作,JVM会将这个变量所在缓存行的数据写回到系统内存,之后其他处理器通过嗅探在缓存总线上传播的数据看自己缓存的数据是否过期,当处理器发现缓存行对应的数据被修改,就会将这个数据所在的缓存行设置为无效状态,当处理器对这个缓存行重新进行操作时,会重新从系统内存读取该数据到缓存行。
引入maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>examples</artifactId> <groupId>cn.com.wyl</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>struts....
action配置多个路径 配置xml <package name="helloAction" extends="struts-default,json-default" namespace="/myHello" > <action name="helloWorld" class="helloAction"> <result name="helloPage">/WEB-INF/hello.jsp</result> <result name="sayHello" type="json"> <param name="root">user</param> </result> </action> </package> 在action中定义多个result,如上,第一个路径返回的是页面,第二个路径返回了一个json数据 action配置 action中也要配置对应的方法 import cn.com.wyl.examples.struts.entity.User; import ....
1、web.xml中指定位置 此处,我只修改了struts.xml文件的位置,structs默认是从WEB-INF的classes目录下加载配置文件的,对应打包后的路径,自己根据需求修改即可 <!-- struts配置 --> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,struts/struts.xml</param-value> </init-param> </filter> <filter-map....
1、错误信息 2、问题跟踪及处理 可以看到,这个方法传递了一个Class对象和类加载器和一个字段给clearMap方法 进入clearMap方法,方法根据class对象获取属性,此时报出了属性找不到的错误 打开tomcat的源码查看这个被反射的类org.apache.catalina.loader.WebappClassLoader(tomcat源码地址) 在这个类中发现,他继承了org.apache.catalina.loader.WebappClassLoaderBase,自己本身没有定义属性 进入WebappClassLoaderBase类中,可以找到resourceEntries字段 查看WebappClassLoaderBase的注释信息发现从7.0.64往后的版本,添加了WebappClassLoaderBase用来作为类加载器 此时有两个解决方案,一是对structs版本升级,但是这样的话,对应的其他依赖版本也要升级,代价太大,第二个方法较为简单,直接更换tomcat版本使其版本号<7.0.64即可,我换了7.0.63就正常了
前前后后思考了许久,总想写点什么,最后却又不知从何说起,就简单的聊聊这一年吧。 关于疫情 很久之前,其实也就是十余年前,也经历过一场疫情(非典),但当时人在老家消息闭塞加之正当年幼,对其没有什么直观的了解与认识,直到今年的疫情突然爆发,才对这些仿佛一直潜伏在身边的疾病有了模糊的认识。任然记得铺天盖地都是关于疫情的新闻报导,甚至远在农村的老家,也开始了封闭隔离,早早就回到昆明的我吃了将近一个月的泡面,曾经喧嚣的大街小巷也是门窗紧闭、不见人影,直到五月份后才逐渐恢复昔日的景象,到了年末,在各方努力下,国内的情况已经趋于稳定,但是任然不可松懈。在这场疫情中见证了一个国家、一个名族的精气神,相信未来我们终将战胜疫情,有更安全的生活环境。 关于生活 引用一句话:过日子就是问题叠着问题,我们唯一能做的,就是面对这个问题。 最后 今年经历了许多事情令人难以忘怀,失去了很多,曾经的梦想也逐渐远去,但也是自己的信念也更加坚定,对自己的人生有了更深感悟,对未来有了更清晰的认识和规划。 最后附上一段话自勉: 盖茨比信奉的那盏绿灯,是年复一年在我们眼前渐渐消失的极乐未来。我们始终追它不上,但没....
今天接到任务,需要对一个web项目进行结构整改,该项目运行再tomcat中,启动的时候,一个报端口被占用 运行命令查看1099端口,发现没有程序再使用这个端口 netstat -ano | findstr 1099 最后发现是因为自己装了一个docker,启用了hype-v占用了端口 netsh interface ipv4 show excludedportrange protocol=tcp 此时更换一个没有被占用的端口、或者关闭hype-v、或者让hype-v不占用这个端口都是可行的。 可以使用下面的命令开放该端口: netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1 参考:https://github.com/docker/for-win/issues/3171
mvn install:install-file -Dfile=jar包的路径 -DgroupId=groupId -DartifactId=artifactId -Dversion=版本号 -Dpackaging=jar 执行后,再maven中添加依赖即可; 再改造老项目的时候,会遇到一种情况,项目的开发者再使用jar包的时候,没有使用maven(或其他依赖软件)做依赖管理,此时,若要对老项目进行改造,这些依赖的引入就成了一个问题,如果是常见的类,大概都能判断使用的是哪个依赖,直接引入,但是有些项目使用的依赖很小众,甚至再maven仓库中都找不到,此时就需要自己安装到本地仓库,此时,我么可以将所有的jar解压到本地的一个文件夹中,然后使用everything搜索哪个jar中含有自己的类,就把这个jar安装到本地仓库,这样一个一个的对着找。 例如: 我们现在有个一类不知道是属于哪个jar包的 到everything中搜索结果如下: 发现第一个class所在的包,路径也和代码中的匹配,就将这个依赖,安装到本地仓库,再引入就可以了
筹备了多天的婚礼,今天终于到了举办的时候,早上起来,本来要去吃饭,但是那边人太多,决定自己在家里做了吃完再去了。 很久没有自己做饭了,味道确实不咋地,还好提前买了一只烤鸭镇场子。 吃完饭,开着神车拉着从老家来的亲戚和婚礼用的杂物一路走走停停的开到了官渡大酒店 到酒店联系了工作人员,把东西搬到了餐厅,开始布置。 期间,某亲戚表示想去官渡森林公园看看,于是乎。。。。 没过多久就自己先回酒店了,一来确实索然无味,二来总不能一整个下午都和这些60后厮混,还是要去找自己的组织。 回到酒店基本的布局已经完成,门口也装饰好了,饮料也分配完毕。 新郎新娘也开始了最后的彩排。 当然,咱也不能闲着,马上给各位宾客安排上了饭前中后甜点(今晚最受欢迎的菜品了,一群老哥吞云吐雾,宛若仙境) 下午四点左右,开始迎接宾客的到来,两家人在楼下来了一个热切的合照(对不起,手机太辣鸡,最后一个人只拍了半只手,但是他的精神是和大家在一起的)。 六点半,在婚庆礼炮喷射散落而出的彩弹和掌声中,这对新人步向了主持台,也迈向了新的人生篇章。 两人在台上交换了戒指,对彼此许下了一生的承诺。 至此,这场婚礼的仪式也基本结束了,该吃吃,....
简介 nio主要是通过WatchService、Watchkey和Path来实现文件的监控; 代码实现 public class FileMonitor { private WatchService watcher; public FileMonitor(String directory) throws IOException { watcher = FileSystems.getDefault().newWatchService(); Path path = Paths.get(directory); path.register(watcher, ENTRY_CREATE, ENTRY_MODIFY,ENTRY_DELETE); } @SuppressWarnings("InfiniteLoopStatement") public void watchFile() throws InterruptedException{ while (true) { WatchKey key = watcher.take(); for (WatchEvent<?> event : key....
1、简介 委派模式对外隐藏具体实现细节,将任务委派给具体的实现类,spring mvc的DispatcherServlet就是使用了委派模式,根据不同的路径,来调用具体对应的HandlerAdapter。 例如,一个部门由部门经理,程序员和设计师三个角色,程序员和设计师负责具体的工作,部门经理根据不同的任务来选择程序员或者设计师来执行。 2、建立任务执行者 public interface User { public void work(); } public class Programmer implements User { @Override public void work() { System.out.println("java工程师开始工作"); } } public class Designer implements User { @Override public void work() { System.out.println("架构设计师开始工作"); } } 3、建立任务分发者 public class DepartmentManager { private ....