编程语言(Java基础)
文章平均质量分 67
王小二(海阔天空)
这个作者很懒,什么都没留下…
展开
-
Java:浅谈对象的序列化与反序列化
还有一点值得注意:在使用Externalizable进行序列化的时候,在读取对象时,会调用被序列化类的无参构造器去创建一个新的对象,然后再将被保存对象的字段的值分别填充到新对象中。Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。通过上面的实例可以发现,对User1类进行序列化及反序列化之后得到的对象的所有属性的值都变成了默认值。原创 2024-09-14 14:11:11 · 1080 阅读 · 0 评论 -
Java:集合应对线程安全的升级
使用ArrayList、HashMap,需要线程安全时可以使用Collections.synchronizedList(list);虽然也是锁住了所有的代码,但是锁在方法里边,并非在方法外边。性能稍有提高,毕竟进方法本身就要分配资源的。底层大都采用Lock锁(1.8的ConcurrentHashMap不使用Lock锁),保证安全的同时,性能也很高。使用synchronized修饰方法*,保证线程安全;线程不安全,但是性能好,用来替代Vector、Hashtable。原创 2024-09-11 09:00:00 · 246 阅读 · 0 评论 -
Java:集合的遍历方式的汇总
但是对于Sequential Access的集合来说,就有很重大的意义了,因为Iterator内部维护了当前遍历的位置,所以每次遍历,读取下一个位置并不需要从集合的第一个元素开始查找,只要把指针向后移一位就行了,这样一来,遍历整个集合的时间复杂度就降低为O(n)。所以我们可以知道,对于顺序存储,因为读取特定位置元素的平均时间复杂度是O(1),所以遍历整个集合的平均时间复杂度为O(n)。而对于链式存储,因为读取特定位置元素的平均时间复杂度是O(n),所以遍历整个集合的平均时间复杂度为O(n^2)。原创 2024-09-11 08:00:00 · 960 阅读 · 0 评论 -
Java:简述类的装载机制
应用程序可以自定义类加载器,父类加载器为AppClassLoader。原创 2024-09-07 08:00:00 · 634 阅读 · 0 评论 -
Java-IO:浅谈对IO的认识
Java IO流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。2、按照操作单元划分,可以划分为字节流和字符流。1、按照流的流向分,可以分为输入流和输出流。3、按照流的角色划分为节点流和处理流。原创 2024-09-06 09:00:00 · 213 阅读 · 0 评论 -
Java-IO:浅谈对NIO的认识
NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。原创 2024-09-06 08:00:00 · 2052 阅读 · 0 评论 -
Java-IO:简述常见的IO模型
最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。另外多路复用IO为何比非阻塞IO模型的效率高是因为在非阻塞IO中,不断地询问socket状态时通过用户线程去进行的,而在多路复用IO中,轮询每个socket状态是内核在进行的,这个效率要比用户线程要高的多。原创 2024-09-02 17:09:02 · 800 阅读 · 0 评论 -
Java:集合的相关汇总介绍
TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的, 自己定义的类必须实现 Comparable接口,并且覆写相应的 compareTo()函数,才可以正常使用。在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序。比较此对象与指定对象的顺序。原创 2024-09-05 08:00:00 · 1636 阅读 · 0 评论 -
Java:HashMap和HashTable的区别
虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key值对应的value为null。HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的安全问题。HashTable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。原创 2024-09-04 09:00:00 · 268 阅读 · 0 评论 -
Java:简单比较synchronized和lock
区别类型SynchronizedLock存在层次Java的关键字JVM的一个接口锁的获取假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待情况而定,Lock有多个锁获取的方式,大致就是可以尝试获得锁,线程可以不用一直等待(可以通过tryLock判断有没有锁)锁的释放1、获取锁的线程执行完同步代码,释放锁2、线程执行发生异常,jvm会让线程释放在finally中必须手动释放锁,不然容易造成线程死锁锁类型锁可重入、不可中断、非公平可重入、可判断原创 2024-08-30 14:08:00 · 117 阅读 · 0 评论 -
Java:如何选择线程池的核心线程数
程序开多少线程合适?需要考虑程序是CDP密集型,还是I/O密集型。原创 2024-08-30 11:06:11 · 176 阅读 · 0 评论 -
Java:简述线程安全(死锁)的认识
这个问题除了正确的ack之外,往往是通过将失败的消息放入到延时队列中,等到一定的延时再进行重试来解决。:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。:采用资源有序分配,其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。原创 2024-08-30 10:48:34 · 677 阅读 · 0 评论 -
Java:浅谈线程的生命周期
此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。从start()源码中看出,start后添加到了就绪队列中,接着在native层添加到VM中,至于该线程何时开始运行,取决于JVM里线程调度器的调度(如果OS调度选中了,就会进入到运行状态)。Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了。如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。(1)run()方法执行完成,线程正常结束。原创 2024-08-29 18:13:17 · 701 阅读 · 0 评论 -
JVM:浅谈内存溢出的原因
java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态,而且回收的效果依然不佳的情况,就会开始报这个错误。java.lang.OutOfMemoryError: PermGen space jdk1.7之前才会出现的问题 ,原因是系统的代码非常多或引用的第三方包非常多、或代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀。原创 2024-08-29 17:52:52 · 545 阅读 · 0 评论 -
JVM:浅谈垃圾回收GC机制
复制算法的代价是将内存缩小为了原来的一半,减少了实际可用的内存。现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。原创 2024-08-29 17:38:20 · 1111 阅读 · 0 评论 -
Java:简述类的加载机制-双亲委派
类加载的机制过程分为以下:加载、验证、准备、解析、初始化等。在第一步的加载环节,Java类加载器有四种:Bootstrap类加载器、Extention 类加载器、Application类加载器、Custom自定义类加载器,其中会涉及“双亲委派”模式。原创 2024-08-29 16:54:00 · 975 阅读 · 0 评论 -
Java:内存过高和CPU过高的排查流程
3、假设占用率最高的线程 ID 为 6900,将其转换为 16 进制形式 (因为 java native 线程以16进制形式输出)。4、利用 jstack 打印出 java 线程调用栈信息,这样就可以更好定位问题。1、利用 top 命令可以查出占 CPU 最高的的进程pid。2、查看该进程下占用最高的线程id。4、查看占用内存比较多的存活对象。2、查看JVM堆内存分配情况。3、查看占用内存比较多的对象。原创 2024-08-29 16:18:13 · 428 阅读 · 0 评论 -
JVM:浅谈JVM调优策略
多数的Java应用不需要在服务器上进行GC优化,虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反。在应用上线之前,先考虑将机器的JVM参数设置到最优(适合)。在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间。我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化令其性能达到一个质的飞跃。GC优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。原创 2024-08-29 16:09:00 · 880 阅读 · 0 评论 -
Java:简述类的加载机制-初始化
如果Class是类而不是接口,且Class的父类Super Class(SC)和各个接口SIn(按照implements子句中的顺序来)还没有初始化,那么就在SC上面递归地进行完整的初始化过程,如果有必要,需要先验证和准备SC;如果SC或SIn初始化过程中抛出异常,则获取LC,将Class标记为错误状态,并通知所有正在等待的线程,然后释放LC,然后再抛出同样的异常。类的初始化阶段,是真正开始执行类中定义的java程序代码(.class字节码),并按程序员的意图去初始化类变量的过程。原创 2024-08-29 15:18:05 · 384 阅读 · 0 评论 -
Java:浅谈字节码文件(.class)
JVM具有可移植性,针对各种操作系统和平台都进行了定制,无论在什么平台,都可以通过javac命令将一个.java文件编译成固定格式的字节码(.class文件)供JVM使用。之所以被称为字节码,是因为.class文件是由十六进制值组成的,JVM以两个十六进制值为一组,就是以字节为单位进行读取。原创 2024-08-29 14:44:45 · 706 阅读 · 0 评论 -
Java:Collections.empty*的作用及要注意的地方
一、好处1、如果你想 new 一个空的 List ,而这个 List 以后也不会再添加元素,那么就用 Collections.emptyList() 好了。new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小,多少会占用一内存。每次使用都new 一个空的list集合,浪费就积少成多,浪费就严重啦。2、为了编码的方便。比如说一个方法返回类型是List,当没有任何结果的时候,返回null,有结果的时候,返回list集合列表。那样的话,调用这个方法的地方,就需原创 2022-03-25 09:35:01 · 871 阅读 · 0 评论 -
算法题:移除无效的括号
一、题目给你一个由 ‘(’、’)’ 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。有效「括号字符串」应当符合以下 任意一条 要求:空字符串或只包含小写字母的字符串可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」二、示例))(( -》 (leetode -》 leetodeleetod原创 2021-04-20 23:25:30 · 374 阅读 · 1 评论 -
目录:线程相关文章记录
资料:简述分布式、高并发与多线程操作系统:从工厂的角度来理解进程线程操作系统:详述对进程和线程的认识Java:简述Java多线程的四种实现方式Java:简述Java中的多线程编程Java:简述线程池的工作原理Java:简述Java中满足线程安全的数据结构...原创 2021-03-10 17:43:42 · 161 阅读 · 0 评论 -
Java:字符串split使用.时返回空数组的问题
String str= "127.0.0.1";String[] splitStr= str.split(".");这个时候得到的是一个空数组。因为:涉及转义的字符,类似的还有() [] {} + - * / . ^ ? $ ¦ 。正确的写入如下。String[] splitStr= str.split("\\.");原创 2020-06-10 22:25:02 · 2932 阅读 · 0 评论 -
简述Java中outer:语法的使用
关键字break和continue都是结束循环的作用,但是它只能结束它外面的第一层循环,如果代码里面是一层一层又一层的循环,但是想直接结束最外层循环就需要outer了。看如下代码:outer:for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if(j==0) { System.out.print(j); }else { /转载 2020-06-07 23:08:48 · 1766 阅读 · 0 评论 -
Exception:java.lang.IllegalArgumentException: invalid comparison
异常: java.lang.IllegalArgumentException: invalid comparisonError querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: com.*.module.bean.enums.Enum_BusinessStage and java.lang.String说明: 在Mapper.xml中对非字符串类型的数据进行了是否原创 2020-06-01 23:23:24 · 754 阅读 · 0 评论 -
Java:简述对Serializable序列化的认识
一般情况下,我们在定义实体类时会继承Serializable接口,还有一个serialVersionUID变量。如下所示,那么他们有什么用处呢?public class User implements Serializable { private static final long serialVersionUID = 1L; ......}一、Serializable接口Seri...原创 2020-03-19 22:16:02 · 301 阅读 · 0 评论 -
Druid:简述对数据库连接池Druid的认识和使用
一、Druid介绍Druid是一个数据库连接池,可以说是目前最好的!因其优秀的功能、性能和扩展性方面,深受开发人员的青睐。阿里巴巴已经部署了超过600个使用Druid的应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!Druid的主要功能如下:一个高效、功能强大、可扩展性好的数据库连接池。可以监控数据库访问性能。进行数据库密码加密 ...原创 2019-12-04 10:08:56 · 872 阅读 · 0 评论 -
PageHelper:简述对物理分页插件PageHelper的认识
PageHelper是一款好用的,开源的,免费的Mybatis第三方物理分页插件。本文简单介绍PageHelper的基本使用和配置参数的含义,重点分析PageHelper作为Mybatis分页插件的实现原理。一、PageHelper的maven依赖及插件配置PageHelper除了本身的jar包外,它还依赖了一个叫jsqlparser的jar包,使用时,我们不需要单独指定jsqlparser的...原创 2019-12-03 11:03:10 · 3013 阅读 · 1 评论 -
JVM:简述JVM内存分配模型
JAVA程序运行于JVM虚拟机上,运行时需要内存空间。JVM虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。原创 2019-11-24 19:55:58 · 388 阅读 · 0 评论 -
Java:StringUtils类isEmpty方法和isBlank方法区别
org.apache.commons.lang3.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(String str) 和 isBlank(String str)。一、源码public static boolean isEmpty(String str) { return str == null || str.length() =...原创 2019-11-08 18:12:05 · 1445 阅读 · 0 评论 -
Java:JDK源码阅读的方式
为什么需要阅读源码?从实用性的角度来看,主要有三个目的:解决手头的新问题或者新需求;真正理解一部分理论的落地实现;应对面试。阅读源码的方式如下:一、端正心态在准备投身到阅读源码的事业之前,首先需要端正一下心态:阅读源码是一场持久战,浅尝辄止的话,顶多能写几篇水文,吸点粉糊弄下新手,对自身实力的提高没有显著作用。阅读源码是锦上添花,不是雪中送炭。如果你进入一个全新的领域,...转载 2019-10-22 21:06:23 · 655 阅读 · 2 评论 -
Java:简述Java中对时间和日期的操作
一、Date1. java.util.Date(1)java.util.Date的构造方法如下:public Date() { this(System.currentTimeMillis());}public Date(long date) { fastTime = date;}(2)java.util.Date的测试用例及输出结果如下:java.util.Date dat...原创 2019-10-22 20:47:38 · 612 阅读 · 0 评论 -
Java:子类能否重写父类中的属性值
Java:子类使用Override能否重写父类中的属性值? 首先,让我们来看一个例子,大家可以猜测下输出结果是什么。1.父类public class FatherClass { String info="FatherClass";}2.子类public class SonClass extends Fath...原创 2019-04-26 15:58:06 · 17813 阅读 · 4 评论 -
Java:简述Java中的自定义异常
Java:简述Java中的自定义异常 虽然Java系统已经预定义好了很多异常类,但是有时会遇到预定义的异常类不能描述出现的错误。在这种情况下,程序员可以通过扩展Exception类及其子类来定义自己的异常类。1. 自定义异常,格式如下:class 异常类名 extends Exception { public...原创 2019-04-19 13:48:53 · 6868 阅读 · 0 评论 -
Java:简述throw-throws异常抛出
Java:简述throw-throws异常抛出 任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句。一、throws抛出异常 &n...原创 2019-04-19 12:37:27 · 16762 阅读 · 10 评论 -
Java:简述Java数据类型(基本类型,对象类型)之间的比较
Java:简述Java数据类型(基本类型,对象类型)之间的比较 Java的数据类型分为两种:基本类型:byte(8),short(16),int(32),long(64),float(32),double(64),char(16),boolean(1)对象类型:Byte,Short,Integer,Long,Float...原创 2019-04-26 17:17:33 · 1277 阅读 · 0 评论 -
Java:判断一个对象是否是特定类的实例(InstanceOf)
通过比较上面的两个测试代码,可以得知:通过InstanceOf运算符比较,子类对象是父类对象的实例;通过Class.getClass()方法比较,子类对象不是父类对象的实例。原创 2019-04-09 19:23:31 · 12258 阅读 · 0 评论 -
Java:计算出生到现在的天数
【代码】Java:计算出生到现在的天数。原创 2018-02-23 21:42:53 · 10472 阅读 · 0 评论 -
Java:简述Java开发中的实体类
Java:简述Java开发中的实体类一、实体类百度百科中对于 实体类 的定义为:实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行数据本身相关的操作。这两方面内容对应到实现上,最简单的实体类是 POJO(Plain Ordinary Java Object...原创 2019-02-22 11:36:47 · 11900 阅读 · 2 评论