JAVA
文章平均质量分 73
Java学习之路,面向对象编程
洒家肉山大魔王
学习是一辈子的事情,去身上的戾气也是一辈子的修炼。
展开
-
ULID和UUID
和 UUID 要么基于随机数,要么基于时间戳不同,ULID 是既基于时间戳又基于随机数,时间戳精确到毫秒,毫秒内有1.21e + 24个随机数,不存在冲突的风险,而且转换成字符串比 UUID 更加友好。支持时间戳值类型有int,float,str,bytes,bytearray,memoryview,datetime,Timestamp,和ULID。支持随机值类型有int,float,str,bytes,bytearray,memoryview,Randomness,和ULID。原创 2023-03-04 15:37:00 · 627 阅读 · 0 评论 -
能代替try catch处理异常的优雅方式
不过跟异常处理相关的只有注解@ExceptionHandler,从字面上看,就是 异常处理器 的意思,其实际作用也是:若在某个Controller类定义一个异常处理方法,并在方法上添加该注解,那么当出现指定的异常时,会执行该处理异常的方法,其可以使用springmvc提供的数据绑定,比如注入HttpServletRequest等,还可以接受一个当前抛出的Throwable对象。这样一来,就会造成大量的冗余代码,而且若需要新增一种异常的处理逻辑,就必须修改所有Controller类了,很不优雅。原创 2023-03-04 15:19:59 · 807 阅读 · 0 评论 -
Java的jar包如何防止被反编译?
从理论上来说,黑客如果有足够的时间,被混淆的代码仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地防止反编译。图4是代码混淆的示图。控制混淆就是对程序的控制流进行混淆,使得程序的控制流更加难以反编译,通常控制流的改变需要增加一些额外的计算和控制流,因此在性能上会给程序带来一定的负面影响。在具体的方案中,我们将程序分为两个部分,一个是由本地代码编写的题库访问的模块,另外一个是由Java开发的其它模块。转载 2023-01-15 11:37:18 · 603 阅读 · 0 评论 -
程序员应该这样理解I/O
IO是输入input输出output的首字母缩写形式,直观意思是计算机输入输出,它描述的是计算机的数据流动的过程,因此IO第一大特征是有数据的流动;另外,对于一次IO,它究竟是输入还是输出,是针对不同的主体而言的,不同的主体有不同的描述。例如,甲乙两人交谈,甲将大脑中的想法通过声带震动,继而通过声波传入乙的耳朵,乙通过耳膜的震动再由神经将信号解析到大脑,这个数据流动的过程对甲而言是输出,对乙而言是输入。因此,理解IO一定要弄清楚所要研究的本体。下面,我们从三个层面来理解IO。首先,从直观层面去理解IO。..转载 2022-08-04 15:16:44 · 293 阅读 · 0 评论 -
序列化和反序列化-美团技术团队
序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中;另一方面,它们会以其他更容易理解的概念出现,例如加密、持久化。然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式、大数据量系统设计里面更为显著。恰当的序列化协议不仅可以提高系统的通用性、强健性、安全性、优化系统性能,而且会让系统更加易于调试、便于扩展。...转载 2022-09-05 22:32:25 · 232 阅读 · 0 评论 -
通过反射获取Class对象的四种方式
如果我们动态获取到这些信息,我们需要依靠Class对象。Class类对象将一个类的方法、变量等信息告诉运行的程序。原创 2022-08-02 11:40:38 · 784 阅读 · 0 评论 -
如果有些字段不想进行序列化怎么办?
对于Java语言中,我们序列化的都是对象(Object),也就是实例化后的类(class),但是在c++这种半面相对象语言中,struct(结构体)定义的是数据结构类型,而class对应的是对象类型。如果我们需要持久化Java对象,比如将Java对象保存在文件中,或者网络传输Java对象时,这些场景都需要用到序列化。当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。将在序列化过程中所生成的二进制字节流转换成数据结果或者对象的过程。首先,我们线连接一下什么是序列化?...原创 2022-08-01 18:26:21 · 1090 阅读 · 0 评论 -
Java中创建对象的5种方式
作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:创建对象的工作交给Spring。那么在连使用new关键字创建对象都离我们渐行渐远的今天,你是否知道Java中创建对象有哪些种方式呢?本文将介绍5种方式来创建一个java对象:使用new关键字 使用Class.newInstance 使用Constructor.newInstance 使用Clone方法 使用反序列化1. new关键字使用new关键字创建对象,这是我们最常见的也是最简单的创建转载 2022-07-04 22:04:49 · 5453 阅读 · 0 评论 -
什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化b,作用。为啥要实现这个 Serializable 接口,也就是为啥要序列化c,serialVersionUID 这个的值到底是在怎么设置的,有什么用。有的是1L,有的是一长串数字,迷惑ing。我刚刚见到这个关键字 Serializable 的时候,就有如上的这么些问题。在处理这个问题之前,你要先知道一个问题,这个比较重要。这个Serializable接口,以及相关的东西,全部转载 2022-02-19 21:13:53 · 1010 阅读 · 0 评论 -
HashMap源码分析
HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap基于哈希表的Map接口实现,是常用的Java集合之一,是线程非安全的。 HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个。 HashMap它根据键的 HashCode 值存储数据,具有很快的访问速度,不支持线程同步。 HashMap 是无序的,即不会记录插入的顺序。 HashMap 继承于AbstractM...原创 2021-09-30 15:15:00 · 233 阅读 · 0 评论 -
关于LinkedList
前言LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性。LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法:List<Object> linkedList = Collections.synchronizedList原创 2021-09-25 20:11:11 · 2740 阅读 · 2 评论 -
Java中的final、static、this、super 关键字
final关键字 final 关键字,意思是最终的、不可修改的,最见不得变化 ,用来修饰类、方法和变量,具有以下特点: final 修饰的类不能被继承,final 类中的所有成员方法都会被隐式的指定为 final 方法; final 修饰的方法不能被重写; final 修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象。 说明:使用 final 方法的原因有两个。第一个原因是把..原创 2021-08-16 21:40:18 · 193 阅读 · 0 评论 -
Java中String、StringBuffer 、StringBuilder
String StringBuffer 和 StringBuilder 的区别是什么? 【1】可变性String类中使用 final 关键字修饰字符数组来保存字符串,privatefinal char value[],所以String对象是不可变的。在 Java 9 之后,String、StringBuilder与StringBuffer的实现改用 byte 数组存储字符串privatefinal byte[] value为什么使用byte字节而舍弃了char字符?节省...原创 2021-08-13 16:26:15 · 150 阅读 · 0 评论 -
Java中的Object 类的常见方法
public class Object每个类都使用Object作为超类,所有对象(包括数组)都实现这个类的方法。Object类中的方法:package java.lang;public class Object { private static native void registerNatives(); static { registerNatives(); } /** * native方法,用于返回当前运行时对象的Clas.原创 2021-08-13 12:13:08 · 199 阅读 · 0 评论 -
Java基本数据类型与包装数据类型的使用标准
Reference:《阿里巴巴Java开发手册》【强制】所有的 POJO 类属性必须使用包装数据类型。 【强制】RPC 方法的返回值和参数必须使用包装数据类型。 【推荐】所有的局部变量使用基本数据类型。比如我们如果自定义了一个Student类,其中有一个属性是成绩score,如果用Integer而不用int定义,一次考试,学生可能没考,值是null;也可能考了,但考了0分,这两个表达的状态明显不一样。说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 .原创 2021-08-12 21:39:55 · 321 阅读 · 3 评论 -
Java异常处理方式
Java通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后变抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、finallly、throws、throw。...原创 2021-08-10 21:32:42 · 212 阅读 · 0 评论 -
Java中==和equals()的区别
==和equals()最大的区别是:一个是运算符,一个是方法。==:如果比较的对象是基本数据类型,则比较数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址是否相等。equals():用来比较两个对象的内容是否相等。注意:equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。...原创 2021-08-10 21:20:15 · 35010 阅读 · 2 评论 -
Java的引用拷贝、 浅拷贝和深拷贝
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。...原创 2021-08-04 22:04:10 · 241 阅读 · 0 评论 -
Java中hashCode()与 equals()
当你把对象加入 HashSet时,HashSet会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet会假设对象没有重复出现。但是,仅仅当创建并某个“类的散列表”(关于“散列表”见下面说明)时,该类的hashCode() 才有用(作用是:确定该类的每一个对象在散列表中的位置;其它情况下(例如,创建类的单个对象,或者创建类的对象数组等等),类的hashCode() 没有作用。因此,返回true。..转载 2021-08-02 21:18:43 · 4920 阅读 · 6 评论 -
Java 中处理 Exception 的最佳实践
在 Java 中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等。这也是绝大多数开发团队都会制定一些规则来规范对异常的处理的原因。而团队之间的这些规范往往是截然不同的。本文给出几个被很多团队使用的异常处理最佳实践。1. 在 finally 块中清理资源或者使用 try - with - resource 语句当使用类似 InputStream 这种需要使用后关闭的资源时,一个常见的错误就是在 try原创 2021-07-31 18:48:05 · 135 阅读 · 0 评论 -
Java异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。异常发生的原因有很多,通常包含以下几大类:用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。这些异常有的是因为用户错误引起,有原创 2021-07-15 20:38:41 · 206 阅读 · 0 评论 -
Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件
//生成一个文件对象:File file = new File(getClass().getClassLoader().getResource("test.xml").getPath());//直接得到一个输入流:InputStream in = getClass().getClassLoader().getResourceAsStream("test.xml");//在当前线程获取--这种方法不大稳定//String path = Thread.currentThread().getCon.原创 2021-06-30 16:58:04 · 317 阅读 · 1 评论 -
Java中的重载(overloading)和重写(overriding)
重写(Override)从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。public class Father { public static void main(String[] args..原创 2021-06-29 21:34:23 · 435 阅读 · 0 评论 -
Java中instanceof关键字的作用
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。严格来说,instanceof 是 Java 的一个二元操作符(双目运算符),类似于 ==,>,< 等操作符。用来测试一个对象是否是为一个类的实例,用法为:boolean result = obj instanceof class其中 obj 为一个对象,Class 表示一个类或者一个接口。当 obj 为 Class 的对象,或者是其直接或间接.原创 2021-06-29 21:24:40 · 8483 阅读 · 1 评论 -
weblogic12C安装
安装新建用户 useradd weblogicpasswd weblogic 需要jkd1.8,给执行权限,做好jdk环境配置 上传weblogic12安装jar包,给执行权限 切换weblogic用户,并创建目录 # weblogic12的安置路径# 可以把web12的安装包、oraInst.loc和wls.rsp放在这里mkdir /home/weblogic/# weblogic12的清单路径,保持为空mkdir /home/weblogic/oraInventory原创 2021-05-30 20:57:00 · 421 阅读 · 0 评论 -
Java的Number和Math类
一般情况下,当我们需要使用数字的时候,通常使用内置的数据类型,如:byte、int、long、double等。例如:int a = 0;float f1 = 10.11f;double d1 = 0x1a;在实际开发中,我们常会遇到要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java为每一个内置数据类型提供了对应的包装类。所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。包装类 基本数据类型原创 2021-05-07 21:50:50 · 158 阅读 · 0 评论 -
Java的switch case 语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。switch case 语句语法格式如下:switch(expression){ case value1 : //语句 break; //可选 case value2 : //语句 break; //可选 //你可以有任意数量的case语句 default : //可选 //语句}switch case原创 2021-03-28 12:40:05 · 759 阅读 · 0 评论 -
Java条件语句
if语句一个 if 语句包含一个布尔表达式和一条或多条语句。if 语句的语法如下:if(布尔表达式) { //如果布尔表达式为true将执行的语句}如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。public class MyDemo{ public static void main(String args[]){ int x = 10; if( x < 20 ) {原创 2021-03-28 12:31:09 · 179 阅读 · 0 评论 -
Java的break和continue关键字
break 关键字break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。break 跳出最里层的循环,并且继续执行该循环下面的语句。语法break 的用法很简单,就是循环结构中的一条语句:break;public class MyDemo{ public static void main(String args[]) { int [] numbers = {10, 20, 30, 40, 50}; for(int x :原创 2021-03-28 12:24:56 · 200 阅读 · 0 评论 -
Java循环结构语句
Java中有三种主要的循环结构语句while循环 do...while循环 for循环 增强型for循环(在Java5中引入,主要用于数组遍历的增强型for循环)while循环while是最基本的循环语句,结构:while(布尔表达式){ //循环结构体}如果while的循环表达式为true,将产生死循环。public class MyDemo { public static void main(String args[]) { int x原创 2021-03-27 21:22:10 · 173 阅读 · 0 评论 -
Java运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java运算符分成以下几组:算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运算符算术运算符算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。表格中的实例:int A = 10, B = 20;操作符 描述 例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 -原创 2021-03-27 21:06:45 · 86 阅读 · 0 评论 -
Java关键字protected详解
很多介绍Java语言的书籍(包括《Java编程思想》)都对protected介绍的比较的简单,基本都是一句话,就是:被 protected 修饰的成员对于本包和其子类可见。这种说法有点太过含糊,常常会对大家造成误解。实际上,protected的可见性在于两点:基类的 protected 成员是包内可见的,并且对子类可见; 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。我们可以通过以下几个关于pro.原创 2021-03-27 20:36:09 · 3617 阅读 · 0 评论 -
Java修饰符
Java语言提供了很多修饰符,主要分为以下两类:访问修饰符 非访问修饰符修饰符用来定义类、方法或变量。通常放在语句的最前端。举个栗子:public class U_Class_Name { // ...}private boolean uFlag;static final double weeks = 9.5;protected static final int BOXWIDTH = 42;public static void main(String[] argument原创 2021-03-27 20:34:40 · 133 阅读 · 0 评论 -
Java变量类型
在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式:type identifier [ = value][, identifier [= value] ...] ;格式说明:type为Java数据类型。identifier是变量名。可以使用逗号隔开来声明多个同类型变量。以下列出了一些变量的声明实例。注意有些包含了初始化过程。int a, b, c; // 声明三个int型整数:a、 b、cint d = 3, e = 4, f = 5; // 声明三个整数...原创 2021-03-27 20:32:01 · 89 阅读 · 0 评论 -
Java数据类型
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。Java 的两大数据类型:基本数据类型 引用数据类型1、基本数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。byte:byte 数据类型是8位、有符号的,以二进制补码表示的整数; 最小值是.原创 2021-03-27 14:10:16 · 100 阅读 · 0 评论 -
Java从入门到跑路
一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 类:类是一个模板,它描述一类对象的行为和状态。 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。第一个Java程序下面看一原创 2021-03-27 13:54:45 · 374 阅读 · 0 评论 -
Java对象和类
Java作为一种面向对象的编程语言。支持以下基本概念:封装 继承 多态 抽象 类 对象 实例 方法 重载本节我们重点研究对象和类的概念。对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一只鸭子是一个对象,它的状态(对象的属性)有:颜色、名字、品种;行为(对象的方法)有:奔跑、游泳、觅食、嘎嘎叫等。类:类是一个模板,它描述一类对象的行为和状态。下图中男孩(boy)、女孩(girl)为类(class),而具体的每个人为该类的对象(object):原创 2021-03-27 13:42:28 · 136 阅读 · 0 评论 -
2的N次方对照表
2^1 = 22^2 = 42^3 = 82^4 = 162^5 = 322^6 = 642^7 = 1282^8 = 2562^9 = 5122^10 = 10242^11 = 20482^12 = 40962^13 = 81922^14 = 163842^15 = 327682^16 = 655362^17 = 1310722^18 = 2621442^19 = 5242882^20 = 10485762^21 = 20971522^22 = 4194304.原创 2021-02-24 14:17:28 · 15794 阅读 · 0 评论 -
JAVA 线程池的分析和使用
1. 引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。2. 线程池的使用线程池的创建我们可以通过 ThreadPoolExecutor 来创建一个线程池。转载 2021-02-19 15:22:10 · 165 阅读 · 0 评论 -
Java通过System.load()和System.loadLibrary()方式加载动态库的区别
1.共同点System.load()与System.loadLibrary()方法均能够加载Windows环境、Linux环境下的动态库文件,而且不区分是封装好的JNI库文件或者非JNI库文件。当带有native关键字的本地方法在被调用时,都会通过这两种方式之一将其加载至内存。2.区别System.load(String filename) :参数filename为文件的绝对路径,或相对路径下的动态库文件的全限定名称。相对路径://相对路径path//===============原创 2021-01-21 22:03:06 · 13594 阅读 · 18 评论