Java
Java知识和技术
绿叶青年
Android开发初级工程师
展开
-
ReentrantLock里面lock和tryLock的区别
ReentrantLockReentrantLock(轻量级锁)也可以叫对象锁,可重入锁,互斥锁。synchronized重量级锁,JDK前期的版本lock比synchronized更快,在JDK1.5之后synchronized引入了偏向锁,轻量级锁和重量级锁。以致两种锁性能旗鼓相当,看个人喜欢,本文主要介绍一下lock和tryLock的区别。public void lock() { sync.lock();}public void lockInterruptibly() thro原创 2021-06-24 14:56:59 · 3927 阅读 · 0 评论 -
Java Interrupt、IsInterrupted、Interrupted
IsInterrupted不会重置interrupt stateInterrupted会重置interrupt state原创 2021-06-23 11:36:02 · 124 阅读 · 0 评论 -
Set判断元素是否已存在的条件
1、判断变量是否存在相同的引用,如果引用相同,则不再判断hashcode、equals,并且认为已存在该元素,无法添加元素2、如果指向不同的引用,则判断hashcode和equals是否一样,同时一样则认为已存在。package p1;import java.util.HashSet;public class A { public static void main(String[] args) { A1 a1 = new A1(); A1 a...原创 2021-04-13 11:11:11 · 4264 阅读 · 0 评论 -
Java semaphore的讲解和使用
Semaphore的作用:限制线程并发的数量课外话题【多线程的同步概念】:其实就是排着队去执行一个任务,执行任务是一个一个的执行,这样的优点是有助于程序逻辑的正确性,不会出现非线程安全问题,保证人系统功能的运行稳定。Semaphore类结构图:1、类Semaphore的构造函数permits 是许可的意思,代表同一时间,最多允许permits执行acquire() 和release() 之间的代码。例如:Semaphore semaphore = new Semaphore(1);表示同一时原创 2020-12-17 17:33:12 · 537 阅读 · 0 评论 -
Java ReentrantLock中tryLock与lock的区别(非公平锁与公平锁)
设置同步状态,利用CAS操作// CAS操作:如果当前状态值等于期望值,则自动将同步状态设置为给定的更新值protected final boolean compareAndSetState(int expect, int update)进入tryLock,实际上是非公平锁的实现(非公平锁: 不能保证正在排队的线程能拿到锁,因为可能被新来的线程抢走)public boolean tryLock() { return sync.nonfairTryAcquire(1);}final b原创 2020-12-16 10:38:25 · 1044 阅读 · 1 评论 -
Java notify和notifyAll的区别
notify1、通知一个处于wait状态的线程进入block状态,此线程必须是和该对象相关联(同步)notifyAll1、通知所有处于wait状态的线程进入block状态,此线程必须是和该对象相关联(同步)测试用例:package p1;public class A { public static void main(String[] args) { A1 a1 = new A1(); Runnable1 runnable1 = new Runnable1(a1); Thread原创 2020-12-16 09:29:12 · 133 阅读 · 0 评论 -
Java自限定类型(Self-Bound Types)
引入Java的泛型中有一种比较特殊的用法:class SelfBounded<T extends SelfBounded<T>>{}网上的其他博客说得不是很详细,所以在这里记录一下。先看一个简单的例子(Thinking In Java 4th Edition P500,做了些修改)class BasicHolder<T> { int No; T element; void set(T arg) { element = arg; } T get() { r原创 2020-11-23 19:25:37 · 351 阅读 · 0 评论 -
Java常量池
字符常量池和自动包装package p1;public class I { public static void main(String[] args) { char c1 = new Character('a'); char c2 = new Character('a'); System.out.println(c1 == c2); Character c3 = new Character('a'); Character c4 = new Character('a');原创 2020-09-03 11:39:38 · 97 阅读 · 0 评论 -
Java 多线程协作 - 同步问题
一、Thread类的几种状态public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;}二、Wait(), Notify() , NotifyAll()的使用package p1;public class A { public static void main(String[] args) { Car car = new Car();原创 2020-08-19 20:19:29 · 177 阅读 · 0 评论 -
组合模式和泛型模式
package p1;public class B { public static void main(String[] args) { Holder1<? extends Fruit> h1 = new Holder1<Apple>(); h1.set(new Fruit()); // 编译报错 Fruit f1 = h1.get(); Holder1<? super Fruit> h2 = new Holder1<Fruit>原创 2020-08-10 12:03:54 · 224 阅读 · 0 评论 -
泛型Set问题
package p1;public class B {public static void main(String[] args) {Holder<? extends Fruit> holder = new Holder();holder.set(new Fruit()); // 报错}}class Holder {private T value;public void set(T val) { value = val;}public T get() { ret原创 2020-08-10 11:26:46 · 163 阅读 · 0 评论 -
Java 容器学习
问题:如何删除List中值为3的整数倍数的对象package p3;import java.util.ArrayList;import java.util.List;public class B { public static void main(String[] args) { List<Integer> list = new ArrayList<Inte...原创 2020-04-17 16:19:57 · 137 阅读 · 0 评论 -
Java 类加载规则
如果多个package内含有同名的类,匹配加载的顺序是如下1、当前类是否含有此名称的内部类。如果有,则加载该内部类,否则下一步2、当前类所属java文件中的import是否指明此名称的类。如果有,则加载该import类,否则下一步。注意:import必须明确指明,不能含有通配符*3、当前包中是否含有此名称的类。如果有,则加载该名称的类,否则下一步4、import package.*...原创 2020-04-15 13:32:31 · 236 阅读 · 0 评论 -
Java 经典测试题
题目1:L.java文件的代码如下所示,运行结果是()package p1;public class L { public static void main(String[] args) { L1 l1 = new L2(); }}class L1 { int value = 1; L1() { test1();...原创 2020-04-14 15:21:55 · 200 阅读 · 0 评论 -
Java 可变参数列表
Java SE5引入了可变参数列表特性,使用的时候需要注意一些细节 void test(String... args) { if(args == null) { System.out.println("args is null"); } else { System.out.println("args not null, lenght is " + args.length)...原创 2020-04-12 13:47:39 · 175 阅读 · 0 评论 -
Java 移位操作符讲解
Java移位操作符分为三种:左移位操作符(<<)、有符号右移位操作符(>>)、无符号右移位操作符(>>>)1、如果对char、byte、short类型的数值进行移位操作,那么在移位之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值2、对于int类型数值进行移位操作,移位数的低5位才是有效的,这样可防移位超过int类型所具有的位数(...原创 2020-04-11 15:39:06 · 210 阅读 · 0 评论 -
单例模式的双重锁为什么要加volatile
单例模式的双重锁为什么要加volatile需要volatile关键字的原因是,在并发情况下,如果没有volatile关键字,在第5行会出现问题。instance = new TestInstance();可以分解为3行伪代码a.memory = allocate() //分配内存b. ctorInstanc(memory) //初始化对象c. instance = memory ...原创 2020-03-29 15:45:46 · 380 阅读 · 0 评论 -
Java 方法参数 讲解
Java参数:不管是原始类型还是引用类型,传递的都是副本若参数类型是基本数据类型,那么传过来的就是这个参数的一个副本package p1;public class E { public static void main(String[] args) { int value = 10; test1(value); System.out.println(value); }...原创 2020-02-23 20:54:31 · 393 阅读 · 0 评论 -
Xml解析之Pull、SAX(非泛型方式)
Pull方式解析Xml例子:String mData = "<apps>\n" + "<app>\n" + "<id>1</id>\n" + "<name>Google Maps</name>\n" + "<version&...原创 2020-02-16 14:29:29 · 180 阅读 · 0 评论 -
为什么java内部类访问局部变量必须声明为final
有时候在开发Java的时候会遇到:“Variable is accessed from within inner class ,need to be declared final”。意思就是:在内部类中不能引用本地(局部)变量,需要声明为常量。1、为什么必须声明成final追究根本原因其实就是作用域中变量的生命周期所致1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于...原创 2020-02-12 15:41:42 · 1345 阅读 · 0 评论 -
ExecutorService中shutdown、shutdownNow、awaitTermination含义
使用ExecutorService类时,经常用到 shutdown() 、shutdownNow() 、awaitTermination() 3个方法,下面我们来说说它们的含义和三者的区别。shutdown():停止接收新任务,原来的任务继续执行1、停止接收新的submit、execute的任务2、已经提交的任务(包括正在执行的和队列中等待的),会继续执行完成3、等到第2步完成后,才真...原创 2020-01-17 18:38:47 · 501 阅读 · 0 评论 -
Java的DataInputStream的readUTF方法是如何读取字符串的
在使用DataInputStream时候,经常会使用到readUTF来读取一段字符串,但是readUTF是如何知道该字符串有多长的呢?下面的例子是对DataInputStream的简单使用:package s1;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io...原创 2020-01-16 10:18:32 · 1795 阅读 · 0 评论 -
Java readLine()、read()、read(char cbuf[])、read(char cbuf[], int off, int len)详解
BufferReader继承Reader,主要有readLine()、read()、read(char cbuf[])、read(char cbuf[], int off, int len)方法,下面我来讲解这几个方法的用法和注意事项。先在D盘下建立一个test.txt文件(Windows系统),文件内容:HelloAndroid2020-01-15readLine()该方法...原创 2020-01-15 18:49:50 · 1310 阅读 · 0 评论 -
java.io.File中的pathSeparator、 pathSeparatorChar、 separator、 separatorChar的区别
java文件分隔符之 pathSeparator、 pathSeparatorChar、 separator、 separatorChar四者的区别:1、pathSeparator与pathSeparatorChar与系统文件路径分隔。例如:F:\Java学习\文件操作与异常;G:\重装系统其中的 “;” 是:“F:\Java学习\文件操作与异常”和 “G:\重装系统” 两个不同路径...原创 2020-01-15 14:58:34 · 1237 阅读 · 0 评论 -
Java 自动包装机制详解
↵Java SE5引入了自动包装机制,可以自动的实现基本类型和对象类型的双向转换,例如int类型和Integer类型的相互转换。在Java中,除了基本类型以外,其他都是以对象的形式存在。而每种基本类型也有其对应的类,这些类被称为包装器(Wrapper)。例如:基本类型 对应的类 int Integer double Double 以下 同理...原创 2020-01-14 17:00:35 · 886 阅读 · 0 评论 -
java 方法重载详解
区分重载方法要是几个方法有相同的名字,Java如何才能知道你指的是哪一个呢?其实规则很简单:每个重载的方法都必须有一个独一无二的参数类型列表,包括参数类型顺序。注意:不考虑方法的返回类型。例子:package s1;public class O { public static void main(String[] args) { O1 o1 = new O1(); o1...原创 2020-01-13 01:26:34 · 271 阅读 · 0 评论 -
Syntax error, insert "Dimensions" to complete ReferenceType
今天在写下面的代码时,编译器报错:Syntax error, insert "Dimensions" to complete ReferenceTypepackage s1;public class O { public static void main(String[] args) { O1<Object> o1 = new O1(); O1<Integer...原创 2020-01-12 23:11:56 · 2661 阅读 · 0 评论 -
Cannot refer to an instance field arg while explicitly invoking a constructor
package s1;public class M { public static void main(String[] args) { }}class M5 { private int i; public M5(int i) { this.i = i; }}class M6 extends M5 { public int i = 9; public M6...原创 2020-01-11 17:46:15 · 737 阅读 · 0 评论 -
Java final关键字详解
在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的几种主要用法。final数据在编写程序时,我们经常需要说明一个数据是不可变的,我们称为常量。在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以再次赋值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编...原创 2020-01-11 13:50:34 · 265 阅读 · 0 评论 -
Java 类成员变量和方法的初始化顺序
对于类的静态/非静态变量和静态/非静态初始化顺序的个人理解(不知道是否正确)1、对于首次访问类的静态变量、静态方法、构造器,先为静态变量分配空间并赋予默认值,然后加载静态方法,最后按照顺序初始化静态变量,并且仅初始化一次。2、创建类的实例时候(当然此时已经完成了第1步)!首先为非静态成员变量分配存储空间并赋予默认值,然后按照顺序初始化各个非静态变量。总结:简单理解就是先分配空间并赋默认...原创 2020-01-09 11:39:40 · 313 阅读 · 0 评论 -
普通内部类和静态内部类的区别
普通内部类:1、创建普通内部类,需要外部类的实例2、普通内部类可以访问外部类的静态域和非静态域+静态方法和非静态方法3、普通内部类不可以拥有静态变量和静态方法,可以拥有常量(static final)静态内部类:1、创建静态内部类,不需要外部类的实例2、静态内部类只可以访问外部类的静态域和静态方法(非静态域和方法无法访问)3、静态内部类可以拥有静态变量和静态方法+...原创 2020-01-07 20:25:20 · 310 阅读 · 0 评论 -
Java中普通内部类为何不能有static属性 却可以有常量
public class Outer{ int x; class Inner{ static int a = 0;//这样写是不合法的. static final int b=0;//这样写是合法的 }}java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么...原创 2020-01-07 20:06:31 · 209 阅读 · 0 评论 -
Java接口与嵌套接口
一、接口1. 接口简介接口: 是java的一种抽象类型,是抽象方法的集合。接口比抽象类更加抽象的抽象类型。接口语法:[修饰符] [abstract] interface 接口名 [extends 父接口名列表]{[public] [static] [final] 常量;[public] [abstract] 方法;[public] [static] 方法{};//JDK1....原创 2020-01-07 16:14:57 · 214 阅读 · 0 评论 -
Java Interface
Interface是一个完完全全的抽象类。Interface由域和方法组成。Interface中的域拥有:public + static + final特征Interface中的方法拥有:public(注意抽象方法不可以为static、final、private)如果一个Interface需要继承另一个(或者多个)Interface,需要使用extends,如果是多个接口则用",...原创 2020-01-07 14:34:58 · 175 阅读 · 0 评论 -
java的抽象方法为什么不能是static、final、private
1、java的抽象方法为什么不能用static修饰?类抽象方法? 如上代码,在抽象类中定义static属性是没有问题的,但是定义抽象方法时是不能定义为静态(static)的,否则编译器会报错:The abstract method geta in type abstractTest can only set a visibility modifier, one of public or...原创 2020-01-07 13:36:29 · 1577 阅读 · 0 评论 -
Java多态机制
在学习多态之前,需要先了解后期绑定(又称为动态绑定),它的含义就是在运行时根据对象的类型进行绑定,从而调用恰当的方法。Java支持动态绑定!注意:方法名称必须相同、参数类型和顺序必须相同Java中除了static方法和final方法(private方法也属于final方法)之外,其它所有方法都是后期绑定。这里举个列子:package s1;public class B { pu...原创 2020-01-07 12:15:59 · 203 阅读 · 0 评论 -
Java 初始化顺序
Java初始化顺序总结如下:1、初始化父类静态变量(域)/静态代码块(变量和代码块按照声明顺序执行初始化)2、初始化子类静态变量(域)/静态代码块(变量和代码块按照声明顺序执行初始化)3、初始化父类变量(域)/代码块(变量和代码块按照声明顺序执行初始化)4、初始化父类构造器5、初始化父子类变量(域)/代码块(变量和代码块按照声明顺序执行初始化)6、初始化子类构造器注意:...原创 2020-01-06 15:06:20 · 652 阅读 · 0 评论 -
Java运算符优先级
所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。一般而言,单目运算符优先级较高...原创 2020-01-06 10:26:42 · 533 阅读 · 0 评论 -
计算机原码,反码,补码
最近花了点时间对计算机的原码,反码和补码进行了研究,对为什么要有反码和补码以及他们这么设计的原因有了一定的理解机器数一个数在计算机中的表现形式叫做机器数,这个数有正负之分,在计算机中用一个数的最高位(符号位)用来表示它的正负,其中0表示正数,1表示负数。例如正数7,在计算机中用一个8位的二进制数来表示,是00000111,而负数-7,则用10000111表示,这里的00000111和1...原创 2020-01-06 10:15:07 · 132 阅读 · 0 评论 -
java数据截断保留低位,舍弃高位
java中当发生数据截断时候,采取的措施就是:保留低位,舍弃高位short s = (short)0b11000000000000000000000000000001;System.out.print(s);运行结果是1原创 2020-01-05 21:26:01 · 961 阅读 · 0 评论