Jave EE
Jave EE
Blakie
You got a dream, you gotta protect it.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java反射机制概念(运行状态中知道类所有的属性和方法)
在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射的应用场合:首先说一下编译时类型和运行时类型 :在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如: Person p=new Student(); 其中编译时类型为Person原创 2020-05-12 17:39:08 · 984 阅读 · 0 评论 -
Java 中 static 关键字(改)
1、static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。2、static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的原创 2020-05-12 14:45:30 · 177 阅读 · 0 评论 -
JAVA内部类
Java类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类。根据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。静态内部类:定义在类内部的静态类,就是静态内部类。1. 静态内部类可以访问外部类所有的静态变量和方法,即使是private的也一样。2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。3. 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner = new Out.Inne原创 2020-05-12 11:37:26 · 197 阅读 · 0 评论 -
Java枚举
当一个变量只有几种固定可能的取值时,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。就可以将它定义为枚举类型。枚举的用法:1、枚举常量2、在switch中使用枚举3、向枚举中添加方法4、使用@Override注解覆盖枚举的方法5、使用枚举实现接口6、使用接口组织枚举...原创 2020-05-12 11:26:47 · 182 阅读 · 0 评论 -
Java 中 finally 中的代码一定会被执行吗?
至少有两种情况下finally语句是不会被执行的:1、try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行。 这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。2、在try块 或者 catch块中有System.exit(0)这样的语句。 System.exit(0)是终止Java虚拟机JVM的,虚拟机停止运行之后,finally语句也不会被执行到。1、在try catch块里有return...原创 2020-05-12 10:34:10 · 1264 阅读 · 0 评论 -
获取用键盘输入常用的的两种方法
方法1:通过 ScannerScanner input = new Scanner(System.in);String s = input.nextLine();input.close();方法2:通过 BufferedReaderBufferedReader input = new BufferedReader(new InputStreamReader(System.in));String s = input.readLine();原创 2020-05-10 17:54:13 · 324 阅读 · 0 评论 -
Java 中的异常处理
Java异常类层次结构图:在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。Error(错误): 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineErro原创 2020-05-10 17:52:18 · 182 阅读 · 0 评论 -
关于 final 关键字的一些总结
final关键字主要用在三个地方:变量、方法、类。1. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改; 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。2. 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。3. 使用final方法的原因有两个。 第一个原因是把方法锁定,以防任何继承类修改它的含义; 第二个原因是为了提高效率。在早期的Java实现版本中,会将...原创 2020-05-10 17:45:07 · 286 阅读 · 0 评论 -
== 与 equals 的区别
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (原创 2020-05-10 17:41:55 · 188 阅读 · 0 评论 -
自动装箱与自动拆箱
自动装箱:将一个基本数据类型的变量赋值给相应封装类的变量。自动拆箱:将一个封装类的变量赋值给相应基本数据类型的变量。八种基本数据类型以及它们的封装类:int - Integershort - Shortfloat - Floatdouble - Doublelong - Longboolean - Booleanbyte - Bytechar - Character...原创 2020-05-10 15:05:00 · 162 阅读 · 0 评论 -
String 和 StringBuffer、StringBuilder 的区别是什么?String 为什 么是不可变的?
可变性String 类中使用 final 关键字修饰的字符数组保存字符串, private final char value[] ,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。线程安全性String 中的对象是不可变的,也就可以理原创 2020-05-10 14:48:29 · 205 阅读 · 0 评论 -
JDK1.8新特性
1. 接口的扩展方法在jdk1.8之前,接口中只允许有抽象方法,但是在1.8之后,接口中允许有一个非抽象的方法,但是必须使用default进行修饰,叫做扩展方法。2.Lambda 表达式参数 => 主体。Lambda表达返回右边表达式的结果。3. 函数式接口,方法与构造方法的引用函数式接口:接口中只有一个方法,可以对应一个lambda表达式。通过匿名内部类或者方法传递进行...原创 2020-02-11 09:56:23 · 149 阅读 · 0 评论 -
Java创建线程的方式
Java创建线程的方式有四种:1.通过继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。2.通过Runnable接口创建线程类(1)定义runnable接口的实...原创 2020-02-11 09:56:15 · 648 阅读 · 0 评论 -
Java equals()的重写规则
重写equals()方法需要满足五大性质:自反性。对于任何非null的引用值x,x.equals(x)应返回true。对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。传递性。对于任何非null的引用值x、y与z,如果y.equals(x)返回true,y.equals(z)返回true,那么x.equals...原创 2020-02-11 09:56:10 · 210 阅读 · 0 评论 -
解释一下static块和static变量的执行顺序
static { name="xiaoming";}private static String name=null;上面这段代码,把name打印出来是nullprivate static String name=null;static { name="xiaoming";}上面这段代码,把name打印出来是xiaomingstatic { nam...原创 2020-02-10 12:39:20 · 224 阅读 · 0 评论 -
Java中的深拷贝与浅拷贝
Java中clone方式是浅拷贝,如果想实现深拷贝,需要继承clonable接口,重写clone方法。浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝。也就是说浅拷贝只复制一个对象,传递引用,不能复制实例...原创 2020-02-11 09:56:06 · 139 阅读 · 0 评论 -
HashMap的put和get操作
Put():1.先对key的hashCode()做hash,然后计算index。2.如果没碰撞直接放到bucket中。3.如果碰撞了,以链表的形式存在buckets后。4.如果碰撞导致链表过长,就把链表转换成红黑树。5.如果节点已经存在就替换old value(保证key的唯一性)。6.如果bucket满了(超过load factor*current capacity),就...原创 2020-02-10 10:51:18 · 555 阅读 · 0 评论 -
HashMap的基本原理及其内部数据结构
基本原理:通过hash的方法获取对象的位置,通过put和get存储和获取对象。存储对象时,将K/V传给put方法,它会调用hashCode计算hash从而得到bucket的位置,进一步存储。HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr 则resize为原来的2倍)。获取对象时,我们传K到get方法,它调用hashCode计算hash从而得到bucket...原创 2020-02-10 10:38:29 · 614 阅读 · 0 评论 -
什么时候使用HashMap?它有什么特点?
HashMap是基于Map接口的实现,存储键值对时可以使用HashMap。它可以接收null的键值,是无序的,是非同步的,HashMap存储着Entry(hash,key,value,next)对象。原创 2020-02-10 10:31:34 · 1702 阅读 · 1 评论 -
HashMap与HashTable的区别
1、继承不同。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。2、Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,hashtable的实现方法里面添加了synchronized关键字来确保线程同步,但是要使用HashMap的话就要自己增加...转载 2020-02-10 10:16:17 · 280 阅读 · 0 评论 -
Java静态分派与动态分派
静态分派:所有依赖静态类型来定位方法执行版本的分派称为静态分派,发生在编译时期,典型应用为方法重载。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的。动态分派:典型应用为重写,是一种动态的概念,向上转型后调用子类覆写的方法便是一个很好地说明动态分派的例子。就是说,我们在判断执行的方法是父类中的方法还是子类中覆盖的方法时;如果用静态类型来判断,那么无论怎么进行向上转型,都...原创 2020-02-10 10:08:26 · 156 阅读 · 0 评论 -
Java char类型可以存储汉字吗
首先,char型变量是用来存储unicode编码的字符的,unicode编码字符集中包含了汉字,所以char型变量中当然可以存储汉字。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。...原创 2020-02-10 09:55:24 · 593 阅读 · 0 评论 -
Java Object类中有哪些方法
Wait、Notify、NotifyAll、clone、hashcode、equals、toString、finalize、getClassWait():在其他线程调用此对象的notify()/notifyAll()方法前,使当前线程等待Notify():唤醒在此对象监视器上等待的单个进程NotifyAll():唤醒在此对象监视器上等待的所有进程clone():创建并返回对象一个副...原创 2020-02-10 09:52:16 · 860 阅读 · 0 评论 -
Java泛型之类型擦除
泛型,即“参数化类型”。 创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理时被擦除,这个过程即类型擦除。 泛型擦除可以简单的理解为将泛型Java代码转换为普通Java代码。// 只不过编译器更直接点,将泛型Java代码直接转换成普通Java字节码。类型擦除的主要过程如下: 一、将...原创 2020-02-10 09:42:35 · 186 阅读 · 0 评论 -
Java重写与重载
重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 ...原创 2020-02-10 09:26:52 · 124 阅读 · 0 评论 -
Java双亲委派机制
提到双亲委派模型,首先,要知道什么是类加载器。类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。Java中的类加载器主要用于实现类的加载。Java中的类和类加载器一起唯一确定类在JVM中的唯一性。类加载器可以分为二大类,启动类加载器和其他类加载器,其中启动类加载器(Bootstrap ClassLoader):用C++实现,是JVM的一部分,而其他类加...原创 2020-02-11 09:55:56 · 205 阅读 · 0 评论 -
Java抽象类和接口的区别
抽象类:如果一个类含有抽象方法(抽象方法是一种特殊的方法,它只有声明,而没有具体的实现),则称这个类为抽象类,抽象类必须在类前用abstract关键词修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。如果一个类继承抽象类,那么就必须为基类中的抽象方法提供定义。如果不那么做,那继承的类也为抽象类。包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样...原创 2020-02-09 16:56:31 · 7068 阅读 · 7 评论 -
Java的类加载机制。出现锁机制的原因?
类从加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。 其中类加载的过程包括加载,验证,准备,解析,初始化五个阶段。1.加载。在加载阶段,虚拟机需要完成以下三件事情:(1).通过一个类的全限定名来获取其定义的二进制字节流。(2).将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(3).在Java堆中生成一个代...转载 2020-02-09 11:48:20 · 336 阅读 · 0 评论 -
Java中创建子类实例时会创建父类实例吗?
子类在创建实例时。子类的类初始化方法会调用父类的初始化方法。即父类的构造函数会执行,但是不会创建父类对象。创建类的实例时,首先会设置每个类的元数据,无论是在构建这个类的实例还是调用这个类某个对象的方法,都会访问方法区的这些元数据。构建一个对象时,JVM会在堆中给对象分配空间,这些空间用来存储当前对象实例属性以及其父类的实例属性(而这些属性信息都是从方法区获得)。注意,这里并不是仅仅为当前对...原创 2020-02-09 11:40:06 · 962 阅读 · 0 评论 -
Java对象的创建过程
Java中对象的创建过程大致分为5个步骤,即:类加载检测——为对象分配内存——初始化零值——设置对象头——执行init()方法1.类加载检测。虚拟机遇到new指令时,首先先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就执行类加载过程。2.为对象分配内存。把一块固定大小的内存从java堆里划分出来。划分方...原创 2020-02-09 11:20:18 · 196 阅读 · 0 评论 -
Java中的引用
Java对象的引用分为四种,分别是强引用,软引用,弱引用以及虚引用。1、强引用。即常用的创建对象一个对象并把它赋值给一个引用变量Object o = new Object();强引用有引用变量指向时就永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。2、软引用。用来描述一些还有用但非必需的对象。如果一个对象具有软引用,只要内存空间足够,垃圾回收器就不会回收它;...原创 2020-02-09 10:55:08 · 197 阅读 · 0 评论 -
Java中init()方法与clinit()方法的区别
1.init() 和 clinit()方法执行时机不同。init是对象构造器方法,在程序执行 new 一个对象调用该对象类的构造方法时才会执行init方法。而clinit是类构造器方法,在JVM进行类加载——验证——解析——初始化中,初始化阶段JVM会调用clinit方法。2.init() 和 clinit()方法执行目的不同。init是instance实例构造器,对非静态变量解析初始化。而c...原创 2020-02-08 12:46:01 · 866 阅读 · 0 评论 -
Java实现生产者和消费者的方法
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品。当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。实现方法(部分)有:1.使用wait()方法和notify()方法实现。这是最简单最基础的实现,缓冲区满和缓冲区为空时都调用wait()方法等待,当生产者生产了一个产品或者消费者消...原创 2020-02-08 12:24:33 · 226 阅读 · 0 评论 -
java中散列表、树所对应的的容器类。以及HashMap如何解决冲突?
散列表、树所对应的的容器类:散列表:hashmap,hashtable,concurrentHashmap树:hashset,treemap,treeset其中treeset继承自treemap, hashset继承自hashmap性能分析:Entry:key和value的组合。即一个映射项<K,V>。treemap底层采用一颗“红黑树”来保存集合中的Entr...原创 2020-02-08 11:55:33 · 345 阅读 · 0 评论
分享