Java基础
Java基础知识
原有岁月可回首
认真工作,快乐生活
展开
-
线程的创建方式
线程的创建方式继承Thread类实现实现Runnable接口方式实现Callable接口方式其中前两种比较常用。但是,需要有返回值需要实现Callable接口。代码示例继承Thread类实现 /** * 继承Thread类,并重写run方法 */ public class MyThread extends Thread { @Override public void run() { super.run(); System.o原创 2020-11-01 22:29:43 · 74 阅读 · 0 评论 -
异步获取多线程返回的数据
该问题涉及到三个接口:Callable、Future、CompletionService,还有一个类:FutureTask。下面分别进行下简单介绍:一、Future:V get() :获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。V get(Long timeout , TimeUnit unit) :获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。boolean isDone() :判断任务是否原创 2020-11-01 22:22:23 · 2043 阅读 · 0 评论 -
Java中线程池的创建及自定义线程池
一、线程池简介线程池就是预先创建一些线程,它们的集合称为线程池。线程池可以很好地提高性能,在系统启动时即创建大量空闲的线程,程序将一个task给到线程池,线程池就会启动一条线程来执行这个任务,执行结束后,该线程不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。线程的创建和销毁比较消耗时间,线程池可以避免这个问题。二、如何创建线程池Executors是jdk1.5之后的一个新类,提供了一些静态方法,帮助我们方便的生成一些常见的线程池:newSingleThreadExecutor:创建原创 2020-11-01 15:55:39 · 1838 阅读 · 0 评论 -
Thread类中的start()和run()方法有什么区别
通过调用线程类的start()方法来启动一个线程,使线程处于就绪状态,即可以被JVM来调度执行,在调度过程中,JVM通过调用线程类的run()方法来完成实际的业务逻辑,当run()方法结束后,此线程就会终止。如果直接调用线程类的run()方法,会被当作一个普通的函数调用,程序中仍然只有主线程这一个线程。即start()方法能够异步的调用run()方法,但是直接调用run()方法却是同步的,无法达到多线程的目的。因此,只用通过调用线程类的start()方法才能达到多线程的目的。...原创 2020-11-01 10:33:10 · 276 阅读 · 0 评论 -
synchronized 与volatile区别
简要回答volatile是一个类型修饰符(type specifier);volatile,它能够使变量在值发生改变时能尽快地让其他线程知道;关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且只能修改变量,而synchronized可以修饰方法,以及代码块;多线程访问volatile不会发生阻塞,而synchronized会出现阻塞;volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间原创 2020-11-01 10:30:38 · 258 阅读 · 0 评论 -
POJO/VO/PO/BO/DTO/ENTITY/JavaBean的区别
JavaBean一种可重用组件,即“一次性编写,任何地方执行,任何地方重用”。满足三个条件:类必须是具体的和公共的具有无参构造器提供一致性设计模式的公共方法将内部域暴露成员属性。主要用途:可以用在功能处理、值、数据库访问和JSP中,任何可以用Java代码创造的对象。有两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面的JavaBean,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。原创 2020-10-25 10:49:13 · 127 阅读 · 0 评论 -
synchronized与Lock的区别
开始正文之前先对多线程中的一些知识点进行回顾:一、技术点1.线程与进程一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。以下我们所有讨论的都是建立在线程基础之上。Thread的几个重要方法:**start()**方法,调用该方法开始执行该线程;**stop()**方法,调用该方法强制结束该线程执行;**join()**方法,调用该方法等待该线程结束;**s原创 2020-10-24 15:32:28 · 169 阅读 · 0 评论 -
接口和抽象类的区别
一、抽象类抽象类使用abstract修饰;抽象类不能实例化,即不能使用new关键字来实例化对象;含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法;如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则必须是抽象类;抽象类中的抽象方法只有方法体,没有具体实现二、接口接口使用interface修饰;接口不能被实例化;一个类只能继承一个类,原创 2020-10-17 10:25:08 · 295 阅读 · 0 评论 -
java中动态代理技术的两种实现方式
动态代理是使用反射和字节码,在运行期间创建指定接口或类的子类以及它的实例对象的一项技术,通过这个技术可以对代码进行无侵入式的增强。java中动态代理技术有两种实现方式:JDK原生动态代理、CGLIB动态代理一、JDK原生动态代理 这一种主要是针对有接口实现的情况,它的底层是创建接口的实现代理类,实现扩展功能。也就是我们要增强的这个类实现了某原创 2020-10-12 21:05:34 · 1617 阅读 · 0 评论 -
String、StringBuffer和StringBuilder
一、String String 字符串常量:在java中字符串属于对象,java中提供了String类来创建和操作字符串; String的值是不可变的,这就导致每次对String的操作都会产生出一个新的对象,这样会导致效率低下,并且浪费资源空间;一旦栈内存中的对象没有了,栈内存中的空间会马上被释放出来,但是堆内存中的实体并不会马上释放,而是会被java的垃圾回收机制回收。二、StringBuffe  原创 2020-10-11 15:57:49 · 146 阅读 · 0 评论 -
HashMap工作原理
HashMap内部是基于哈希表实现的键值对存储,继承 AbstractMap 并且实现了 Map 接口。一、什么是哈希表在讨论哈希表之前,我们先大概了解下其他数据结构的新增、查找等基础操作执行性能 **数组:**采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉转载 2020-10-11 10:48:30 · 349 阅读 · 0 评论 -
ArrayList扩容机制
ArrayList扩容机制ArrayList每次扩容是原来的1.5倍。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这样代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。尽可能指定其容量,以避免数组扩容的发生。初始化方式不同,容量也不同:初始化方式容量数量变化List arrayList = new ArrayList();初始数组容量为10,当真正对数组进行添加时,才真正分配容量10->15-&g原创 2020-10-10 22:51:51 · 4074 阅读 · 0 评论