java基础
Lemon_MY
这个作者很懒,什么都没留下…
展开
-
@PostConstruct,@PreDestroy注解的使用说明
@PostConstruct,@PreDestroy注解都是java的原生注解,在javax.annotation包下。@PostConstruct注解@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始转载 2020-07-22 16:52:34 · 534 阅读 · 0 评论 -
ClassLoader.loadClass和Class.forName的区别
java类装载过程分为3步:1.加载:Jvm把class文件字节码加载到内存中,并将这些静态数据装换成运行时数据区中方法区的类型数据,在运行时数据区堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。注:方法区不仅仅是存放方法,它存放的是类的类型信息。2.链接:执行下面的校验、准备和解析步骤,其中解析步骤是可选的。a:校验:检查加载的class文件的正确...转载 2019-08-31 10:25:21 · 187 阅读 · 0 评论 -
try,catch和finally的作用结果
1.如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。而且finally语句在return语句执行之后return返回之前执行的。2.当finally有返回值(return)时,会直接返回。不会再去返回try或者catch中的返回值。3.如果try和catch的return是一个变量时且函数的是从其中一个返回时,后面finally中语句即使有对返回的变量进行...转载 2019-08-31 11:05:24 · 2891 阅读 · 0 评论 -
java中关于String对象的一些问题
1.String a = “abc”;这是在字符串常量池中创建一个abc字符串(若存在则不创建),对象a指向它。String a ="abc";String b ="abc";String c = new String("abc");a==b //truea==c //false2.String b = new String(“abc”);这是在堆中开辟一块空间(new Stri...原创 2019-04-02 23:40:13 · 211 阅读 · 0 评论 -
java中有关String类创建对象
对String的修改其实是new了一个StringBuilder并调用append方法,然后调用toString返回一个新的String。StringBuffer是在StringBuilder基础上加锁,加锁是一个重量级的操作,需要调用操作系统内核来实现,比较耗时。因此效率明显有:String<StringBuffer<StringBuilder;但是这个并不是绝对的,因为JVM...原创 2019-04-07 23:02:07 · 209 阅读 · 0 评论 -
java中属于被动引用不会触发子类初始化
1.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化。2.通过数组定义来引用类,不会触发此类的初始化。3.常量在编译阶段会进行常量优化,将常量存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化(即在调用static final类型常量时不会触发类的初始化操作,但若static final变量不属于编译器常量则依然会触发初始化操...原创 2019-09-02 11:00:28 · 353 阅读 · 0 评论 -
java中String类是线程安全的
String是final修饰的类,是不可变的,所以是线程安全的。因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都...原创 2019-09-08 18:46:02 · 4305 阅读 · 0 评论 -
HashMap、Hashtable、ConcurrentHashMap的原理与区别及增删改的时间复杂度
HashTable底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化初始size为11,扩容:newsize = olesize2+1计算index的方法:index = (hash & 0x7FFFFFFF) % tab.lengthHashMa...转载 2019-09-10 17:33:14 · 432 阅读 · 0 评论 -
java中三元操作符类型的转换规则
三元操作符类型的转换规则:1.若两个操作数不可转换,则不做转换,返回值为Object类型2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。4....原创 2019-09-13 11:31:57 · 583 阅读 · 0 评论 -
java中ConstantValue类型的变量
static final修饰的字段在javac编译时生成comstantValue属性,在类加载的准备阶段直接把constantValue的值赋给该字段。可以理解为在编译期即把结果放入了常量池中。即在类未被加载时static final字段就有了值,这个值不需要对类进行初始化就可以读取,不像static变量,需要类加载后才会有值(类未加载进内存时值为默认值0或null)。注:1.Constant...原创 2019-08-30 23:00:33 · 1136 阅读 · 0 评论 -
java中的常量池
在java中,JVM会为String类和几个基本数据类型(Integer、Byte、Short、Character、Boolean)的包装类创建常量池,常量池会事先创建多个对象存储在池中,如果你想要创建的对象符合条件,会直接从常量池中获取,而不是在堆中开辟一片新的对象空间。(java虚拟机缓存了Integer、Byte、Short、Character、Boolean包装类在-128~127之间的值...原创 2019-08-30 12:37:40 · 222 阅读 · 0 评论 -
Java BigDecimal
转:1.引言float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。先看下面代码 public static void main(String[] a...转载 2019-01-21 19:04:53 · 283 阅读 · 0 评论 -
java中有关ThreadLocal的一些理解
什么是ThreadLocal readLocal从字面理解就是线程局部变量,是一种线程私有的缓存变量的容器。 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量...原创 2019-04-06 15:03:29 · 190 阅读 · 0 评论 -
有关内存泄漏和内存溢出
内存溢出: out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 :memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。注:内存泄漏多了就会导致内存溢出...原创 2019-05-31 18:05:15 · 121 阅读 · 0 评论 -
关于java的内存回收
java的GC回收完成全是自动的,没有提供相关的API手动回收,所有的内存分配和回收权限都在JVM,在开发人员手里没有绝对的强制垃圾回收的办法,不过可以这样去做:1.对于不再引用的对象,及时把它的引用赋为null。obj=null;2.如果内存确实很紧张,调用System.gc()方法来建议垃圾回收器开始回收垃圾,通知GC运行,但是java语言规范并不保证GC一定会执行。...原创 2019-03-29 22:18:20 · 876 阅读 · 0 评论 -
java中对象的初始化代码执行顺序问题
顺序:1)按顺序执行父类的静态代码块和初始化静态成员。2)接着按顺序执行子类的静态代码块和初始化静态成员;3)按顺序执行父类的全部构造代码块,然后执行父类被调用的的构造方法;4)接着按顺序执行子类的全部构造代码块,然后执行子类被调用的的构造方法;例如:B继承A new B()的操作:1.把A的静态成员执行完再执行B的静态成员。2.再执行A的所有初始化代码块,构造函数。3.再执行B...原创 2019-06-16 23:02:15 · 209 阅读 · 0 评论 -
关于java垃圾收集的问题
java是一门不用程序员手动释放内存的语言。这样做一定程度上帮助我们开发,我们不用需要去管如何回收内存这些都由JVM帮我们解决了,但某些时候,这样的设定也为我们提高程序性能,优化程序带来了一定的困难。所以我们需要去了解JVM是如何进行垃圾回收的,这对我们来说很重要。(在《深入理解JVM》中看到了一句话觉得挺有趣的...原创 2019-06-17 19:17:21 · 235 阅读 · 0 评论 -
有关java中的重写和重载在多态上的表现
在《深入理解JVM》第八章中写着:众所周知,java是一门面向对象的程序编程语言,因为java具备面向对象的三个基本特征:继承,封装和多态。java的多态特征带来的一些最基本的体现,如“重载”和“重写”在java虚拟机中是如何实现的,这里的实现当然不是语法上的如何写,而是虚拟里如何确定正确的目标方法。 ...原创 2019-06-22 23:10:01 · 1265 阅读 · 0 评论 -
java创建子类对象过程中父类调用的方法被子类重写
下面代码的输出是什么?public class Base{ private String baseName = "base"; public Base() { callName(); } public void callName() { System. out. println(baseName); }...原创 2019-06-22 23:31:14 · 1217 阅读 · 0 评论 -
Iterator迭代器对集合的操作
在使用Iterator遍历集合对象的时候,如果调用集合对象的remove()方法使得集合对象的大小发生了改变,那么会抛出ConcurrentModificationException异常。只能使用Iterator迭代器对象的remove(),insert(),add()方法进行增删改。注:迭代器内部维护着一些索引位置的相关数据,迭代过程中不能发生结构性变化(插入或者删除)。迭代过程中不能使用容器...原创 2019-07-09 18:01:49 · 1193 阅读 · 0 评论