![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
不浪漫的罪名LY
这个作者很懒,什么都没留下…
展开
-
线程池
为什么要使用线程池在多线程环境中,不断地创建和销毁线程既耗时又耗费系统资源。为了提高程序的性能,并发包提供了线程池来管理多线程。它的基本原理是仅仅创建数量有限的线程,每个线程都会持续不断地执行各种任务。线程池相关接口和类并发包中与线程池相关的类和接口 1. Executor接口 Executor接口表示线程池,它只有一个execute()方法,用来执行线程中run()方法中的...原创 2018-03-28 22:30:10 · 160 阅读 · 0 评论 -
concurrent 并发包
java.util.concurrent并发包提供了很多处理多线程的接口和类,主要包括:用于线程同步的Lock锁接口。用于线程通信的Condition条件接口。支持一部运算的Callable接口和Future接口。Lock锁Lock锁的优势在于它提供了更灵活的获取同步代码块的锁的方式:lock():当前线程获取同步代码块的锁。tryLock():当前线程试图获取同步代码...原创 2018-03-27 23:39:52 · 504 阅读 · 0 评论 -
ThreadLocal类
java.lang.ThreadLocal可以用来存放线程的局部变量,每个线程都有单独的局部变量,彼此之间不会共享。ThreadLocal<T>类主要包含3个方法:public T get():返回当前线程的局部变量。protected T initialValue():返回当前线程局部变量的初始值。public void set(T value):设置当前线程的局部变量。...原创 2018-03-27 22:53:50 · 132 阅读 · 0 评论 -
线程通信
线程通信不同的线程执行不同的任务,如果这些任务之间有某种联系,线程之间必须能够通信,协调完成工作。java.lang,Object类中提供了两种用于线程通信的方法:wait():执行该方法的线程释放对象的锁,虚拟机把该线程放到对象的等待池中,等待其他线程将它唤醒。notice():执行该方法的线程唤醒在对象等待池中等待的一个线程。如果对象的等待池中不止一个线程在等待,虚拟机会随机选...原创 2018-03-27 22:32:33 · 546 阅读 · 0 评论 -
线程的同步
同步代码块为了保证每个线程都能正常执行原子操作,Java引入了同步机制,具体的操作是在代表原子操作的代码前加上synchronized标记,这样的代码被称为同步代码块:public String pop(){ synchronized(this){ ... }}每个Java对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁。当线程试...原创 2018-03-27 22:12:31 · 125 阅读 · 0 评论 -
后台线程与定时器
后台线程后台线程是指为其他线程提供服务的线程,也成为守护线程。Java虚拟机的垃圾回收线程就是典型的后台线程,他负责回收其他线程不在使用的内存。后台线程特点是:只有当前台线程结束生命周期后,后台线程才会结束生命周期。主线程默认是前台线程。 调用Thread类的setDaemon(true)方法可以把一个线程设置为后台线程。Thread类的isDaemon()方法可以判断一个线程是否...原创 2018-03-26 23:18:37 · 370 阅读 · 0 评论 -
死锁产生的四个必要条件
死锁产生的四个必要条件互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。 不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。 请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到...转载 2018-04-01 23:47:40 · 604 阅读 · 0 评论 -
序列化和反序列化
什么是序列化和反序列化序列化:将对象以二进制的形式保存在硬盘上; 反序列化:将二进制文件转化成为对象读取。实现序列化接口的时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用?serialVersionUID叫做版本号,要保证版本号的一致进行序列化。 为了防止序列化出错。...原创 2018-04-01 22:02:02 · 144 阅读 · 0 评论 -
synchronize和Lock锁的区别
为什么java已经通过synchronized关键字实现同步访问了,还需要提供Lock?synchronized的缺陷前面博客有提到过释放对象的锁有两种情况:程序执行完同步代码块会释放代码块。程序在执行同步代码块是出现异常,JVM会自动释放锁去处理异常。如果获取锁的线程需要等待I/O或者调用了sleep()方法被阻塞了,但仍持有锁,其他线程只能干巴巴的等着,这样就会很影响程序效...原创 2018-03-28 23:32:03 · 29162 阅读 · 8 评论 -
Volatile关键字
Java语言中的volatile变量可以被看成一种“轻程度的synchronized”,与synchronized相比,volatile变量所需要的编码较少,并且运行时开销也较少,它所实现的功能也只是synchronized的一部分。 锁主要提供了两种特性:互斥和可见性。 互斥是指一次只能有一个线程持有某个特定的锁,这样一次只有一个线程可以访问共享变量。 可见性是保证线程释放锁之前对一个共享...原创 2018-03-28 23:48:21 · 138 阅读 · 0 评论 -
replace()和replaceAll()的区别
相同点都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用 replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串; 另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,...原创 2018-05-27 18:20:10 · 7583 阅读 · 0 评论 -
list contains比较对象需要注意的地方
List contains()比较对象,需要重写对象的equals()和hashCode()方法。package com.kanzhun.phoenix.admin.mytest;import java.util.ArrayList;import java.util.List;import java.util.Objects;/** * ContainsTest * * @au...原创 2018-10-30 22:28:04 · 9642 阅读 · 0 评论 -
集合中存储的是对象的引用
集合中存储的是对象的引用,如果对象的属性发生变化,集合中该对象也会跟着变化。 List&amp;amp;lt;Student&amp;amp;gt; students = new ArrayList&amp;amp;lt;&amp;amp;gt;(); Student student1 = new Student(4, &amp;quot;ying&amp;quot;, 99);原创 2018-10-30 22:03:31 · 863 阅读 · 0 评论 -
使用Gson实现对象或集合与json字符串的互相转化
public class JsonTest { private static Gson gson = new Gson(); public static Student jsonToObject(String jsonStr) { return gson.fromJson(jsonStr, Student.class); } public sta...原创 2018-10-30 21:48:19 · 1456 阅读 · 0 评论 -
List分组的两种方式
java8之前List分组假设有个student类,有id、name、score属性,list集合中存放所有学生信息,现在要根据学生姓名进行分组。public Map<String, List<Student>> groupList(List<Student> students) { Map<String, List<Student>&g...原创 2018-10-30 21:27:03 · 60072 阅读 · 0 评论 -
几种拼接字符串的效率与区别
程序中拼接字符串是非常常见的操作,一般有直接通过+号拼接,或者使用concat()方法拼接、String.join()、StringUtils.join()、StringBuffer、StringBuilder的append()方法,后两种之前讨论过,不做过多赘述。+拼接直接使用“+”拼接字符串,方便简单,代码容易理解,但只适用于需要拼接的字符串比较少的情况,当字符串较多时,效率很低。 ...原创 2018-08-21 23:10:48 · 2610 阅读 · 0 评论 -
String、toString()、String.valueOf()比较
在开发中经常要用到将对象转化成String的操作,通常有String强转、toString()、String.valueOf()方法。这三种方法有什么区别呢?String使用String强转的时候,必须要确定被转换的对象是String,否则会抛出CalssCastException异常。toString()toString()是Object类中的方法,因此任何对象都可以调用...原创 2018-08-21 22:12:27 · 1369 阅读 · 0 评论 -
java中使用Apache HttpClient发送Http请求,并获取返回结果
发送http请求可以写成一个工具类,HttpClient可以使用连接池创建,这样的好处是我们可以自己定义一些配置,比如请求超时时间,最大连接数等等。public class HttpUtil { private static CloseableHttpClient httpClient; private static RequestConfig requestConfig ...原创 2018-07-08 20:54:00 · 6494 阅读 · 0 评论 -
java中调用本地脚本
java中可以调用本地脚本,也可以远程调用shell脚本,但是java调用远程脚本不安全,一般不这么做,那该怎么调用呢? 建议在本地写个脚本调用远程脚本,在java程序中调用本地脚本,具体代码:private int execShell(String shellPath, String... params) { StringBuilder command = new St...原创 2018-07-08 20:41:25 · 2888 阅读 · 0 评论 -
NIO与IO的区别
NIO与IO的区别IO是面向流的,而NIO是面向缓冲区的。NIO会把数据读取到一个稍后处理的缓冲区中,需要时可以在缓冲区前后移动,这就增加了处理过程中的灵活性。IO流是阻塞式的,当一个线程在执行read()或write()方法时,线程转为阻塞状态;而NIO是非阻塞的,线程在进行读写操作时可以同时做别的事情。NIO的Selector选择器允许线程监视多个通道。...原创 2018-04-01 21:58:28 · 526 阅读 · 0 评论 -
线程调度
什么是线程调度 ?线程调度就是按照特定的机制为多个线程分配CPU使用权,有两种调度模型:分时调度模型和抢占式调度模型。分时调度模型:让所有线程轮流获得CPU使用权,并且平均分配每个线程占用CPU的时间片。抢占式调度模型:java虚拟机采用的线程调度模型。它是指优先让可运行池中优先级高的线程占用CPU,如果线程的优先级相同,就随机选择一个占用CPU。注意:线程的调度不是跨平台的,它...原创 2018-03-26 22:41:03 · 540 阅读 · 0 评论 -
四种访问控制修饰符
public: 对外公开,可以在任何地方访问;protected:当前包下及子类可以访问;默认:没有访问控制修饰符,同一个包中可以访问;private:只有当前类可以访问原创 2018-03-24 14:16:33 · 2374 阅读 · 0 评论 -
static和final修饰符
final修饰符final具有“最终、不可变”的含义,它用来修饰非抽象类、非抽象成员方法和变量。用final修饰的类不能被继承,如java.lang.String类用final修饰的方法不能被子类覆盖,如Object类中的getClass()方法用final修饰的变量表示常量,只能被赋值一次,如java.lang.Integer类中的MAX_VALUEpublic static final原创 2018-03-24 14:04:48 · 392 阅读 · 1 评论 -
方法重载(Overload)和方法覆盖(Override)
方法重载(Overload)对于类中的方法(包括从父类中继承的方法),如果两个方法的方法名相同,但参数不一致,可以说一个方法是另一个方法的重载。重载方法必须满足方法名相同方法的参数类型、个数、顺序至少有一个不同方法的返回值和修饰符可以不同方法覆盖(Override)如果子类中定义的方法,其名称、返回类型和参数签名(参数类型、个数、顺序)正好与父类中某个方法相同,那么就可以说子类覆盖了父类的方原创 2018-03-24 13:30:26 · 1144 阅读 · 0 评论 -
java的四个基本特性
java的四个基本特性抽象现实生活中的事物被抽象成对象,把具有相同属性和行为的对象被抽象成类,再从具有相同属性和行为的类中抽象出父类。 封装隐藏对象的属性和实现细节,仅仅对外公开接口。 封装具有一下优点:便于使用者正确、方便的使用系统,防止使用者错误修改系统属性;有助于建立各个系统之间的松耦合关系;提高软件的可重用性;降低了大型系统的风险,即便整个系统不成功...原创 2018-03-24 13:20:23 · 46537 阅读 · 7 评论 -
类和对象
类和对象的区别类类是一个抽象的概念,类不存在与现实生活中,它只是为一些对象定义了抽象的属性和行为;没有为类创建任何对象时,类本身是不会存在于内存中的;对象对象是一个实实在在存在的东西,对象是一个动态的概念,每一个对象都有着与其他对象不同的属性或行为。举例猫和狗都是一个具体的对象,它们有着区别于对方的属性和行为,而动物是根据猫和狗抽象出来的类,动物本身在现实中是不...原创 2018-03-24 12:32:35 · 142 阅读 · 0 评论 -
面向对象和面向过程的区别、优缺点
区别面向过程是分析出解决问题的步骤,用一个个函数去实现这些步骤,使用的时候一个一个依次调用即可; 面向对象是在问题事务中抽取出一个个对象,通过对象去描述事物在整个解决问题过程中的行为。优缺点面向过程性能高,因为面向对象需要实例化类,开销大,缺点是不易维护; 面向对象易维护、易扩展、易复用,缺点是性能比面向过程低。原创 2018-03-24 12:28:24 · 3534 阅读 · 1 评论 -
java中ArrayList、LinkedList和Vector的区别
Java的List接口有3个实现类,分别是ArrayList、LinkedList、Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复。3个具体实现类的区别如下:ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从Ar转载 2017-08-25 11:40:43 · 223 阅读 · 0 评论 -
java并发多线程基础知识
什么是线程? 线程是操作系统能够进行运算调度的最小单位,它包含在进程之中,是进程的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如一个线程完成一个任务需要100毫秒,那么用10个线程完成这个任务只需要10毫秒。Java在语言层面对多线程提供了卓越的支持。线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的原创 2017-09-20 16:19:12 · 789 阅读 · 0 评论 -
抽象类和接口的区别
相同点都代表系统的抽象层,有助于系统的松耦合;都不能被实例化;都能包含抽象方法;从JDK8开始,接口中也可以像抽象类一样,提供默认的实现(方法必须要用default修饰)不同点接口中默认的成员变量都是public static final类型的,必须被显式的初始化;而抽象类中可以定义各种类型的成员变量和静态变量;一个类只能继承一个直接的父类;但一个类可以实现多个接口;接口和抽象类的使原创 2018-03-24 14:23:11 · 117 阅读 · 1 评论 -
自动装箱与拆箱
什么是包装类?包装类的作用是什么? 包装类:每个基本类型对应其包装类; 包装类的作用就是提供一些使用的方法,比如Integer类的静态方法parseInt(String s)可以把字符串转换成整数;静态方法valueOf(String s)可以把字符串转换成基本类型对应的包装类。装箱 把基本类型转换成包装类的过程;拆箱 把包装类转换成基本类型的过程。原创 2018-03-24 14:36:41 · 153 阅读 · 0 评论 -
String、StringBuffer、StringBuilder的区别
StringString对象的底层是一个final char[]数组 private final char value[]; 用final修饰的对象值可以变,但是引用不变;即value的指向不可变,但是value[]数组的值可变,但因为有private对其进行了访问限制,达到了value[]数组值也不可改变的目的;StringBuffer和StringBuildStri...原创 2018-03-24 14:43:35 · 127 阅读 · 0 评论 -
线程
线程与进程的区别每个进程都需要操作系统为其分配独立的内存空间,而同一进程中的所有线程在同一块空间上工作,这些线程可以共享同一块内存或资源,比如共享一个对象或者共享一个打开的文件。Java线程的运行机制在java虚拟机中,执行程序代码的任务是由线程来完成的。 每个线程都有一个独立的程序计数器和方法调用栈。程序计数器:当线程执行一个方法时,程序计数器指向方法区中的下一条字节码指令。方法调用栈:简称原创 2018-03-26 21:48:54 · 128 阅读 · 0 评论 -
cglib动态代理
如何使用cglib动态代理委托者public class HelloServiceImpl { public void sayHello() { System.out.println("hello..."); }}拦截器public class HelloMethodInterceptor implements MethodInterce...原创 2018-03-26 00:02:53 · 138 阅读 · 0 评论 -
java中的静态代理和动态代理
静态代理java中的静态代理就是上篇中设计模式的代理模式。动态代理代理类在程序运行时创建的代理方式叫作动态代理。 Spring框架中的AOP面向切面编程就是通过java的动态代理实现的。 java动态代理要求被代理的对象实现统一的接口。代码实现public class MyProxy implements InvocationHandler { //被代理的对...原创 2018-03-25 23:19:25 · 111 阅读 · 0 评论 -
异常
java主要异常类类框图Error和Exceptionjava异常的顶层类是Throwable类,Error和Exception类是Throwable的直接子类。Error类:单靠程序本身无法恢复的严重错误,从图中可以看到,Error有一个子类VirtualMachineError类,虚拟机错误类,Error类一般指与虚拟机有关的问题,如:方法调用栈溢出、内存不足等。Exc...原创 2018-03-25 17:16:43 · 274 阅读 · 0 评论 -
集合
JDK8 java集合关系图Iterator遍历集合的接口,接口中声明了如下方法:hasNext():判断集合是否遍历完毕,如果没有,返回true;next():返回下一个元素;remove():从集合中删除由next()返回的元素Collectionjava中除了Map接口,其余的三个集合List、Set、Queue都继承了Collection接口。这些接口都定义在java.util包下。原创 2018-03-25 00:05:03 · 155 阅读 · 0 评论 -
java中的泛型
为什么要使用泛型在JDK5以前,集合中的元素都是Object类型,从集合中取出元素的时候往往需要进行强制类型转换,例如:List list = new ArrayList();list.add("hello");Integer i = (Integer) list.get(0);以上代码可以编译通过,但是会报运行时异常。 试想当一个公司把软件产品交给客户后,客户在运行时发生了...原创 2018-03-24 16:48:47 · 182 阅读 · 0 评论 -
equals()和hashCode()方法
equals()相等的两个对象hashCode()也一定相等; hashCode()相等的两个对象equal()不一定相等。重写了equals()方法,一定要重写hashCode()方法。为什么会出现这种现象? 每个对象会对应一个内存地址,而哈希值是根据哈希算法得到的某个值,一般的哈希函数是对哈希表的大小取余,这会造成,两个对象对应同一个哈希值,此时会在这个位置上采用链式结构存储数据,因此会造成原创 2018-03-24 14:54:35 · 102 阅读 · 0 评论 -
"hello"与new String("hello")的区别
创建字符串的两种方式:方式一:String s1 = "hello",s2 = "hello"//s1 == s2为true方式二:String s1 = new String ("hello"), s2 = new String("hello");//s1 == s2为false这里牵扯到栈、堆和常量池,简单说明下:栈:由系统自动分配释放,速度快,栈中存放一些基本类型、对象的引用和函数的参数值原创 2018-03-24 14:51:16 · 456 阅读 · 0 评论