JAVA语言
文章平均质量分 84
请你吃王中王
这个作者很懒,什么都没留下…
展开
-
sleep()和wait()的区别
1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线...转载 2018-03-31 08:51:41 · 156 阅读 · 0 评论 -
volatile和sychronized的区别
一,volatile关键字的可见性要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下:从图中可以看出:①每个线程都有一个自己的本地内存空间--线程栈空间???线程执行时,先把变量从主内存读取到线程自己的本地内存空间,然后再对该变量进行操作②对该变量操作完后,在某个时间再把变量刷新回主内存因此,就存在内存可见性问题,看一个示例程序:...转载 2018-08-17 12:11:23 · 471 阅读 · 1 评论 -
读写锁源码分析(ReentrantReadWriteLock)
为什么需要读写锁?与传统锁不同的是读写锁的规则是可以共享读,但只能一个写,如果场景中往往读远远大于写,读写锁就是为了这种优化而创建出来的一种机制。注意是读远远大于写,一般情况下独占锁的效率低来源于高并发下对临界区的激烈竞争导致线程上下文切换。因此当并发不是很高的情况下,读写锁由于需要额外维护读锁的状态,可能还不如独占锁的效率高。因此需要根据实际情况选择使用。 一个简单的读写锁实现...转载 2018-08-19 12:17:10 · 302 阅读 · 0 评论 -
String、StringBuilder 和StringBuffer
String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。可以看出String类其实是通过char数组来保存字符串的。 “对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。StringBuild...原创 2018-08-16 11:03:55 · 172 阅读 · 0 评论 -
单例模式
单例模式单例(Singleton)模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。这种模式涉及一个类,它负责创建一个对象,同时确保只创建一个对象。这个类提供了一种方法来访问它的唯一对象,可以直接访问,而不需要实例化类的对象。实现实例我们将创建一个单一对象类 - SingleObject。单个对象(SingleObjec...转载 2018-08-13 10:56:50 · 98 阅读 · 0 评论 -
工厂模式(抽象工厂模式)
工厂模式工厂模式是Java中最常用的设计模式之一。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。在工厂模式中,我们没有创建逻辑暴露给客户端创建对象,并使用一个通用的接口引用新创建的对象。实现方法我们将创建一个Shape接口和实现Shape接口的具体类。 一个工厂类ShapeFactory会在下一步中定义。FactoryPatternDemo这是一个...转载 2018-08-13 10:51:50 · 84 阅读 · 0 评论 -
自旋锁、偏向锁、轻量级锁、重量级锁
重量级锁内置锁在Java中被抽象为监视器锁(monitor)。在JDK 1.6之前,监视器锁可以认为直接对应底层操作系统中的互斥量(mutex)。这种同步方式的成本非常高,包括系统调用引起的内核态与用户态切换、线程阻塞造成的线程切换等。因此,后来称这种锁为“重量级锁”。自旋锁首先,内核态与用户态的切换上不容易优化。但通过自旋锁,可以减少线程阻塞造成的线程切换(包括挂起线程和恢复线程)。...原创 2018-08-15 11:36:13 · 300 阅读 · 0 评论 -
JDK8中的排序
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class Test { public static void main(String[] args){ List<User> ...原创 2018-04-06 09:12:01 · 4437 阅读 · 0 评论 -
Java枚举(enum)七种常见的用法
用法一:常量在JDK1.5 之前,我们定义常量都是: public static fianl…. 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。public enum Color { RED, GREEN, BLANK, YELLOW }用法二:switchJDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们...转载 2018-04-06 07:09:36 · 122 阅读 · 0 评论 -
AVL树
一、AVL树继承自BinarySearchTree,1,它是一棵平衡二叉树,他要求每个节点的左右子树的深度之差不能超过1。2,每个节点都有一个平衡因子bf,取值为-1、0、1 。它的值等于右子树的深度减去左子树的深度。3,有LL、RR、RL、LR四种旋转方式import java.util.ArrayList;public class AVLTree<E extends Comparabl...原创 2018-04-08 16:11:15 · 120 阅读 · 0 评论 -
模拟Server/Client进程通信
一、服务器端ServerSocket serverSocket = new ServerSocket(8080);//创建服务器套接字,Socket socket = serverSocket.accept();//并等待连接二、客户端Socket socket = new Socket("localhost",8080);//创建套接字并通过该套接字向服务器发送请求连接客户端代码:public ...原创 2018-03-31 14:32:51 · 391 阅读 · 0 评论 -
浅谈JAVA泛型
一、泛型的主要优点是能在编译时检测出类型错误而不是在运行时检测出错误。二、泛型类型必须是引用类型,即基本类型不能作为泛型类型。三、定义泛型类、接口和方法 1.构造方法应该是public ClassName()而不是public ClassName<E>() 2.可以为静态方法定义泛型类型 声明泛型方法 public static <E>...原创 2018-03-24 20:23:44 · 189 阅读 · 0 评论 -
数据结构--用堆实现优先队列
一、优先队列实现方法 应想到使用二叉查找树实现优先队列(线性表的思想被否决了,接下来该想到的也应该是树结构了吧),它可以使这两种操作的平均运行时间都是O(logN)。但是使用二叉查找树会存在两个问题1:根节点的选择。2:使用指针的必要性。(我们不需要那么“精确”的排序)所以我们使用一种名为“二叉堆”的工具,它具有二叉查找树的部分思想,但我们将用数组去实现它(你也可以认为就是用数组实现了个二...原创 2018-03-25 14:18:30 · 2329 阅读 · 1 评论 -
二叉查找树--BinarySearchTree
一、定义Tree接口public interface Tree<E> extends Iterable<E> { boolean search(E e); boolean insert(E e); boolean delete(E e); void inorder(); //中序遍历 void preorder();//前序遍历 ...原创 2018-03-25 17:41:26 · 274 阅读 · 0 评论 -
如何在循环中删除List集合中的元素
一、首先是最基本的for循环for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")) list.remove(i);}remove()方法删除元素后会立刻更新List的size,因此index也发生了变化,会导致漏掉某些元素。解决办法1、在删除某一个元素后直接break,当然这种情况只适合删...原创 2019-05-30 16:35:09 · 12529 阅读 · 7 评论