java
左高右低
Angry Crow Takes Flight
展开
-
Java的参数传递为值传递,为什么要复制引用的地址?
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。Java中的值传递在Java中只有值传递,而且这个过程发生在栈上,栈的作用主要是存放一些基本数据类型的变量...原创 2019-07-30 17:46:53 · 284 阅读 · 1 评论 -
Java的双冒号操作符
简单的理解,双冒号运算符就是java中的"方法引用",格式为:类名 :: 方法名例如 :() -> new HashMap<>();//可以被替换为HashMap::new这种[方法引用]或者说[双冒号运算]对应的参数类型是Function<T,R> T表示传入类型,R表示返回类型。//原版//lists数据类型为: HashMap<Strin...原创 2019-08-09 21:02:20 · 378 阅读 · 0 评论 -
fail-fast策略以及fail-safe是什么?
什么是fail-fast?简单的来说就是优先考虑出现异常的场景,当异常产生时,直接抛出异常,程序终止。在jcl中的fail-fast?jcl中的fail-fast只要是体现在当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构被改变的话,就会抛出异常ConcurrentModificationException,防止继续遍历。这就是所谓的快速失败机制。这...原创 2019-08-10 22:56:25 · 1340 阅读 · 0 评论 -
String的replaceAll方法替换目标为File.separator抛出异常原因
因为文件分隔符需要统一的问题,今天遇见了要将String中的"/"全部替换成File.separator,可是这行代码却抛出了异常java.lang.IllegalArgumentException: character to be escaped is missingString url = "/index/start.html"url.replaceAll("/",File.separa...原创 2019-08-11 23:46:23 · 1167 阅读 · 0 评论 -
JVM的运行时数据区域
JVM的运行时数据区域JVM会在执行Java程序的过程中把它管理的内存划分为若干个不同的数据区域,这些数据区域各有各的用处,各有各的创建与销毁时间,有的区域随着JVM进程的启动而存在,有的区域则依赖于用户线程的启动和结束而创建与销毁,一般来说:JVM管理的内存将会包含以下几个运行时的数据区域:线程私有区域:程序计数器、Java虚拟机栈、本地方法栈线程共享区域:Java堆、方法区、运行时常量池...原创 2019-08-17 01:27:35 · 104 阅读 · 0 评论 -
关于Java中的类加载器
相信大家都遇到过java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。其中Java有三种加载器:1)根类加载器:Bootstrap ClassLoader(我们使用的String等类)也称为引导类加载器,负责java核心类的加载。比如,System Object String等,在JDK中的JRE的lib目录...原创 2019-08-18 01:15:45 · 168 阅读 · 0 评论 -
死锁产生的条件,以及如何避免死锁,产生死锁时该怎样避免
产生死锁的四个条件 1.互斥: 资源x的任意一个时刻只能被一个线程持有 2.占有且等待:线程1占有资源x的同时等待资源y,并不释放x 3.不可抢占:资源x一旦被线程1占有,其他线程不能抢占x 4.循环等待:线程1持有x,等待y,线程2持有y,等待x 当全部满足时才会死锁死锁的预防1.破坏“互斥”条件:就是在系统里取消互...原创 2019-08-26 14:21:54 · 1303 阅读 · 0 评论 -
关于Java中的Atomic
为什么会出现Atomic类在多线程或者并发环境中,我们常常会遇到这种情况 int i=0; i++ 但这种写法是线程不安全的。为了达到线程安全的目的,我们通常会用synchronized来修饰对应的代码块。还有一种办法就是使用J.U.C包下的atomic类。Atomic类的原理是什么呢atomic类是通过自旋CAS操作volatile变量实现的。CAS(O,V,A)V:主内存存放的实际...原创 2019-08-26 15:18:45 · 1075 阅读 · 0 评论 -
归并排序
归并排序归并排序是建立在归并操作上的一种有效的排序算法,1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。基本思想归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列算法描述归并排序可通过两种方式...原创 2019-08-27 23:45:41 · 116 阅读 · 0 评论 -
Java四种引用类型
强引用在Java中最常见的就是强引用,==把一个对象赋给一个引用变量,这个引用变量就是一个强引用,当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,==即使该对象以后永远都不会被用到JVM也不会回收,因此强引用是造成Java内存泄漏的主要原因之一。软引用软引用需要用SoftReference类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内...原创 2019-08-29 22:58:09 · 221 阅读 · 1 评论 -
volatile和synchronized的区别和联系
1.volatile关键字是线程同步的轻量级实现,所以volatile性能肯定要比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。2.synchronized关键字在JDK1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 s...原创 2019-08-30 23:49:39 · 175 阅读 · 0 评论 -
Java中final、finally、finalize的区别以及注意点
1.区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。虽然这个单词在Java中都存在,但是并没太多关联:final:java中的关键字,修饰符。A).如果一个...原创 2019-08-07 16:49:49 · 132 阅读 · 0 评论 -
Java的基础BFS,利用BFS实现单词接龙
什么是BFS?BFS是比较常用的搜索算法,全名为Breadth First Search(广度优先算法),相当于在考虑问题的时候,可以将所有下一步会遇到的情况考虑好,然后推演每一步直到走到想要的结果。应用场景1.求出到达指定目标的最小值2.树的层序遍历基本框架Bfs(){ 1. 建立起始步骤,队列初始化 2. 遍历队列中的每一种可能,whlie(队列不为空) { 通过队头元...原创 2019-08-07 02:11:14 · 317 阅读 · 0 评论 -
Java 8 的Lambda 表达式
早在2014年oracle发布了jdk 8,在里面增加了lambda模块。于是java程序员们又多了一种新的编程方式:函数式编程,也就是lambda表达式。一、什么是函数式编程函数式编程(functional programming)或称函数程序设计,又称泛函编程,是一种编程典范,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda...原创 2019-08-09 00:08:23 · 124 阅读 · 0 评论 -
String中会遇见的几个问题
String的简介Java中的String类是一个经常使用的,String 类代表字符串。这个字符串属于常量,它们的值在创建之后就不能更改这一点可以从String的成员变量源码中看出。/** String的属性值 */ private final char value[]; /** The offset is the first index of the storage ...原创 2019-07-31 22:36:07 · 354 阅读 · 0 评论 -
多线程Java聊天室
实现聊天室应该将内容分为两个模块,客户端模块和服务器模块;一.服务端创建1.1 ServletSocket,并绑定端口号; ServerSocket serverSocket = new ServerSocket(6320); System.out.println("服务器启动 "+ serverSocket.getLocalSocketAddress());1.2 创建一个存储连接...原创 2019-03-13 21:14:27 · 2490 阅读 · 0 评论 -
java判断一个Object是否为数组
判断一个Object是否是一个数组一开始想到了用 Object instanceOf Array来判断,可是经过测试根本达不到目的,直到运用java的反射机制才完成了这个判断 public static boolean isArray0(Object obj){ if(obj == null){ return false; } ...原创 2019-03-02 20:37:56 · 15399 阅读 · 4 评论 -
Java四舍五入及保留小数点位数
之前有看过网上有的方法,比如可以利用字符串截取,还有就是运用DecimalFormat类来完成 /** * 格式化double<br> * 对 {@link DecimalFormat} 做封装<br> * * @param pattern 格式 格式中主要以 # 和 0 两种占位符号来指定数字长度。 * 0 表示...原创 2019-03-02 21:19:13 · 6555 阅读 · 2 评论 -
关于BigDicimal处理Double类型的方法
BigDicimal类可以用于进行精确的数字运算,但是在创建一个小数对象时不能直接在构造方法里直接写入double数字public static void main(String[] args){ double test = 0.1; System.out.println(new BigDecimal(Double.toString(test)));//0.1 ...原创 2019-03-02 20:53:57 · 1271 阅读 · 0 评论 -
java关于T extends Comparable<T>的理解
下面这段程序中就用到了T extends Comparable<? super T>这个写法,extends表示上限,super表示下限,可是总感觉为什么合在一起那么复杂呢?为什么不能用T extends Comparable< T >来表示? /** * 取最小值 * * @param <T> 元素类型 ...原创 2019-03-02 00:08:28 · 4319 阅读 · 0 评论 -
java的Map实现键值映射,以及有序无序问题
有序无序体现在元素进入Map时的顺序,和数值大小无关; /** * 映射键值 * 例如:<br> * keys = [a,b,c,d]<br> * values = [1,2,3,4]<br> * 则得到的Map是 {a=1, b=2, c=3, d=4}<br> * 如果两个数组长度不同...原创 2019-03-01 22:32:43 · 941 阅读 · 0 评论 -
java的异常捕捉机制,try/catch用法及什么时候需要捕捉异常
异常时java里的一个重要组件之一,几乎所有的代码里面都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要进行异常处理。所有的异常都是由Throwable继承而来,其中Error是无法有我们手动抛出异常的,一般情况下我们最关心的就是Exception,在Exception之下又分为两个分支,RuntimeException和IOException;其中RuntimeExcepti...原创 2018-12-23 01:09:25 · 7881 阅读 · 0 评论 -
Java集合类ArrayList与Vector的区别
区别与联系:1.相同点:1.ArrayList出现于jdk1.2,vector出现于1.0.两者底层的数据存储都使用的Object数组实现,因为是数组实现,所以具有查找快(因为数组的每个元素的首地址是可以得到的,数组是0序的,所以: 被访问元素的首地址=首地址+元素类型字节数*下标 ),增删慢(因为往数组中间增删元素时,会导致后面所有元素地址的改变)的特点2.继承的类实现的接口都是一样...原创 2019-08-01 16:57:42 · 695 阅读 · 0 评论 -
Java中的三个点"..."也就是动态参数
在Java1.5之后在方法上传参时便出现了**"…"**,这三个点的学名叫做可变长参数,也就是相当于一个数组,能够传入0个至n个参数 public static void main(String[] args) { String[] t1 = {}; String[] t2 = {"java","C++"}; String t3 = "java";...原创 2019-08-08 19:32:48 · 16116 阅读 · 0 评论 -
Java中的线程池
线程池的优势当我们线程创建过多时,容易引发内存溢出,因此我们就有必要使用线程池的技术了。(1) 降低资源消耗 。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。创建线...原创 2019-08-31 17:39:06 · 108 阅读 · 0 评论