
Java
qq_41335802
这个作者很懒,什么都没留下…
展开
-
强软弱虚引用
强引用是最传统的“引用”的定义, 是指在程序代码之中普遍存在的引用赋值, 即类似“Object obj=newObject()”这种引用关系。无论任何情况下,只要强引用关系还存在, 垃圾收集器就永远不会回收掉被引用的对象。 软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收, 如果这次回收还没有足够的内存,才会抛出内存溢出异常。 弱引用也是用来描述那些非必须对象, 但是它的强度比软原创 2022-06-03 14:12:59 · 247 阅读 · 1 评论 -
Java中的动态代理(三)--cglib动态代理
cglib动态代理使用ASM字节码技术动态生成代理类,因此效率相比反射的jdk动态代理更高。下面为示例。一、目标类,被代理类的本身public class Target { public void method1() { System.out.println("method1 running ..."); } public void method2() { System.out.println("method2 running ...");原创 2022-01-21 16:26:45 · 306 阅读 · 0 评论 -
Java中的代理(二)--JDK动态代理
JDK动态代理借助接口实现,目标类需是接口形式,代理类继承InvocationHandler类,通过反射方式动态创建目标类。1.目标对象public interface ByShoot { void byShoot(String size);}public class ShootFactory implements ByShoot{ @Override public void byShoot(String size) { System.out.println("已经为您生产出了原创 2022-01-21 16:14:43 · 357 阅读 · 0 评论 -
Java中的代理(一)
一、概念代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。重要的编程思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。二、Java中的代理定义:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用目的:①:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必要的复杂性②:通过代理业务原创 2022-01-21 16:00:56 · 783 阅读 · 0 评论 -
Java中抽象类的特点
抽象类的特点1.由abstract修饰的类叫做抽象类,也可以修饰抽象方法2.abstract修饰的抽象方法可以不在抽象类当中实现,但一定要在子类当中重写,并实现3.只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法4.抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写5.抽象类是对一些类共性的抽取,不能被实例化,但是可以使用多态6.final 不能和abstract同时使用,final修饰的方法禁止重写, abstract修饰的方法要求重写 ,冲突7.pr原创 2022-01-21 15:40:51 · 1506 阅读 · 0 评论 -
Java中的反射(二)
四、获取类信息并使用1.Field成员变量(1).设置值void set(Object obj,Object value)(2).获取值get(Object obj)(3).暴力反射使用setAccessible(true)方法,可以忽略访问权限修饰符的安全检查。 public static void main(String[] args) throws Exception { //0.获取Person的Class对象 Class pers原创 2022-01-21 15:28:47 · 107 阅读 · 0 评论 -
Java中的反射(一)
一、反射概念反射,简单来说就是分析类信息的能力,类信息包括属性、方法、构造器等。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。原创 2022-01-21 15:06:36 · 115 阅读 · 0 评论 -
static关键字
static的作用在《Java编程思想》当中有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。总结来说,static关键字的作用就是方便在没有创建对象的情况下,去使用对象中的方法和变量。static修饰方法与原创 2021-12-18 17:22:59 · 224 阅读 · 0 评论 -
String类的常用方法
String类常用API1.char charAt ( int index)返回索引位置的代码单元2.boolean equals(Object other) 比较是否与字符串相同3.boolean equalsIgnoreCase( String other ) 忽略大小写地比较是否与字符串相同4.boolean startsWith( String prefix ) boolean endsWith( String suff...原创 2021-12-18 17:07:31 · 225 阅读 · 0 评论 -
List、Set、Map之间的区别
原创 2021-12-15 15:09:40 · 371 阅读 · 0 评论 -
HashMap和Hashtable的区别
1 HashMap不是线程安全的HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。2 HashTable是线程安全。HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将n...原创 2021-12-15 15:07:08 · 118 阅读 · 0 评论 -
HashMap的实现原理
1.概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。2.数据结构在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。3.实现HashMap是基于 Hash 算法实现的。1.当我们往Hashm原创 2021-12-15 15:04:07 · 702 阅读 · 0 评论 -
String,StringBuilder与StringBuffer
简单来说:String是字符串常量,final修饰;StringBuffer字符串变量(线程安全);StringBuilder 字符串变量(线程不安全).此外StringBuilder和StringBuffer实现原理一样,都是基于数组扩容来实现的.有些时候, 需要由较短的字符串构建字符串, 例如, 按键或来自文件中的单词。采用字符串连接的方式达到此目的效率比较低。每次连接字符串, 都会构建一个新的 String 对象,既耗时,又浪费空间。而使用 StringBuilder类就可以避原创 2021-12-13 14:50:24 · 308 阅读 · 0 评论 -
构造器的特点
1.构造器要与类同名。2.当new对象时,new 后边的方法就代表构造函数。3.每一个类当中都有一个默认的不显示的无参构造器,当在这个类当中重写写一个构造器的时候,默认调用的就是显示的构造器。4.构造器是没有返回值的,如果有返回值,即便方法名和类名相同那么也不是构造函数。5.类当中可以有一个或一个以上的构造函数。...原创 2021-12-11 17:01:00 · 649 阅读 · 0 评论 -
Java访问修饰符
修饰符 本类 同包 子类 其他包 public √ √ √ √ protected √ √ √ × default(不写) √ √ × × private √ × × × 四种访问修饰符1 ) 仅对本类可见 private。2 ) 对所有类可见 public:3 ) 对本包和所有子类可见 protected。4 ) 对本包可见:默认,不需要修饰符。...原创 2021-12-11 16:50:56 · 66 阅读 · 0 评论 -
深拷贝与浅拷贝的区别
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的对象都复制了一遍....原创 2021-12-11 16:42:36 · 192 阅读 · 0 评论 -
面向对象的三大特性
三大的特性的概念与简介封装:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。继承:所谓继承是指可以让某个类型的对象获得另一..原创 2021-12-08 18:02:15 · 85 阅读 · 0 评论 -
Java中的接口
1.为什么java使用接口?有时候必须从几个类当中派生出一个子类,继承他们所有的属性和方法,但是java不支持多重继承于是就有了接口。接口可以降低耦合度,并且提高程序的可扩展性。2.接口的特征1.接口用interface实现2.接口中所有的成员变量都是由public static final修饰的3.接口中的所有方法默认都是public abstract修饰的4.接口没有构造方法,构造方法用于创建对象(接口没办法new对象),但是可以使用多态5.实现接口的类中,必须实现接口中的所原创 2021-12-08 17:54:13 · 435 阅读 · 0 评论 -
Java中的包装类与自动装箱
1.包装类有时, 需要将 int 这样的基本类型转换为对象。 所有的基本类型都冇一个与之对应的类称为包装类。java针对每一个基本数据类型都设计了一个包装类,如下表所示。2.自动装箱面向对象中,“一切皆对象”,但基本数据类型的数据不太符合这一理念,基本数据类型不是对象,所以java设计出来了一个包装类。我们知道这个的执行过程中,最开始是一个叫javac的编译器将.java文件编译称为.class的文件,在这个过程当中我们写的程序public static void main(Str原创 2021-12-08 16:03:41 · 233 阅读 · 0 评论 -
equals()方法与hashCode()方法
1.两个方法的作用equals():在Object类源码(如下所示)中,其底层是使用了“==”来实现,也就是说通过比较两个对象的内存地址是否相同判断是否是同一个对象。但是在实际应用中,该方法不能满足的我们的需求。因为我们认为两个对象即使不是指向的同一块内存,只要这两个对象的各个字段属性值都相同,那么就认为这两个对象是同一个对象。所以就需要重写equals()方法,即如果两个对象指向内存地址相同或者两个对象各个字段值相同,那么就是同一个对象。hashCode()方法:一提到hashcode原创 2021-12-08 15:47:06 · 102 阅读 · 0 评论 -
Java中的final关键字
关键知识点:修饰的对象名需全部大写1.final关键字修饰的变量,如果是基本数据类型不可变,但如果是引用数据类型,例如数组,可以改变其中元素的值。本质固定是内存地址。2.final修饰全局变量,必须在声明时赋值,同时不可改变。final修饰局部变量,可以先声明再赋值,但只能赋值一次,并且使用时必须赋值。final修饰变量也就是只能赋值一次,不可修改。3.final修饰的方法不能被重写。4.final修饰的类不能被继承。5.final还可以防止指令重排序,保障多线程下的数据安全。..原创 2021-12-08 15:34:49 · 220 阅读 · 0 评论 -
Java中的继承
1.概念继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。从定义可以知道,继承的本质就是复用已存在的方法和域。2.关键字extends使用extends关键字可以实现继承,继承其他类的类称为子类,被继承的类称为父类(超类)。子类可以调用父类的方法,同时子类可以拥有自己的方法,功能比超类更丰富。(子类可以调用父类的方法,但是父类不能调用子类的方法)继承中经常发生的是重写,而不是重载。子类重写父类的方法,调用时原创 2021-12-08 15:22:27 · 202 阅读 · 0 评论 -
java异常体系
Error与Exception Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。 Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。运行时异常和非运行时异常 运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexO...原创 2021-12-03 22:22:41 · 80 阅读 · 0 评论 -
Java中的重载与重写
重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。注意到Java中方法签名包括方法名和参数列表,并且方法签名必须唯一,就能认清重载。...原创 2021-12-03 22:21:02 · 228 阅读 · 0 评论 -
Java 菜单树实现
后台根据数据库中的菜单表返回链表形式的多层结构,也就是菜单树,可以使用递归形式和嵌套for循环形式。本文只是模拟展示其思路。数据库简单形式的菜单表,整个菜单树有三层,0层1有两个子菜单 1层2 和 1层4,而1层2又有两个子菜单2层1和2层2。show_order可以控制同一菜单下的子菜单的顺序。public class Menu { private Long id; private String name; private String url; pri.原创 2021-12-03 22:16:01 · 2238 阅读 · 0 评论 -
Java中的128陷阱
Java的包装类Integer中存在128陷阱,原因是类中定义了缓存数组,会引起一些数值比较上的陷阱。public static void main(String[] args) { Integer num1 = 100; Integer num2 = 100; System.out.println(num1 == num2); Integer num3 = 128; Integer num4 = 128; System.out.println(num3 == num4)原创 2021-12-03 15:01:53 · 114 阅读 · 0 评论 -
Java构造器与普通方法
普通方法普通方法需要注意:1.方法具有访问权限,如,public、private、protected,不写就是默认类型的访问权限。2.方法要有返回值类型,如果没有返回值就使用void。3.方法要有方法名,在同一个类当中方法签名不能重复。。4.方法签名由方法名和参数列表组成,参数类别可以为空,方法没有入参。5.方法可以由static、final等关键字修饰。java访问权限修饰符明细表修饰符 当前类 同包 子类 其...原创 2021-11-29 20:03:20 · 272 阅读 · 0 评论 -
数组与foreach循环
1.数组数组是一种数据结构, 用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。int[] a = new int[100];int a[] =new int{1,2,3,4,5}; 上面是数组的两种声明 int[] a 和int a[] 。 可以按第一种声明容量,或者第二种直接赋值。注意申请的int类型的数组,并且容量也就是长度不可以变。多维数组声明方式与一维类似int[][] b = new int[5][4];int b[][] .原创 2021-11-28 19:36:12 · 210 阅读 · 0 评论 -
多重选择:switch语句 与中断控制流程语句:break&continue
1.多重选择Java中的switch语句与C和C++中的用法一致。Scanner in = new Scanner(System.in);System.out.print("Select an option (1, 2, 3, 4) ");int choice = in.nextlnt();switch (choice){ case 1: .... break; case 2: .... break;原创 2021-11-28 19:06:54 · 614 阅读 · 0 评论 -
Java中的输入与格式化输出
1.输入打印输出到“ 标准输出流”(即控制台窗口)是一件非常容易的事情, 只要调用 System.out.println 即可。然而,读取“ 标准输人流” System.in 就没有那么简单了。要想通过控制台进行输人,首先要构造一个 Scanner 对象,并与“ 标准输人流” System.in 关联。Scanner in = new Scanner(System.in);System.out.println("请输入姓名");String name = in.next();Syste原创 2021-11-28 18:46:18 · 1123 阅读 · 0 评论 -
==和equals的区别
==与equals通常用于判断对象是否相同。其中的规则跟比较的对象有关,分为基本数据类型与引用数据类型。1.基本数据类型基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等号(==),比较的是他们的值。基本数据类型根本无法调用方法,因此不存在equals()方法的比较。2.引用数据类型当引用数据类型使用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们.原创 2021-11-28 17:50:00 · 107 阅读 · 0 评论 -
String-字符串类型
一.字符串常量池字符串常量池是java的一项技术,从字面意思理解就是把经常用到的数据存放到某一内存当中,避免频繁的数据创建和销毁,实现数据的共享,提高系统性能。public static void main(String[] args) { String aString = "123"; String bString = "123"; System.out.println(aString == bString); }上面代码的输出为为:true在添加新字符串时,虚拟机首先判断原创 2021-11-28 16:56:18 · 103 阅读 · 0 评论 -
位运算与移位运算
本文使用btye类型举例。1.位运算&按位与运算。对应位置,同为1则为1,否则为0。| 按位或运算。对应位置,同为0则为0,否则为1。~按位取反运算,每一位0变1,1变0。^按位异或运算,对应位相同为0,不同为1。在某些情况下,位运算的运算效率比直接对数字进行加减乘除高很多。2.移位运算<< 左移运算,右边空出来的位用0填补高位左移溢出则舍弃该高位。左移几位其实就是这个数 *2 的几次幂。>> 右移运算,左边...原创 2021-11-28 16:03:20 · 289 阅读 · 0 评论 -
Char类型的长度问题
char类型原本用于表示一个字符。不过随着字符种类的扩充,如今一些Unicode字符则需要两个char值。char类型的字面量值需要用单引号括起来,而非是双引号。'A'是编码值为65所对应的字符常量。"A"是指包含一个字符的字符串。char 类型的值可以表示为十六进制值,其范围从 \u0000 到 \uffff 。\u是一种转义序列。另外,下图是特殊字符的转义序列。Java设计采用16 位的 Unicode 字符集,这样会比使用 8 位字符集的程序设计语言有很大的改进。如今,Unicode.原创 2021-11-28 15:37:01 · 2746 阅读 · 0 评论 -
浮点类型与精度丢失
1.浮点类型的存储float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位表示值double存储需求是8字节(64为),其中1位最高位是符号位,中间11位表示阶位,后52位表示值如下图所示:double 表示这种类型的数值精度是 float 类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用 double 类型。在很多情况下,float 类型的精度很难满足需求。实际上,只有很少的情况适合使用 float 类型,例如,需要单精度数据的库, 或者原创 2021-11-28 14:48:40 · 621 阅读 · 0 评论 -
Java运算符
1.基本运算符在java当中,使用运算符+、-、*、/ 表示加减乘除,当参与 / 运算的两个操作数都是整数的时候,表示整数除法;否则表示浮点数。整数的求余操作用 % 表示。2.数值之间的转化在程序运行的时候,我们经常需要将一种数值类型转化为另一种数值类型。下图给出了数值类型之间的合法转化。3.强制类型转换在上面我们可以看到,在必要的时候,int类型的值将会自动的转化为double类型。但另一方面,有时候也需要将double转化为int.。在java当中允许这种数值之间的类型转化.原创 2021-11-27 17:54:34 · 315 阅读 · 0 评论 -
原码反码补码与byte的取值范围
1.三种存储形式计算机中对数据的二进制存储形式-------补码(下面讨讨论的皆为byte类型)原码:45:00101101 -45:10101101在最高位代表符号位区分正数还是负数,0代表正数,1代表负数反码:45:00101101 -45:11010010正数的原码和反码相同,负数的反码等于原码的符号位不变,其余各位按位取反补码:45:00101101 -45:11010011正数的原码反码和补码都形同,负数的补码等于在其反码基础上末尾+12.为什么计算机设计反码?原创 2021-11-27 17:19:54 · 611 阅读 · 0 评论 -
JDK、JRE和JVM
1.JDKJava Development Kit 是Java的标准开发工具包(普通用户只需要安装 JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序)。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境JRE,以及常用的Java基础类库等,是整个JAVA的核心。javaSEjava核心 java团队开发出的java最基本的功能。java开发团队将最初研发的java基础知识点在网上开源,这样一些大牛会加入他们的开源社区这些大牛加入进来以原创 2021-11-27 15:54:32 · 107 阅读 · 0 评论 -
Java基本数据类型与命名规范
基本数据类型Java属于强类型编程语言,抛开强制类型转换不说,变量之间赋值只能赋值给相同类型的变量。Java只有八大基本数据类型。整形数据类型包含一下:1B大小的btye类型,表示范围为-128~127。2B大小的short类型,表示范围为-32768~32767。4B大小的int类型,表示范围为-2147483648~2147483647。8B大小的long类型。表示范围为1019数量级。浮点型类型分为float与double,存储大小为4B与8B。double类型的精度约原创 2021-11-27 15:14:53 · 420 阅读 · 0 评论