Java
第十七签
这个作者很懒,什么都没留下…
展开
-
CountDownLatch/CyclicBarrier/Semaphore的用法
1 CountDownLatchCountDownLatch 让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞,其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为零时,因调用await方法被阻塞的线程会被唤醒,继续执行。public class CountDownLatchTest{ public static void main(原创 2020-12-05 20:37:47 · 169 阅读 · 0 评论 -
公平锁/非公平锁/可重入锁/递归锁/自旋锁/独占锁/共享锁/互斥锁
1 公平锁/非公平锁公平锁: 是指多个线程按照申请锁的顺序来获取锁。在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取出并占有锁。非公平锁: 是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或饥饿现象。并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平原创 2020-11-30 21:31:42 · 171 阅读 · 0 评论 -
ArrayList/HashSet/HashMap 线程不安全问题
1 ArrayList线程不安全List<String> list=new ArrayList<>();for(int i=1;i<=50;i++){ new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(list); },String.valueOf(i)).start();}// 抛出异原创 2020-11-07 18:03:13 · 253 阅读 · 0 评论 -
对Java中volatile关键字的一点理解
1 volatile是Java虚拟机提供的轻量级的同步机制(保证可见性,不保证原子性,禁止指令重排序)保证可见性volatile保证可见性Demo(可测试volatile删除与添加的运行差异):public class VisibleTest { public static void main(String[] args) { VisibleData data = new VisibleData(); new Thread(() -> {原创 2020-10-31 17:28:08 · 156 阅读 · 1 评论 -
并发和并行的区别
并发同一时间段,多个任务都在执行(单位时间内不一定同时执行)并行单位时间内,多个任务同时执行原创 2020-10-18 15:12:29 · 79 阅读 · 0 评论 -
Java中HashMap遍历的七种方法
HashMap 遍历从大的方向来说,可分为4类:迭代器(Iterator)方式遍历For Each 方式遍历Lambda 表达式遍历(JDK 1.8+)Streams API 遍历(JDK 1.8+)但每种类型下又有不同的实现方式,因此根据具体的遍历方式又可以分为以下7种:使用迭代器(Iterator)EntrySet 的方式进行遍历// 创建并赋值 HashMapMap<Integer, String> map = new HashMap();map.put(1, "原创 2020-10-18 11:09:10 · 529 阅读 · 1 评论 -
JDK 动态代理和 CGLIB 动态代理对比
1 JDK 动态代理只能只能代理实现了接口的类,而 CGLIB 可以代理未实现任何接口的类。 另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。2 就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显...原创 2020-10-17 17:29:14 · 140 阅读 · 0 评论 -
String 类的常用方法都有那些?
indexOf() 返回指定字符的索引charAt() 返回指定索引处的字符replace() 字符串替换trim() 去除字符串两端的空白split() 分割字符串, 返回分割后的字符串数组getBytes() 返回字符串的byte类型数组substring() 截取字符串equals() 字符串比较length() 返回字符串的长度toLowerCas...原创 2019-11-13 21:10:10 · 942 阅读 · 0 评论 -
java 中操作字符串的类有哪些?它们之间有什么区别?
主要有三种: String、StringBuffer、StringBuilder1) String : final修饰,对string类型字符串的修改操作都会生成新的对象,即对象不可变。StringBuffer和StringBuilder是对象可变的。2) StringBuffer : 对字符串的方操作都加了synchronized,是线程安全的。StringBuilder 不是...原创 2019-11-04 21:37:28 · 587 阅读 · 0 评论 -
Math.round(-1.5) 等于多少?
首先, 答案是-1.Math.round()方法四舍五入的原理是: 在入参的基础上加0.5,然后向下取整.所以,对于Math.round(-1.5)=Math.round(-1.5+0.5)=-1对于正数也一样,如 Math.round(3.4)=Math.round(3.4+0.5)=3...原创 2019-11-03 19:00:38 · 1233 阅读 · 0 评论 -
怎样拷贝数组的数据
Java操作数组的时候,其实是通过一个引用来操作数组的,如果使用简单的=操作符进行赋值的话,只是复制了引用,并没有把数组的数据另外复制。例如如下的代码:public class ArrayCopy {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated m转载 2016-03-07 17:02:44 · 586 阅读 · 0 评论 -
new Object[5]语句是否创建了5个对象
new Object[5]并没有创建五个对象,只是创建了一个数组实例,长度为5,每个数组元素的值为null,并没有创建5个Object对象。如果需要创建5个Object对象,需要为每个数组元素分别指定。转载 2016-03-07 16:40:27 · 640 阅读 · 0 评论 -
Java数组
Java的数组本质是一个类,该类还保存了数据类型的信息。该类通过成员变量的形式来保存数据,并且通过[]符号,使用下标来访问这些数据。在处理基本类型数据时,数组保存的是变量的值,如果程序员未提供初始值,数组会把这些变量的值初始化为0;而处理引用类型时,数组保存的是数据的引用,如果程序员未提供初始值,数组会把这些变量的值初始化为null。转载 2016-03-07 16:29:57 · 232 阅读 · 0 评论 -
Java二维数组
Java的二维数组是先创建一个一维数组,然后该数组的元素再引用另外一个一维数组。在使用二维数组的时候,通过两个中括号[]来访问每一层维度的引用,直到访问到最终的数据。public class MultiDimArray{/** * @param args */public static void main(String[] args) {int[][] arr =转载 2016-03-07 19:14:30 · 287 阅读 · 0 评论 -
怎样使用指定的字符集创造String对象
一般情况下,不论是创造字符串的字面量,还是使用String的构造方法创造字符串对象,JVM会自动的帮助开发者用平台默认的字符集进行构造。例如下面的代码:String a="中文";String b=new String("中文");对于大多数中文系统来说,平台的默认字符集都是GBK或GB2312.当程序员用输入法 打印这些中文的时候,它的编码其实是按照”GBK“或”GB2312“进行的原创 2016-03-06 20:12:29 · 7501 阅读 · 0 评论 -
如何输出反转过后的字符串
实现字符串的反转一般有两种方法,一种是利用字符串存储字符数据的原理,取车它的char数组,进行重新排列并保存;另一种是生成StringBuffer对象,直接使用StringBuffer的reverse方法。public class ReverseStringTest {/*** @param args*/public static void main(String[原创 2016-03-06 19:41:56 · 1572 阅读 · 0 评论 -
StringBuffer和StringBuilder存在的作用是什么
Java的字符串String对象,有一个特性就是不变性,它只能被创建,而不能改变其中的值。因此,一些大量使用字符串的程序可能会出现性能瓶颈,甚至内存溢出。针对这样的问题,Java为开发者提供了相应的解决方案。public class StringBBTest{ public static void main(String args []){ String a="a";原创 2016-03-06 19:12:16 · 2658 阅读 · 1 评论 -
Java中String
public class StringTest{ public static void main(String args []){ String str1=”abc”; String str2=new String(“abc”); } } 用两种方式创建了字符串变量str1和str2。他们有什么区别?其实,Java虚拟机在执行这段原创 2016-03-06 16:49:02 · 382 阅读 · 0 评论 -
boolean和它的包装类的区别
boolean是基础数据类型,Boolean是类boolean一般存于栈空间中,Boolean对象存在堆空间中boolean有true和false两种值,Boolean除了true和false之外,还有nullJava5.0以前,不能把Boolean用于条件语句,需要转换为boolean以后再使用原创 2016-03-05 20:27:03 · 698 阅读 · 0 评论 -
如何用BigDecimal类进行精确运算
System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); 的输出结果是: 0.060000000000000005 0.580000000000000原创 2016-03-05 20:18:49 · 861 阅读 · 0 评论 -
long的取值范围
long型数据的字节长度为8,一共是64位,第1位用于表示正负号,其他位的数字组成它所代表的值。例如:7的二进制表示形式为:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000111当表示负数时,采用补码的原则,第1位总是1,例如:-7的二进制表示为:11111111 11111111 11111111 111原创 2016-03-05 17:01:01 · 11672 阅读 · 0 评论 -
如何用八进制和十六进制来表示整形数据
八进制和十六进制在开发中应用的没有十进制那么多,但是,有时候也可以发挥出十进制无法达到的作用。例如,用八进制的数字来表示掩码,用十六进制的数字表示颜色。Java中八进制用0开头,十六进制用0x开头。如下代码: int a = 0123; int b = 0x123; System.out.println("a=" + a); System.out.println(原创 2016-03-05 16:51:08 · 674 阅读 · 0 评论 -
Java中int的取值范围
int型的数据字节长度是4,一共是32位,第一位用于表示正负号,其他位的数字组成它所代表的值,例如7的二进制表示形式为: 00000000 00000000 00000000 00000111 当表示负数的时候,则采用的是补码的形式,第一位是1,例如-7的二进制表示为: 11111111 11111111 11111111 11111001 int型数据的取值范围:-2^31—-2^31-1原创 2016-03-05 13:23:15 · 605 阅读 · 0 评论 -
int和Integer的区别
int是基础数据类型,字节长度为4,它的创建不会在堆内存中开辟空间,一般保存在栈内存里,可以用算术运算符进行加减乘除等操作,在参数传递的时候,直接传递它的值。Integer是int的包装类,而本质是一个类,它的创建会在堆内存中开辟一块新的空间,它的含义也是表示一个整型的数字,但是,算术运算符不能操作它,在参数传递的时候,传递的是他所代表对象的一个引用。转载 2016-03-05 13:15:28 · 372 阅读 · 0 评论 -
private、 protected、 public、 default的区别
public:可以被所有其他类访问 protected:自身、子类以及同一个包中类可以访问 default:同一个包中的类可以访问,声明时没有加修饰符 private:只能被自身访问和修改转载 2016-03-05 13:04:26 · 206 阅读 · 0 评论 -
Java中的集合
集合是用来存储其他对象的对象,集合代表了一种底层结构,用于扩展数组的功能。它们的每一种形式往往代表了某一种数据结构。 列表(List):有序存放,允许覆盖,可以存放不同类型的对象。 集合(Set):无序存放,不允许重复,可存放不同类型的对象。 SortedSet:排好序列的Set 映射(Map):俗称键值对,如手机中的电话本 SortedMap:排转载 2016-03-12 16:08:31 · 207 阅读 · 0 评论 -
Java中的迭代器
可迭代性是Java集合框架下的所有集合的一种共性,也就是把集合中的所有元素遍历一遍,迭代的过程需要依赖一个迭代器对象。 迭代器模式,又叫做游标模式,它的含义是:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。迭代器是为容器(Java的集合类)而生,它本质上就是一种遍历算法。因为容器的实现千差万别,很多时候不可能知道如何去遍历一个集合对象的元素。Java为开发者提供了转载 2016-03-12 16:46:25 · 376 阅读 · 0 评论 -
Java知识点汇总
ThreadLocalSynchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。但是由于在每个线程中都创建了副本,所以要考虑它对资源的消耗,比如内存的占用会比不使用ThreadLocal要大。ThreadLo...原创 2019-06-09 21:49:15 · 104 阅读 · 0 评论 -
Java事件处理
1 AWT事件处理机制概要:1)监听器对象是一个实现了特定监听器接口的类的实例。2)事件源是一个能够注册监听器对象并发送事件对象的对象。3)当事件发生时,事件源将事件对象传递给所有注册的监听器。4)监听器对象将利用事件对象中的信息决定如何对事件作出响应。...原创 2018-04-15 12:49:58 · 255 阅读 · 0 评论 -
Java 正则表达式
正则表达式是一个强大的字符串处理工具,可以对字符串查找,提取,分割和替换。String类里有几个特殊的处理方法:boolean matches (String regex): 判断该字符串是否匹配指定的正则表达式regexString replaceAll(String regex,String replacement):将该字符串中所有匹配regex的子字符串替换成replace原创 2018-01-21 19:50:23 · 518 阅读 · 0 评论 -
Java垃圾回收机制特性
1 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(如数据库连接,网络IO等) 2 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。 3 在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使对象重新复活,从而导致垃圾回收机制取消回收。原创 2017-12-24 11:19:14 · 221 阅读 · 0 评论 -
解决Java抛出的异常,log中不含具体的堆栈信息
最近,在做项目的时候,遇到一个问题,抛了exception异常,但是定位到log的时候却发现log信息打印不全,并不能根据异常定位到具体的位置。解决方法:配置JVM参数 -XX:-OmitStackTraceInFastThrow原创 2017-08-30 23:33:46 · 2673 阅读 · 0 评论 -
Java中a=a+3与a+=3的区别
(1)byte a=2; a=a+3; 这样写是错误的,因为3是int类型,a+3也是int类型 int类型赋值给byte是不正确的。 (2)byte a=2; a+=3; 这个是正确的。原创 2017-03-12 17:40:03 · 4284 阅读 · 0 评论 -
equals方法特性
自反性(reflexive) 对于任何非null的引用值x, x.equals(x)必须返回true对称性(symmetric) 对于任何非null的引用值x和y, 当且仅当y.equals(x)返回true时,x.equals(y)返回true传递性(transitive) 对于任何非null的引用值x,y,z ,如果x.equals(y)返回true, y.equals(z)返回tru原创 2017-02-22 22:23:00 · 784 阅读 · 0 评论 -
Java网络通信
端口 (1)用于区分不同应用程序 (2)端口号范围为0~65535,其中0~1023为 系统所保留 (3)IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础。 (4)http : 80 ftp : 21 telnet : 23针对网络通信的不同层次,Java提供的网络功能有四大类:1. InetAddress:原创 2016-09-08 23:00:35 · 615 阅读 · 0 评论 -
Java中泛型的作用
泛型形式如下:List list=new ArrayList();集合使用泛型之后,可以达到元素类型明确的目的,避免了手动类型转换的过程,同时,也让开发者明确容器保存的是什么类型的数据。转载 2016-03-15 11:05:19 · 236 阅读 · 0 评论 -
Vector和ArrayList的区别
Vector的大多数成员方法都会加上synchronized关键字,也就是说Vector线程是安全的。 由于Vector操作成员的方法必须保证同步,因此它的执行效率没有ArrayList高。所以,在一般情况下,只有在必须保证同步的地方才用到Vector,大多数情况下,用的是ArrayList。 它们两者的使用比较类似,一般通过add()方法来加元素;remove()方法删除元素转载 2016-03-14 21:53:59 · 198 阅读 · 0 评论 -
Java中equals和==的区别
“==”运用在基本数据类型的时候,通过比较他们实际的值来判定是否相同;而用于比较应用类型的时候,则是比较两个引用的地址是否相等,也就是是否指向同一个对象。 equals方法是java.lang.Object()方法,也就是所有的Java类都会有的方法,它可以被程序员覆盖重写,通过自定义的方式来判断两个对象是否相等。对于字符串java.lang.String类来说,它的equal方法用来比较字符串的原创 2016-02-28 18:44:33 · 234 阅读 · 0 评论 -
Java引用和C++指针的区别
(1)类型:引用是地址的数据元素,可以转换成字符串查看,不用关心它的长度;指针是一个装地址的变量,它的长度是固定的,一般是一个计算机字长 (2)所占内存:引用申明时没有实体,不占用空间;指针申明后用到才会赋值,用不到不会分配内存 (3)类型转换:引用类型转换可能不成功,运行时会抛出异常或者编译不通过;指针只是个内存地址,但可能所指的地址不是程序想要的 (4)初始值:引用初始值是null;指针是原创 2016-02-28 17:10:21 · 548 阅读 · 0 评论 -
Java中的比较器
对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含有一个compareTo()方法,只有一个参数,返回值为int型数据。返回值大于0-时,则表示本对象大于参数对象,小于0时,则表示本对象小于参数对象,等于0是则表示两者相等。public class ComparableUser implements Comparable {private int age;pr转载 2016-03-12 17:25:05 · 524 阅读 · 0 评论