- 博客(97)
- 资源 (1)
- 收藏
- 关注
原创 使用Preferences持久化数据 --《JAVA编程思想》90
Preferences API 与对象序列化相比,它可以自动存储和读取信息。它采用键值对的方式保存信息,可以存储任何基本类型和字符串,但每个字符串的长度不可以超过 8K 。下面来看个具体的例子。public class PreferencesDemo { public static void main(String[] args) throws BackingStoreException { //在当前用户下生成存储节点(systemNodeForPackage()为在根目录下
2022-01-03 09:00:00
337
原创 静态字段如何序列化? --《JAVA编程思想》88
当对象中包含静态字段时,该如何进行序列化呢?我们先来看一个模拟 CAD 系统的例子。Shape 为一个抽象基类,定义了基本的构造方法、color 的 get/set 抽象方法、生成三个导出类的工厂方法,以及改写了 toString() 方法。abstract class Shape implements Serializable { public static final int RED = 1, BLUE = 2, GREEN = 3; private int xPos, yPo
2021-12-30 22:30:20
665
原创 多次重复序列化同一对象的踩坑点 --《JAVA编程思想》87
今天记录使用序列化过程中的两个踩坑点,和大家一起分享。1.同一对象多次序列化假设我们在序列化中,对一个对象进行多次序列化,反序列化是会是单个还是多个对象呢?先来看一个例子。public class Pet implements Serializable { private String name; public Pet(String name) { this.name = name; } public static void main(String
2021-12-29 23:01:32
732
原创 对象序列化时屏蔽字段 --《JAVA编程思想》86
通过 Serializable 接口实现序列化时,默认会将全部字段进行持久化。但出于安全考虑,部分敏感字段,比如:密码,我们并不希望它也被持久化。public class User implements Serializable { private String name; private String password; public User(String name, String password) { this.name = name;
2021-12-26 18:36:55
618
原创 对象序列化 --《JAVA编程思想》85
当创建对象时,只要你需要,它就会一直存在,但当程序终止时,创建的对象也会不复存在。假设我们想在程序不运行的情况下,也能保存对象的信息,这时可以通过 JAVA 的对象序列化将对象进行持久化保存(虽然可以通过写入文件或者数据库达到相同的效果,但任何实现方式都有适合它自己的场景,技多不压身)。序列化的对象必须实现 Serializable 接口,它会转换成字节序列,并能够将这个字节序列完全恢复为原来的对象,这一过程可以通过网络运行,能弥补不同操作系统之间的差异,即在 windows 系统创建的对象进行序列化后
2021-12-26 17:42:20
192
原创 JAVA原生的文件压缩方法 --《JAVA编程思想》84
今天和大家分享三种 JAVA 原生的压缩文件方法。目录1. GZIP2. ZIP3. JAR1. GZIP将输出流封装成 GZIPOutputStream,将输入流封装成 FileInputStream ,剩下的就是基本的 I/O 读写。public class GZIPCompress { public static void main(String[] args) throws IOException { BufferedOutputStream out =
2021-12-22 20:09:00
804
原创 JAVA实现对文件加锁防篡改 --《JAVA编程思想》83
在代码中,可以通过 synchronized 关键字对代码片段进行加锁,假设我们需要对文件进行加锁,synchronized 只能对 JAVA 执行代码进行加锁,倘若另外一个操作文件的线程是操作系统中其他的某个本地线程呢?这时仅仅通过 synchronized 关键字来加锁显然是不行的。但好在 JDK 1.4 引入了针对本地操作系统的文件加锁机制,下面便和大家一起来学习。 public static void main(String[] args) throws IOException, Inte
2021-12-19 11:51:36
1623
原创 通过内存映射读取超大文件 --《JAVA编程思想》82
假设文件太大的话,我们不能将整个文件都读取到内存之中,但可以通过内存映射文件,每次将文件的一小部分映射到内存中,即使再大的文件,也可以对其修改。下面一起来看个小例子:public class LargeMappedFiles { static int length = 128 * 1024 * 1024; public static void main(String[] args) throws IOException { MappedByteBuffer out
2021-12-18 22:39:46
617
原创 通过ByteBuffer交换字符位置--《JAVA编程思想》81
ByteBuffer 中可以通过4个索引高效操作数据,它们分别是:mark(标记)、position(位置)、limit(界限)、capacity(容量)。下表是具体操作这些索引的方法:方法名用途capacity()返回缓冲区容量clear()清空缓冲区,将 position 设置为0,limit 设置为容量。可以通过此方法覆写缓冲区flip()将 limit 设置为 position ,position 设置为0。此方法用于准备从缓冲区读取数据limit()
2021-12-16 22:53:46
337
原创 通过视图修改 ByteBuffer --《JAVA编程思想》80
ByteBuffer 只能操作字节,无法产生任何基本类型,但 ByteBuffer 提供 asCharBuffer()、asShortBuffer()、asIntBuffer() 返回对应基本类型的视图,我们对视图的任何修改对会映射成为对 ByteBuffer 数据中的修改。视图允许我们单个或批量的往 ByteBuffer 中写入数据。示例:asIntBuffer() 获取 int 类型的视图,通过 get() 方法读取数据,put() 方法写入数据。public class IntBuffer
2021-12-12 21:50:20
504
原创 NIO 类的基本用法 --《JAVA编程思想》79
JDK 1.4 引入了 java.nio.* 新类库提升 I/O 读写速度, 效率的提升主要得益于 nio 类库中采用的数据结构更接近于操作系统执行 I/O 的方式:通道和缓冲器。通道中存放着数据;缓冲器作为搬运工,在通道内对数据进行读写操作,我们只操作缓冲器,不直接与通道产生联系。下面先来看个简单的示例:FileOutputStream、RandomAccessFile、FileInputStream 分别对应只写通道、读写通道、读通道的获取方式;FileChannel 中只能写入字节,读取的时
2021-12-12 13:22:09
623
原创 文件的输入和输出 --《JAVA编程思想》77
输入流来自 inputStream输出流来自 outputStream默认都有缓冲操作inputStram 和 outputStream 面向字节Reader 和 Writer 面向字符
2021-12-05 22:45:41
529
原创 File 类的基本用法 --《JAVA编程思想》76
File 可以代表文件或者目录,还可以查看文件的特性或者进行修改、删除操作,特此记录和大家一次分享。目录1.文件是否存在2.创建文件3.创建文件夹4.获取文件名和文件路径5.文件重命名7.删除文件8.文件大小9.最后修改日期10.判断目录11.获取目录内文件列表12.判断文件可否读写1.文件是否存在exists() 可判断文件是否存在 public static void main(String[] args) throws IOException { File file
2021-12-04 17:05:25
585
原创 论文考查要求 -- 《信息系统项目管理师备考》00
目录1.重点考点2.论文要求3.评分标准4.不及格类型5.论文框架6.注意事项1.重点考点往年论文题目出现频率极高的是十大管理的内容,需要重点关注:整体管理范围管理进度管理成本管理质量管理人力资源管理沟通管理干系人管理风险管理采购管理2.论文要求3.评分标准4.不及格类型5.论文框架6.注意事项...
2021-11-29 22:01:17
801
原创 集合的好帮手:Collections 工具类 --《JAVA编程思想》74
Java 提供了原生的 java.util.Collections 工具类,里面包含了大量的静态方法服务于 Collection 的各种操作,特此记录和大家一起学习!
2021-11-20 17:29:58
841
1
原创 TreeSet、HashSet和LinkedHashSet该如何选择? --《JAVA编程思想》 71
我们实现 Set 集合时,主要有 TreeSet、HashSet 和 LinkedHashSet 三种选择,我们该如何对它们进行选择呢?今天和大家一起从添加、查询、移除、遍历四个方面对 Set 的子类进行测试,看看它们的性能究竟如何?0.准备工作首先使用泛型定义一个通用的测试模板 SetTest,将需要实际测试的方法抽象为 test() ,返回值为执行测试方法所花费的时间。public abstract class SetTest<T extends Set> { private
2021-11-14 17:17:24
375
原创 ArrayList和LinkedList该如何选择? --《JAVA编程思想》 70
我们在实现 List 时,通常会考虑使用 ArrayList 和 LinkedList ,Vector 属于遗留代码类库,已不推荐使用。下面,我们将以 List 的各种常用操作作为测试指标,验证 ArrayList 和 LinkedList 两者的性能指标;在此之前,先定义好测试模板,更好的帮助我们编写测试代码;ContainerTest 为一个通用的测试基类,用泛型来兼容 ArrayList 和 LinkedList;再定义抽象方法 test(),便于我们自定义各种需要测试的方法。public a
2021-11-13 19:50:16
673
2
原创 如何定义两个对象相等? --《JAVA编程思想》 69
我们在对非基本类型进行比较时,往往需要重写 equals() 方法来判断两者是否相等。比如我们现在定义一个 Student 类,希望只要其 number 相等,就认为这是同一个 Student。public class Student { private int number; private String name; public Student(int number, String name) { this.number = number;
2021-11-07 23:23:18
372
原创 List类的实用方法 --《JAVA编程思想》 68
今天接着介绍 List 类中专属的方法,包含在 Collection 类中的相同方法将不再做介绍(可参考Collection 类的实用方法 )。1.往指定位置插入元素List 中的 add(index,T) 和 addAll(index,Collection<? extend T>)可以朝指定位置插入元素。 public static void main(String[] args) { List<String> list = new ArrayList&
2021-11-06 13:17:16
125
原创 Collection 类的实用方法 --《JAVA编程思想》 67
今天和大家分享 Collection 类能够执行的方法,这些方法同样适用于实现了 Collection 接口的 Set 和 List 。1.添加单个元素add(T) 用于添加持有泛型 T 的参数。 public static void main(String[] args) { Collection<String> c = new ArrayList<String>(); c.add("China"); System.out
2021-11-05 23:03:26
323
原创 数组内元素如何排序? --《JAVA编程思想》 66
在实际编码的过程中,经常需要对数组进行排序,下面一起和大家看看几种常见的排序场景。1.根据数字大小升序Arrays.sort() 默认根据数字大小进行升序。public class SortArray { public static void main(String[] args) { Integer[] ints = {12, 94, 75, 24, 14, 17, 9, 64, 32, 21, 30, 54, 27}; Arrays.sort(ints);
2021-10-31 18:41:54
246
原创 Arrays类的实用功能 --《JAVA编程思想》 65
今天和大家一起分享和 Arrays 类的相关实用功能。1.打印数组Arrays.toString() 可以将数组作为 String 类型表示。public class ArrayToString { public static void main(String[] args) { String[] strings = {"a", "b", "c"}; System.out.println(Arrays.toString(strings)); i
2021-10-30 23:20:12
163
原创 JAVA 实现潜在类型机制 --《JAVA编程思想》 63
为了尽可能地广泛应用代码,我们希望通过各类途径来放开类型所作的限制,但同时又不能丢失静态类型的检查。在 Python 和 C++ 中便有这种解决方案,称为“潜在类型机制”或“结构化类型机制”。我们不关心具体类型,只要求实现某个方法子集(不要求是公共接口),我们便可进行调用。即“如果它走起来像鸭子,并且叫起来也像鸭子,那么你就可以将它当作鸭子对待”。潜在机制类型可以横跨类继承结构,调用不属于某个公共接口的方法。我们来看一段 Python 代码,如下所示:class Dog: def speak(se
2021-10-24 21:30:10
1866
原创 在JAVA中实现混型的两种方式 --《JAVA编程思想》 62
混型的基本概念是混合多个类的能力,以产生一个可以表示混型中所有类型的类。我们来看个简单的需求:现在需要把获取当前时间戳、获取计数器和存取某个值的三个类合成一个混型。1. 通过接口实现首先,我们可以直接通过接口的形式来满足需求。public interface TimeStamped { long getStamp();}public class TimeStampedImp implements TimeStamped { @Override public long
2021-10-23 21:15:49
279
原创 泛型在容器中的安全问题 --《JAVA编程思想》 61
今天和大家聊聊泛型在容器中存在的安全问题,我们先来看一个例子。public class Pet {}public class Dog extends Pet {}public class Cat extends Pet {}public class PelList { public static void main(String[] args) { List dogs = new ArrayList<Dog>(); dogs.add
2021-10-18 22:43:02
140
原创 泛型:自限定类型中的参数协变--《JAVA编程思想》 60
泛型的自限定类型可以产生协变参数类型:方法参数类型会随子类而变化。我们先来回顾一下 JAVA 中的协变返回类型。导出类可以重写基类方法返回更为具体的类型,相对于对返回类型进行了窄化处理。public class Base {}public class Derived extends Base {}public interface OrdinaryGetter { Base get();}public interface DerivedGetter extends Ordinar
2021-10-17 22:22:59
143
原创 泛型带来的一些问题 --《JAVA编程思想》 58
今天我们来聊聊,使用泛型的过程中,遇到的一些问题。1.任何基本类型不能作为类型参数基本类型都有对应的包装类型,如 int对应 Integer。我们可以将 int类型放入 ArrayList<Integer>,但却不能创建ArrayList<int>。故泛型不支持基本类型的自动包装机制。 public static void main(String[] args) { ArrayList<Integer> integers = new Arra
2021-10-16 17:35:57
413
原创 为何需要使用泛型的通配符? --《JAVA编程思想》 56
我们先来看一个导出类型的数组赋予基类型数组的例子:public class Fruit {}public class Apple extends Fruit {}public class RedApple extends Apple {}public class CovariantArrays { public static void main(String[] args) { Fruit[] fruits = new Apple[10]; fruit
2021-09-26 22:59:14
190
原创 泛型数组需要怎么建立? --《JAVA编程思想》 54
今天和大家一起探讨如何创建一个泛型数组?可能会有人说,这还不简单,直接 T[] array = new T[size],不就可以了嘛?很可惜,编译器会提示泛型无法直接被实例化。那我们换个思路,先创建一个 Object 数组,再将它转换成对应的泛型,是不是就可以了呢?public class GenericArrayTest<T> { private T[] array; public GenericArrayTest(int size) { this
2021-09-21 22:35:50
818
原创 泛型擦除是什么? --《JAVA编程思想》 53
先和大家来看一个问题:ArrayList<String> 和ArrayList<Integer>是否为不同的类型?不同的类型的具有不同的行为,如我们可以将一个 String 对象放入 ArrayList<String>,但却不能将 Integer 对象放入,故我们会认为上述两个 ArrayList 是不同的类型。但实际真的如此嘛?通过代码告诉我们答案。public class ErasedTypeTest { public static void main
2021-09-16 23:33:16
233
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人