
Java
文章平均质量分 83
艾阳Blog
不积跬步无以至千里,不积小流无以成江海。闻道有先后,术业有专攻。不忘初心,方得始终。
展开
-
JAVA 并发编程之死锁的产生及避免
死锁可以理解为,在多线程并发竞争资源的环境下,在各自拥有锁的情况下,又去尝试获取对方的锁,从而造成的一种阻塞的现象,若无外力作用,它们都将一直阻塞下去。我们都知道 ,join方法的作用是阻塞线程,即当前线程等待挂起的线程执行结束,才继续执行。如果线程自身调用了调用join()这个方法,表示,自身挂起自身,那么线程将一直在阻塞。①互斥条件:一个资源只能被一个线程占有,当这个资源被占用后其他线程就只能等待。②不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有。原创 2024-04-09 12:10:24 · 488 阅读 · 0 评论 -
JAVA JVM内存模型和GC分配和回收
JVM是(Java Virtual Machine)Java虚拟机的缩写。JVM是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。在Java程序运行时,所有的到JVM中才能执行代码逻辑。不是直接和操作系统交互,需要jvm通过java类库解释给操作系统。。原创 2024-04-04 23:27:18 · 874 阅读 · 0 评论 -
JAVA 线程池ThreadPoolExecutor及核心参数
使用普通线程会带来一些问题,如匿名Runnable无法进行管理,多次执行需要new多次对象;而使用线程池,不仅可以控制并发数、还可以重复利用存在的线程,减少系统的开销。原创 2017-03-13 14:59:00 · 2935 阅读 · 1 评论 -
JAVA 并发编程之AQS排队同步框架
基于一个FIFO(先进先出)队列 和 一个同步状态(state)来实现线程的排队和同步。当线程尝试获取同步状态时,如果同步状态已经被其他线程占用,则将当前线程包装成一个节点(Node)并入队等待,否则直接获取同步状态。同时,AQS会确保只有队列中第一个节点的线程才能获取同步状态,其他节点需要等待前面的节点释放同步状态。原创 2024-03-29 16:58:38 · 696 阅读 · 0 评论 -
Java 并发编程之volatile可见性,原子操作线程不安全
原子操作:线程在工作内存的赋值指令assign,传输到仓库store,最后write写入主内存,这三步操作是一个整理,中间不会中断,就好像直接操作主存一样。使用volatile后,线程对变量原子操作值被修改了,会根据缓存一致性协议通知其他线程的缓存副本过期。在修饰的变量,在系统汇编的代码里会生成lock前缀,表示指令在多核CPU情况下,在当前处理器将缓存数据写回到系统主内存时,会引起其他CPU缓存了该内存地址的数据无效。按照原子性操作, 3、4是线程2的原子操作, 5、6、7是线程1的原子操作。原创 2024-03-29 15:44:34 · 343 阅读 · 0 评论 -
Java CAS原子操作过程及ABA问题
CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。CAS是一个不可分割的原子操作,并且其原子性是直接在硬件层面得到保障的。CAS是乐观锁的一种实现方式,Java原子类中的递增操作就通过CAS自旋实现的。CAS是一种无锁算法,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。原创 2024-01-18 19:39:19 · 494 阅读 · 0 评论 -
Java 多线程join()方法的作用和实现原理解析
join():等待该线程结束,才能执行其他线程。通常用于在main()主线程内,等待其它线程完成再执行main()主线程。Join方法实现原理是通过wait方法, 当main线程调用Thread.join()时,main线程会获得线程对象的锁,调用该对象的wait(),直到该对象唤醒main线程 。这就意味着main 线程调用Thread.join时,必须能够拿到线程对象的锁。原创 2022-08-22 18:48:11 · 5124 阅读 · 0 评论 -
Android 中对Java对象深拷贝的方法
前言在项目中偶尔会遇到关于深拷贝的问题,比如点餐列表中的点一个饮料,它有多种规格(常温、冰),这样放到购物车列表中就可能出现2个相同id的饮料。如下图所示,其中我要对百事可乐进行拷贝一份,然后各修改它的属性值为常温/加冰。一、浅拷贝与深拷贝的区别在Java语言中需要拷贝一个对象时,有两种类型:浅拷贝与深拷贝。 浅拷贝:只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。 深拷贝:只是拷贝了源对象的值,所以即使源对象的值发生变化时,拷贝对象.原创 2020-08-18 18:16:21 · 2659 阅读 · 3 评论 -
Java 泛型,参数类型T和通配符?的边界问题
目录一、概述二、和的使用及区别(1)类型参数(2)无界通配符三、有界通配符、四、泛型擦除一、概述1、定义:Java泛型(generics)泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。2、优势:Java语言引入泛型的优势在于安全、重用。 泛型在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。3、作用:相原创 2020-07-06 15:18:12 · 2172 阅读 · 0 评论 -
Android 性能优化(三)认识错误Error和异常Exception及栈轨迹StackTrace
前言Android 性能优化之内存检测、卡顿优化、耗电优化、APK瘦身,这篇中我强调“运行稳定大于一切”,保证程序运行中不出现Crash,要比卡顿、耗电、安装包大小等方面更为重要。造成Crash的原因有很多,而在程序运行过程中抛出了异常或错误就是其中最普遍的成因。本篇将对Exception和error有一个比较全面的认识。(当然,有不足之处,请多多包涵)一、定义th...原创 2020-03-19 16:48:46 · 5129 阅读 · 0 评论 -
Lambda表达式全面了解——通俗易懂
一、Lambda简介:Lambda是一个表达式,也可以说它是一个匿名函数,然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易,因为它匿名,删减了一些必要的说明信息(比如方法名)。所有的lambda表达式都是用新的lambda运算符 “ => ”,可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是为计算表达式。表达式:转载 2017-07-27 13:15:57 · 2313 阅读 · 2 评论 -
Java 集合知识:List、HashMap、Set
在Android 源码中大量地使用了ArrayMap进行内存中的数据储存和管理,比如Intent.putExtra、Bundle。ArrayMap比HashMap减少30%的内存消耗。原创 2019-07-17 16:37:51 · 11713 阅读 · 4 评论 -
Java |与|| 、&与&& ,或与非的使用和区别
目录前言一、“与”和“或”的定义区别二、&、&&使用和区别三、|、||的使用和区别前言在平时的开发工作当中,经常会使用到if判断,当满足某一个或多个条件下就可以继续往下执行。在java中是使用|、||(或) 、&、&&(与)的代码符号来表示。下面一起来看他们的具体使用,分析他们之间的区别。一、“与”和“或”的定义区...原创 2019-03-07 13:25:40 · 115252 阅读 · 4 评论 -
JAVA JSON格式数据JSONObject的使用及List与数组相互转换
前言在服务器与web前端、移动端进行数据交互的时候的时候,通常会调用接口url把数据以JSON数据格式传过去进行显示,因此,JSON数据格式在前后端数据交互时会经常用到。目录前言什么是JSON?标准的JSON数据表示:对象数据结构--Object数据结构--ArrayJSON格式数据如下:什么是JSON? JSON(JavaScript Objec...原创 2019-03-04 15:05:45 · 32032 阅读 · 0 评论 -
如何理解高内聚低耦合?Java/Android 程序员必看的知识
推荐阅读:Android MVC设计模式详解Android 框架MVVM详解Android MVC设计模式详解Java/Android 常见的设计模式总结,提高代码重用性和扩展下概念 耦合性(英语:Coupling,dependency,或称耦合力或耦合度)是指一程序中,模块及模块之间信息或参数依赖的程度。 内聚性是一个和耦合性相...转载 2018-05-31 11:09:57 · 2532 阅读 · 0 评论 -
Java 企业级开发项目框架——程序人生篇
先讲个故事吧 假如有一天,你安静的在一家互联网公司的软件开发工位上正在午休。这时,坐在旁边一位同事这样夸赞你:“你真是一位能把三年的工作经验用来当五年干活的人,而且还真正拥有了五年的工作经验!”。作为一名半路出家的Java从业者,面对这样的褒奖时内心是十分沉重的,它意味着曾经自己一个人在背后默默地付出与坚持。 当年,那个正在大学做兼职的少年感叹道:“干销售实在太不容易了,我根本...原创 2018-06-12 14:02:18 · 13782 阅读 · 0 评论 -
JAVA多线程之并发与同步,Lock与Syncronized
说到线程,就不得不先说线程和进程的关系。进程是系统的执行单位,一般一个应用程序即是一个进程,程序启动时系统默认有一个主线程,即是UI线程,我们知道不能做耗时任务,否则ANR程序无响应。这时需要借助子线程实现,即多线程。由于线程是系统CPU的最小单位,用多线程其实就是为了更好的利用cpu的资源。一、多线程创建方式//线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源xx.start();//启动线程,run函数运行@Override@Override。原创 2017-03-23 13:24:42 · 27762 阅读 · 2 评论 -
Java 面向对象封装、继承、多态——编程思想总结
什么面向对象?一句话,万物皆对象。比如,人是一个类,男人或女人就是人类的对象。而面向对象思想强大之处是,我们可以继续划分类,比如,前面说的人类可以属于动物类,那么本属于人类的男人或女人,也可以属于动物类。面向对象三大特性是什么?封装、继承、多态。首先,我们先通过一个有趣的比喻说明来理解。 首先说定义一类人被封装成“贪官”,我们就是平民老原创 2017-04-01 09:27:05 · 1825 阅读 · 0 评论 -
Java/Android 日期格式SimpleDateFormat转换,以及Date和Calendar的使用
获取时间日期的方式有两种 :Date 和Calendar。一、Date 的使用:1:配合SimpleDateFormat进行转换。例如:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");yy/MM/dd HH:mm:ss :2002/1/1 17:55:00(24小时制)yy/MM/dd HH:mm:原创 2017-04-17 10:31:05 · 11095 阅读 · 0 评论 -
Java 经典算法分析总汇
前言:在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有‘程序=算法+数据结构’这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养 我们养成思考分析问题,解决问题的能力。 如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或原创 2017-05-03 10:56:04 · 6790 阅读 · 0 评论 -
Java DecimalFormat玩转计算,保留小数点,格式化字符串
在实际开发中,需要把数字显示固定一种格式,比如浮点型0.22或者千分位22,222,222,这时就可以用到java的DecimalFormat类去格式化。一:介绍DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。DecimalFormat 包含一个模式 和一组符号符号含义:0 一个数字 # 一个数字,不包括 0原创 2017-04-26 11:55:20 · 2384 阅读 · 0 评论 -
23种开发设计模式总结,追求高内聚低耦合的编程思想。
目录一、概述二、7个设计原则1、单一职责原则 ( SRP )2、开闭原则 ( OCP )3、里氏替换原则 ( LSP )4、依赖倒置原则 ( DIP )5、接口隔离原则 ( ISP )6、最少知道原则(迪米特原则)7、合成/聚合复用(CARP)三、创建型模式 ( 5种 )1.单例模式2.工厂方法模式3.抽象工厂模式4.建造者模式5.原型模...原创 2017-06-13 14:32:39 · 18136 阅读 · 0 评论 -
常见For 循环优化方式总结——值得一看的提高效率小妙招
前言我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。首先,我们初始化一个集合 list,如下:List<String> list = new ArrayList<String>(); 方法一:最常规的不加思考的写法 优点:较常见,易于理解 缺点:...原创 2017-07-15 14:49:36 · 34169 阅读 · 13 评论 -
Java 随机数、概率实现——Random类
前言:Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同,这点在生成多个随机数字时需要特别注意。下面分三部分原创 2017-07-19 00:30:54 · 21648 阅读 · 0 评论 -
Java 抽象类、普通类、接口的区别——值得你一看的干货
且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去面向对象说到底就是方便你思考,易扩展、易维护管理,硬要说没必要,整个面向对象都没必要了,C语言有什么干不了的呀,运行效率还高。抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。所以,在高级语言上,一个类只能继承一个类或抽象类,正如人不可能同时是动物类又是植物类,但是可以实现多个接口,例如,吃饭接口、呼吸接口等。原创 2017-05-04 16:26:31 · 44943 阅读 · 30 评论 -
Java 源码出发彻底搞懂String与StringBuffer和StringBuilder的区别
导读本篇所讲的内容是java字符串相关的基础知识点。从源码、原理结合案例去剖析知识点,抱着尽量把问题搞明白搞懂的目的,需静心仔细看每一句每一字。一、String介绍源码定义:public final class String implements java.io.Serializable, Comparable, CharSequence { ...}可以看到原创 2017-05-03 18:27:35 · 807 阅读 · 0 评论 -
Java Switch 和 If else 使用效率对比和分析
前言在我们实际开发中,会经常用到逻辑走向的判断语法,最熟悉的逻辑判断莫过于switch和if else它们俩了,但是它们之间究竟哪个更优呢?我们来一起做个试验吧!其实这一篇我并不想这么啰嗦,本着写作负责任的态度,我还是按照惯例写前言或导语,其实我很想说:不啰嗦,直接上机进行测试纳诺耗时吧!!!一、if elselong t1 = System.nanoTime();Str原创 2017-08-03 15:15:27 · 22418 阅读 · 5 评论 -
Java 重写和重载区别——面向对象的多态性分析
前言我们知道面向对象主要是封装、继承和多态,重写和重载都有面向对象的多态性,而一字相同,区别大不同。重写是子类继承父类中方法,属于动态多态性。重载发生在同一个类中方法名相同参数个数或类型不同,且与返回值无关,属于静态多态性。调用被重载过的方法可以大大减少代码的输入量,根据传递不同的参数就可以决定不同的功能或返回值。重写和重载会让我们在实际开发中代码结构更加清晰简洁。一、特性原创 2017-05-04 15:29:07 · 2295 阅读 · 0 评论 -
Java 垃圾回收器的GC机制,看这一篇就够了
导语 垃圾回收器—GC(Garbage Collection),它与“java面向编程”一样是java语言的特性之一;它与“ c/c++语言”最大区别是不用手动调用 free() 和 delete() 释放内存。GC 主要是处理 Java堆Heap ,也就是作用在 Java虚拟机 用于存放对象实例的内存区域,(Java堆又称为GC堆)。JVM能够完成内存分配和内存回收,虽然降低了开...原创 2017-06-06 11:17:31 · 10262 阅读 · 2 评论 -
Java Final修饰符存储位置,为什么String是不可变的?
前言 相信大家在开发中,对于final修饰符都比较常见,它会将修饰的变量固定不可重复赋值。但是我们是否思考过被它所修饰属性变量或类存储在哪里呢?下面已我将用比较有趣的问答形式,让大家对final有一个全面的认识。在不了解java的内存分配存储知识的可以先异步看一下内存如何分配(简单普及知识)。问题一究竟final修饰的数据被存储在什么位置呢?原创 2017-04-01 11:59:55 · 9521 阅读 · 5 评论 -
深刻理解Java虚拟机及垃圾回收机制,值得一看的干货!
Java虚拟机(JVM)导语: JVM(Java Virtual Machine)即Java虚拟机,它可以通过 类加载器 把 Class文件 加载到自己 运行时内存中 去执行。虚拟机是运行在操作系统中的,而进程又是操作系统的执行单位,所以当java虚拟机运行的时候,它就是操作系统中的进程实例单位,当它没运行时,可以把它叫做程序。下图是我们Java开发中工作流程,首先,将我们的源代码.jav...原创 2017-11-28 11:25:21 · 2020 阅读 · 2 评论 -
最常见的Android内存优化方式及防止泄漏造成OOM总结篇
前言内存优化目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收。既然说到内存泄漏和优化,就不得不先简单了解一下内存分配策略,然后再举常见泄漏例子和解决方法,最后做一下总结,这样更直观全面了解Android内存方面处理。强烈!推荐好文相关阅读。1、Java 垃圾...原创 2017-04-01 12:07:27 · 4297 阅读 · 3 评论