有状态和无状态对象
这个概念在多线程中一直被提及,实际上很简单。1.有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
2.无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。
3.引用无状态的对象,则自己也可以是线程安全的
1234public class StatelessBeanService { // 虽然有billDao属性,但billDao是没有状态信息的,是Stateless Bean. BillDao billDao;}
java-解决jar包反射获取不到类
前言在开发一个基础工具包给业务组的小伙伴们使用的时候,发现一个小问题,就是在反射的时候在自己电脑上运行的正常,但是打成jar包后,就class not fuond,有点奇怪。如果能借助Spring这个都不是事,关键是不能用。
场景复现下面的目的是,找到这个指定包下的所有类,对我指定了注解的类进行加载,其实就是一个可以灵活装配、拆卸的策略模式。这样业务的类可以通过指定注解来选择是否成为业务的一部分。下面这段代码在IDE中运行正常。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293import java.io.File;import java.io.IOException;import java.io.InputStream;import java.net.JarURLConnection ...
设计模式-单例模式
单例模式什么是单例模式?单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。特点:
一个类只能有一个实例
自己创建这个实例
整个系统都要使用这个实例
什么时候用单例模式?用我的话说
只用一个实例就能解决问题的时候,没必要创建多个实例的时创建数据库连接池对象一个就够了
操作打印机的时候一台打印机总不能让所有人同时去操作,确保只有一个实例,每次只能被一个人调用该实例。
饿汉模式优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程并发问题。缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
但是说人话,如果这个对象最终一定会被使用到,最好是用饿汉模式,避免线程并发问题。但是如果就是想追求这么点性能要求,也不是不可以用懒汉模式。
12345678public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){& ...
算法 二叉树的构建和查找
前言对二叉树有一定了解之后,学习一下对二叉树的操作,有时候这些东西一学就忘,反复操作几回就熟了。二叉树的概念已经了解了,那么得知道怎么操作。现在就讲讲怎么操作二叉树。
构建二叉树首先得先种一颗树,然后才能操作树。怎么构建?有哪些对象、需要什么方法?
主要对象
Node 节点对象
BinaryTree 树对象
Node 节点对象作用:存数据的。大白话就是树中的每一个节点,存着外面进来的数据。最简单的理解就是HashMap就是一颗树的实现,每次不明白,就想想HashMap,是不是就通了。
四个关键要素:
left
right
key
value
BinaryTree 对象作用:操作node节点数据,维护树结构。大白话,就是把Node拼起来,成为一颗大树。主要操作:
put
get
delete
size
min
max
put 完以后要返回整棵树,开始是始于 root,返回也是返回 root。
实现实现就是把Node和BinaryTree这两结合起来用,还用的没问题。需要考虑几个问题:
怎么结合起来用
从哪开始写
怎么结合起来用?即然要操作,那就需要对外暴露操作接口Binar ...
数据结构--红黑树
概念前面对树已经有了一个认识,现在看下红黑树的定义。开始之前提几个问题:
什么是红黑树
有什么用
怎么实现
优缺点
什么是红黑树红黑树: 又叫二叉平衡树红黑树又红又黑,真正的意义是什么?为什么要红一下黑一下?
会左旋 和 右旋,不会出现单边增长太多,会平衡。
红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
有什么用
为了实现快速定位而设计的算法。
几乎所有基于二叉树的算法,都是基于二分法进行查找的,只要数据100%是按照一定顺序排列的,那么就可以被二分法查找。
假疫有10亿数据只需要不到30次比较就能查找到目标。
二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。
红黑树特点:
节点要么红、要么黑
根节点是黑色
叶节点null,都是黑色
每个红色节点 ...
算法--二叉树
树即经典实用,又非常有助于学习算法。
前言二叉树是一个经典的数据结构,通过学习二叉树可以往后扩展学习更多类型的树。这里要强调几点:
树是逻辑上定义的数据结构,哪怕只有一个节点也可以称之为树。
不要慌,二叉树实际上比你想像的要容易上手。
这篇文章先讲概念,再讲实现。
二叉树二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:
任意节点左子树不为空,则左子树的值均小于根节点的值;
任意节点右子树不为空,则右子树的值均大于于根节点的值;
任意节点的左右子树也分别是二叉查找树;
没有键值相等的节点;
不区分左右节点的值谁比谁大。叶子节点:没有子节点的节点。由于出版的问题,节点 和 结点 是一个意思。
二叉树五种状态树的五种状态要这样理解:为了抽象出树的各种情况下树当时的状态,而进行的命名。实际上就是当前树被操作当前状态。
空树: 就是null,一般是在操作中删完了。
单节点树:只有一个根结点的二叉树
只有左子树
只有右子树
满二叉树:每一次结构都达到最大值。就是完美状态总节点数=2^n-1,n 为层数。(等比数列求和)
完全二权树:叶子节点只能出 ...
算法--树的定义
前言
树是一种逻辑上的概念,切记,这会帮助你理解。
学习算法过程中你不得立即获得正向反馈,这就是学习无奈的地方,学习更像是一种投资。不要觉得学习带有功利性不好,努力考上一个好大学,找到好工作也是一种功利性,只是平时不愿意承认。学习算法也是,你可以找到好工作,这是一种长期投资。坚持下去。
树
树是一种逻辑上的概念,切记,这会帮助你理解。
树是一种数据结构它是由n(n>=1)个有限结点组成一个具有层次关系的集合。即最少一个节点。
树具有的特点有
每个结点有零个或多个子结点
没有父节点的结点称为根节点
每一个非根结点有且只有一个父节点
除了根结点外,每个子结点可以分为多个不相交的子树。
术语
结点的度(Degree):结点拥有的子树的数目,root,有 0-2个结点
叶子结点:度为0的结点 //就是最后一个节点
分支结点:度不为0的结点
树的度:树内各结点的度的最大的值。(即所有子节点加起来有多少度)
树的层次序号:每个节点,从上往下,从左往右都有一个编号,根是1,第二层最左是2依次递进
层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1
树的 ...
git rebase使用
rebase 重置作用: 是重置提效记录。本质是,当合并其它分支的提交记录后,重整提交记录。不论是自己开发,还是参加开源项目,有很多时间,需要重整提交记录。美化一下,这时候就很有用了。
需要强调一点:一定是在你自己的分支上rebase,别把master之类的分支rebase掉了。
git rebase假设你在test_rebase分支进行开发,现在master分支已经有新的提交,test有多次提交,现在你想合并master分支,并提交推送到远程仓库中看起来只有一次提交。
提交记录分别是:
test_rebase分支:
rebase: test commit2rebase: test commit1
master分支:
master: test commit2master: test commit1
在 test_rebase分支下执行:
1git rebase -i master
-i: --interactive,即交互式的界面
进入交互模式,用vim来编辑,下面这个内容是:
pick: 要保留的掉交commit 和 message,如果要重写commit message用 ...
shell 判断字符串
前言变量一定要用 "" 包起来,否则容易出问问题= 和 == 都能用,但是有差异== 支持模糊匹配
判断字符串长度主要参数:
-z 长度为: 0 返回 true-n 长度不为: 0 返回 true
1234567891011121314151617#!/bin/bashstr1=str2=""str3="1234"if [ -z "$str1" ]; then echo '1 -z: ' $str1fiif [ -z "$str2" ]; then echo '2 -z: ' $str2fiif [ -n $"str3" ]; then echo '3 -n' $str3fi
结果:
1 -z:2 -z:3 -n 1234
判断两个字符串是否相等格式:string1 = string2
1234567#!/bin/bashstr='test_val'if [ "$str& ...
maven 项目依赖
什么是依赖依赖的作用可以将项目以包的方式引用到当前项目中进行使用。实际上平时引用的jar包都看可以看成是一个个子项目被引入到了项目中。
项目引用也就是把其他的项目当成jar包放入仓库中,进行依赖的引用,就跟从网上下载jar包到本地一样。被项目在被引用前必须先 clean install 到仓库中。
引用示例创建一个maven项目,在 pom.xml 中添加一个项目引用,这里引用一个外部项目 junit,用它来构建测试用例,这里仅作为项目引用的示例。
123456789101112131415161718<?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. ...