自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 Redisson源码-多线程之首个获取锁的线程加解锁流程

Redisson源码-单线程加解锁流程

2023-06-22 20:38:11 1224

原创 oracle数据库性能方面常用sql

oracle数据库性能方面常用sql

2023-04-26 10:01:05 181

原创 redis分布式锁

redis分布式锁

2023-04-18 11:08:34 451

原创 redisTemplate 使用 setIfAbsent 返回 null 问题原理及解决办法

redisTemplate 使用 setIfAbsent 返回 null 问题原理及解决办法

2023-04-07 10:16:48 3734 1

原创 协作对象死锁及其解决方案

协作对象死锁及其解决方案

2023-02-24 16:56:04 454

原创 顺序死锁及其解决方案

顺序死锁及其解决方案

2023-02-22 08:40:05 373 2

原创 线程间通信的常用方式

线程间通信的常用方式

2023-02-17 10:06:57 1335

原创 Java中Synchronized关键字的基本使用方法

java中Synchronized关键字的基本使用

2023-02-15 16:52:04 750

原创 java代码整合kettle9.3实现读取表中的数据,生成excel文件

java代码整合kettle9.3,使用期api读取表中字段并生成excel文件

2023-02-13 15:28:41 1127

原创 设计模式-单例模式

设计模式-单例模式

2023-01-11 10:07:55 362

原创 java元注解

java元注解本文主要针对于java8,java8定义了6个标准元注解:@Target,@Retention,@Documented,@Inherited,@Repeatable和@Native。1.@Target注解。@Target注解的作用是:描述注解的使用范围(即被修饰的注解可以用在什么地方)。@Target注解源码:@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)pub

2022-09-14 22:02:14 1144

原创 Effective Java笔记第五章枚举和注解第六节注解优先于命名模式

Effective Java笔记第五章枚举和注解第六节注解优先于命名模式

2021-08-13 11:21:04 117

原创 Effective Java笔记第五章枚举和注解第五节用接口模拟可伸缩的枚举

Effective Java笔记第五章枚举和注解第五节用接口模拟可伸缩的枚举1.操作码是指这样的枚举类型:他的元素表示在某种机器上的那些操作。由于枚举类型可以通过给操作码类型和(属于接口的标准实现)枚举定义接口,来实现任意接口,基本的想法就是利用这一事实。下面我们举个例子:public interface Operation { double apply(double x, double y);}public enum BasicOperation implements Operat

2021-08-10 21:24:36 83

原创 Effective Java笔记第五章枚举和注解第四节用EnumMap代替序数索引

Effective Java笔记第五章枚举和注解第四节用EnumMap代替序数索引1.我们举个例子:public class Herb { public enum Type { ANNUAL, PERENNIAL, BIENNIAL; } private final String name; public final Type type; public Herb(String name, Type type) { this.

2021-08-08 21:57:54 132 1

原创 Effective Java笔记第五章枚举和注解第三节用EnumSet代替位域

Effective Java笔记第五章枚举和注解第三节用EnumSet代替位域在以前如果一个枚举类型的元素主要用在集合中,一般就会使用int枚举模式。比如说:public class Demo { public static final int STYLE_BOLD = 1 << 0;//1 public static final int STYLE_ITALIC = 1 << 1;//2 public static final int STYLE_U

2021-08-07 11:44:22 136

原创 Effective Java笔记第五章枚举和注解第二节用实例域代替序数

Effective Java笔记第五章枚举和注解第二节用实例域代替序数许多枚举天生就与一个单独的int值相关联。所有的枚举都有一个ordinal方法,他返回每个枚举常量在类型中的数字位置。下面是Enum类的部分源码:public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { private final int ord

2021-08-01 19:54:08 91

原创 Effective Java笔记第五章枚举和注解第一节用enum代替int常量

Effective Java笔记第五章枚举和注解第一节用enum代替int常量1.枚举类型是指由一组固定的常量组成合法值的类型,例如:一年中的季节,太阳系中的行星或者一副牌中的花色。在编程语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具名的int常量,每个类型成员一个常量:public class Demo { public static final int APPLE_FUJI=0; public static final int APPLE_PIPPIN=1;

2021-07-27 22:25:23 208

原创 Effective Java笔记第四章泛型第七节优先考虑类型安全的异构容器

Effective Java笔记第四章泛型第七节优先考虑类型安全的异构容器1.泛型最常用于集合,如Set和Map,以及单元素的容器,如ThreadLocal和AtomicReference。在这些用法中,它都充当被参数化了的容器。这样就限制了你每个容器只能有固定数目的类型参数。一般来说,这种情况正是我们想要的。例如:一个Set只有一个类型参数,表示他的元素类型;一个Map有两个类型参数,表示他的键和值类型。2.有时候会需要更多的灵活性,这时候就有一种方法可以很容易的做到,就是将键进行参数化而不是将容器

2021-07-25 21:50:24 86

原创 Effective Java笔记第四章泛型第六节利用有限制通配符来提升API的灵活性

Effective Java笔记第四章泛型第六节利用有限制通配符来提升API的灵活性1.参数化类型是不可变得,对于任何两个截然不同的类型Type1和Type2而言,List< Type1 >既不是List< Type2 >的子类型,也不是他的超类型。2.有时候,我们需要的灵活性要比不可变类型所能提供的更多,比如说:public class Stack<E> { private E[] element; private int size = 0;

2021-07-22 18:16:40 134 1

原创 Effective Java笔记第四章泛型第四节优先考虑泛型

Effective Java笔记第四章泛型第四节优先考虑泛型下面我们举个例子,将他作为泛型化的主要备选对象,换句话说,可以适当的强化这个类来利用泛型。public class Stack { private Object[] element; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 1; public Stack() { element = n

2021-07-14 21:57:42 116 1

原创 Effective Java笔记第四章泛型第三节列表优先于数组

Effective Java笔记第四章泛型第三节列表优先于数组1.数组与泛型相比,有两个重要的不同点。首先,数组是协变的(如果Sub为Super的子类型,那么数组类型Sub[ ]就是Subper[ ]的子类型)。相反,泛型是不可变的:对于任意两个不同的类型Type1和Type2,List既不是List的子类型,也不是List的超类型。两者相比数组是有缺陷的。我们举个例子:public class Demo { public static void main(String[] args) {

2021-07-12 20:47:04 221

原创 Effective Java笔记第四章泛型第二节消除非受检警告

Effective Java笔记第四章泛型第二节消除非受检警告1.用泛型编程时,会遇到许多编译器警告:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,以及非受检转换警告。当你越来越熟悉泛型之后,遇到的警告也会越来越少。2.当你遇到需要进行一番思考的警告时,要坚持住。要尽可能的消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的,这是一件很好的事情。这意味着不会在运行时出现ClassCastException异常,你会更加自信自己的程序可以实现预期的功能。3.如果无法消

2021-07-08 20:57:38 661

原创 Effective Java笔记第四章泛型第一节请不要在新代码中使用原生态类型

Effective Java笔记第四章泛型第一节请不要在新代码中使用原生态类型1.在没有泛型之前,从集合中读取到每一个对象都必须进行转换。如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。编译器自动地为你的插入进行转换,并在编译时告知是否插入了类型错误的对象。这样就可以使程序更加安全和清楚。2.声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。从java1.5开始,List接口就只有单个类型参数E,表示列表的元素类型,

2021-04-08 19:33:21 148 1

原创 Effective Java笔记第三章类和接口第十节优先考虑静态成员类

Effective Java笔记第三章类和接口第十节优先考虑静态成员类1.嵌套类是指被定义在另一个类的内部类。嵌套类存在的目的应该只是为他的外围类提供服务。如果嵌套类将来可能会用于其他的某个环境,他就应该是顶层类。嵌套类有四种:静态成员类,非静态成员类,匿名类和局部类。除了静态成员类之外,其他三种都被称为内部类。2.静态成员类是最简单的一种嵌套类。最好把它看作是普通的类,只是碰巧被声明在另一个类的内部而已,他可以访问外围类的所有成员,包括那些声明为私有的成员。静态成员类是外围类的一个静态成员,与其他的

2021-03-29 19:03:13 80

原创 Effective Java笔记第三章类和接口第九节用函数对象表示策略

Effective Java笔记第三章类和接口第九节用函数对象表示策略1.调用对象上的方法通常是执行该对象上的某项操作。然而,我们也可能定义这样一种对象,他的方法执行其他对象(这些对象被显示传递给这些方法)上的操作。如果一个类仅仅导出这样的一个方法,他的实例实际上就等同于一个指向该方法的指针。这样的实例被称为函数对象。比如:public class StringLengthComparator { public int compare(String s1, String s2) {

2021-03-24 18:59:46 86

原创 Effective Java笔记第三章类和接口第八节类层次优于标签类

Effective Java笔记第三章类和接口第八节类层次优于标签类1.有时候,可能会遇到带有两种甚至更多种风格的实例的类,并包含表示实例风格的标签域。比如说:public class Figure { enum Shape{ RECTANGLE,CIRCLE }; //Tag field - the shape of this figure //标签字段-这个图形的形状 final Shape shape; //These fie

2021-03-18 19:10:22 66

原创 Effective Java笔记第三章类和接口第七节接口只用于定义类型

Effective Java笔记第三章类和接口第七节接口只用于定义类型1.当类实现接口时,接口就充当可以引用这个类的实例的类型。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。为了任何其他目的而定义接口是不恰当的。2.有一种接口被称为常量接口,他不满足上面的条件。这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。下面我们举个例子:public interface PhysicalConstants {

2021-03-15 19:08:07 70

原创 Effective Java笔记第三章类和接口第六节接口优于抽象类

Effective Java笔记第三章类和接口第六节接口优于抽象类1.java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。这两种机制之间最明显的区别在于,抽象类允许包含某些方法的实现,但是接口则不允许,一个更为重要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,他就被允许实现一个接口,而不管这个类是处于类层次的哪个位置。因为java只允许单继承,所以,抽象类作为类型定义受到了极大的限制。2.现有

2021-03-11 20:25:42 143 2

原创 Effective Java笔记第三章类和接口第五节要么为继承而设计,并提供文档说明,要么就禁止继承

Effective Java笔记第三章类和接口第五节要么为继承而设计,并提供文档说明,要么就禁止继承1.对于专门为了继承而设计并具有良好文档说明的类而言,首先,该类的文档必须精确地描述覆盖每个方法所带来的影响。换句话说,该类必须有文档说明它可覆盖的方法的自用性。对于每个公有的或受保护的方法或者构造器,他的文档必须指明该方法或者构造器调用了哪些可覆盖的方法,是以什么顺序调用的,每个调用的结果又是如何影响后续的处理过程的(所谓可覆盖的方法,是指非final的,公有的或受保护的)。更一般地,类必须在文档中说明

2021-03-09 20:48:38 129

原创 Effective Java笔记第三章类和接口第四节复合优先于继承

Effective Java笔记第三章类和接口第四节复合优先于继承1.继承是实现代码重用的有力手段,但是并非永远是完成这项工作的最佳工具。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处于同一个程序员的控制之下。对于专门为了继承而设计,并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而,对于普通的具体类进行跨越包边界的继承,则是非常危险的。本文的继承只实现继承(当一个类扩展另一个类时),并不适用于接口继承(当一个类实现一个接口时)。2.与方法调用不同

2021-03-07 22:08:41 121 1

原创 Effective Java笔记第三章类和接口第三节使可变性最小化

Effective Java笔记第三章类和接口第三节使可变性最小化1.不可变类只是其实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。62.不可变类需要遵守的规则:1)不要提供任何会修改对象状态的方法。2)保证类不会被扩展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。为了防止子类化,一般做法是使这个类成为final的。3)使所有的域都是final的。通过系统的强制方式,这可以清楚地表明你的意图。而且,

2021-03-05 20:09:18 93

原创 Effective Java笔记第三章类和接口第二节在公有类中使用访问方法而非公有域

Effective Java笔记第三章类和接口第二节在公有类中使用访问方法而非公有域1.有时候可能会编写一些退化类,没什么作用,只是用来集中实例域,比如说:class Point { public double x; public double y; }由于这种类的数据可以被直接访问,这些类没有提供封装的功能。如果不改变API,就无法改变它的数据表示法,也无法强加任何约束条件,当域被访问的时候,无法采取任何辅助行动。这是不可取的,对于可变的类来说,应该用包含私有

2021-03-02 19:47:17 90

原创 Effective Java笔记第三章类和接口第一节使类和成员的可访问性最小化

Effective Java笔记第三章类和接口第一节使类和成员的可访问性最小化1.设计良好的模块会隐藏所有的实现细节,把他的API与他的实现清晰地隔离开来。然后,模块之间只通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况。这个概念被称为信息隐藏或封装,是软件设计的基本原则之一。2.信息隐藏可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立的开发,测试,优化,使用,理解和修改。这样可以加快系统开发的速度,因为这些模块可以并行开发。3.Java程序设计语言提供了许多机制

2021-02-28 19:17:53 104

原创 Effective Java笔记第二章对所有对象都通用的方法第五节考虑实现Comparable接口

Effective Java笔记第二章对所有对象都通用的方法第五节考虑实现Comparable接口1.compareTo方法并没有在Object中声明,相反,他是Comparable接口中唯一的方法。compareTo方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外他与Object的equals方法具有相似的特征,他还是个泛型。2.一旦实现了Comparable接口,他就可以和许多泛型算法以及依赖于该接口的集合实现进行协作,付出很小的努力就可以获得非常强大的功能。事实上,Java平台类

2021-02-24 17:07:34 122 2

原创 Effective Java笔记第二章对所有对象都通用的方法第三节始终要覆盖toString

Effective Java笔记第二章对所有对象都通用的方法第三节始终要覆盖toString1.toString的通用约定指出,被返回的字符串应该是一个"简洁的,但信息丰富并且易于阅读的表达形式",“建议所有的子类都覆盖这个方法”。2.提供好的toString实现可以使类用起来更加舒适,当对象被传递给println,printf,字符串练操作符(+)以及assert或者被调试器打印出来的时候,toString方法就会被自动调用。3.在实际应用中,toString方法应该返回对象中包含的所有指的关注的

2021-02-22 19:04:29 84

原创 Effective Java笔记第二章对所有对象都通用的方法第二节覆盖equals时总要覆盖hashCode

Effective Java笔记第二章对所有对象都通用的方法第二节覆盖equals时总要覆盖hashCode1.在每个覆盖了equals方法的类中,也必须覆盖hashCode方法,如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap,HashSet和Hashtable。2.Object.hashCode的通用约定:1)在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对

2021-02-18 14:38:07 125

原创 volatile关键字的作用

volatile关键字的作用1.java内存模型。如上图所示,所有线程的共享变量都存储在主内存中,每个线程都有一个独立的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自己的工作内存中,只操作工作内存中的数据。当修改完毕后,再把修改后的结果放回到主内存中。每个线程都只操作自己工作内存中的变量,无法直接访问对方工作内存中的变量,线程间变量值的传递需要通过主内存来完成。2.内存中的交互操作有很多,和volatile有关的操作为:read(读取):作用于主内存变量,把一个变量值

2021-02-10 15:55:51 251 1

原创 Effective Java笔记第一章创建和销毁对象第七节避免使用终结方法

Effective Java笔记第一章创建和销毁对象第七节避免使用终结方法1.终结方法通常是不可预测的,也是很危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。2.C++的析构器可以被用来回收其他的非内存资源,而在java中,一般使用try-finally块来完成类似的工作。3.终结方法的缺点在于不能保证会被及时地执行,从一个对象变得不可到达开始,到他的终结方法被执行,所花费的这段时间是任意长的。这意味着,注重时间的任务不应该由终结方法来完成。除此之外,也不应该

2021-02-04 19:16:12 125 2

原创 Visual Studio 2019 使用 CMake 开发 JNI 动态库实现JAVA调用本地代码

JAVA调用本地方法

2021-02-01 19:26:55 868

原创 使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码

使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码1.我们使用的工具是 IntelliJ IDEA 2018(编写java代码)和VisualStudio 2019(编写Native方法)。2.使用IntelliJ IDEA 2018编写java代码。1)编写java代码。public class HelloWorld { private native void sayHello(); static {

2021-02-01 19:26:20 1528

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除