Java基础
文章平均质量分 86
Java基础
小鲁蛋儿
莫道桑榆晚,为霞尚满天。
展开
-
掌握 TypeToken 原理及泛型擦除
正如上面说的,如果直接把的类型传过去,因为运行时泛型被擦除了,所以得到的其实是 ArrayList,那么后面的Gson就不知道要转成 ArrayList类型了。转载 2022-08-08 16:45:17 · 1121 阅读 · 0 评论 -
Java 语法糖详解
语法糖(Syntactic Sugar)也称糖衣语法,是英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。前面介绍了 12 种 Java 中常用的语法糖。所谓语法糖就是提供给开发人员便于开发的一种语法而已。但是这种语法只有开发人员认识。要想被执行,需要进行解糖,即转成 JVM 认识的语法。转载 2022-11-16 16:01:46 · 1047 阅读 · 1 评论 -
List.toArray()转数组的正确操作方式
编译的时候不出现问题,但是运行时会出现ClassCastException。参考阿里巴巴开发手册。原创 2022-10-29 17:03:42 · 406 阅读 · 0 评论 -
位移运算符
1.正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补零即可(正数的原码,补码,反码是一样的)2.负数的右移,就是补码高位补1,然后按位取反加1即可。原创 2022-04-10 13:00:45 · 338 阅读 · 0 评论 -
Java中的标记接口(标签接口)
Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口。简单一句话描述标记接口就是用来判断某个类是否具有某个能力的首先明确一点,Marker Interface(标记接口)决不是Java这门编程语言特有的,而是。上面这段话是维基百科对标记接口的定义。具体说的就是:标记接口是计算机科学中的一种设计思路。编程语言本身不支持为类维护元数据。而标记接口则弥补了这个功能上的缺失——转载 2022-09-14 11:26:45 · 2310 阅读 · 0 评论 -
深入理解String、StringBuffer 和 StringBuilder类的区别
String(JDK1.0):不可变字符序列StringBuffer(JDK1.0):可变字符序列、效率低、线程安全StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。深入理解String、StringBuffer和StringBuilder类的区别 - 腾讯云开发者社区-腾讯云 (tencent.com)...转载 2022-08-23 12:20:05 · 258 阅读 · 0 评论 -
BigInteger类与BigDecimal类
BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。Integer类作为int的包装类,能存储的最大整型值为231-1,Long类也是有限的,最大为263-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal类。BigDecimal类支持不可变的、任意精度的有符号十进制定点数。java.math包的。原创 2022-08-23 19:35:40 · 166 阅读 · 0 评论 -
Java Math类
java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型。原创 2022-08-23 19:11:11 · 119 阅读 · 0 评论 -
Java System类
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。System类内部包含in、out和err三个成员变量,分别代表标准输入流 (键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。Java安装目录: D:\developer_tools\jdk\1.8.0_131\jre。用户的当前工作目录: D:\workspace_idea1\JavaSenion\day04。用户的主目录: C:\Users\3207215962。用户的账号名称: 3207215962。原创 2022-08-23 18:48:23 · 128 阅读 · 0 评论 -
Java 比较器
Java中的对象,正常情况下,只能比较:==或!=,不能使用 > 或 < 的,但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。原创 2022-08-23 18:21:17 · 78 阅读 · 0 评论 -
Java 日期时间API
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。第三次引入的API是成功的,并且Java 8中引入的java.time API 已经纠正过去的缺陷,将来很长一段时间内它都会为我们服务。注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示方法,也就是公历。Instant:时间线上的一个瞬时点。原创 2022-08-23 17:59:06 · 522 阅读 · 0 评论 -
String类
实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+"b"(也是"ab")。相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换。String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。原创 2022-08-23 10:33:16 · 99 阅读 · 0 评论 -
Java不可变类(immutable)机制与String的不可变性
不可变类是实例创建后就不可以改变成员遍历的值。这种特性使得不可变类提供了线程安全的特性但同时也带来了对象创建的开销,每更改一个属性都是重新创建一个新的对象。JDK内部也提供了很多不可变类如Integer、Double、String等。String的不可变特性主要为了满足常量池、线程安全、类加载的需求。合理使用不可变类可以带来极大的好处。JAVA不可变类(immutable)机制与String的不可变性 - along-JL - 博客园 (cnblogs.com)原创 2022-08-23 09:16:42 · 249 阅读 · 0 评论 -
String 和 Char[ ] 作为方法参数的值传递问题
Java中有两种传递方式,值传递和引用传递。基本类型和以 str = "abc" 创建的字符串都是值传递,对象数组等都是引用传递。String 是不可变类,a = "test ok" 等于是重新创建了一个对象,并不改变原来的值,数组是直接改变。方法退出,a,b局部变量及 a 对应的 "test ok" 退出,此时内存结构。如果这里的char型数组改为char类型,char值会改变吗?下面通过内存结构来说明这个问题。不会,char是基本类型。原创 2022-08-22 20:06:17 · 530 阅读 · 0 评论 -
JDK9 为何要将String的底层实现由char[]改成了byte[]
没得办法,和char[]表示String没什么区别,即使现在是byte[]来表示String,还是得乖乖用UTF16编码,和优化之前一样,没节省空间(LATIN1编码集支持的字符有限,其中就不支持中文字符,因此才保留了UTF16兜底)。所以使用char[]来表示String就导致了即使String中的字符单个字节就能表示,还是得占用了两个字节,而实际开发中使用频率最高的却是。的对象之一就是String对象,所以优化String的占用空间是很有意义的,因为String是实际开发中。原创 2022-08-22 16:03:47 · 935 阅读 · 0 评论 -
Optional类
到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原创 2022-08-22 15:09:22 · 2326 阅读 · 0 评论 -
强大的Stream API
Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。原创 2022-08-22 12:06:33 · 159 阅读 · 0 评论 -
方法引用与构造器引用
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致!且方法的返回值即为构造器对应类的对象。原创 2022-08-22 10:51:31 · 242 阅读 · 0 评论 -
函数式(Functional)接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。我们可以在一个接口上使用注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。在java.util.function包下定义了Java 8 的丰富的函数式接口。如何理解函数式接口Java从诞生日起就是一直倡导“一切皆对象”,在Java里面面向对象(OOP)编程是一切。原创 2022-08-22 09:43:53 · 7853 阅读 · 0 评论 -
为什么局部内部类和匿名内部类只能访问 final 的局部变量?
这样就不会报错了,不过还要注意一点,在Java 8 之后,在内部类或 Lambda 表达式中访问的局部变量,如果不是 final 类型的话,编译器自动加上 final 修饰符,即 Java8 新特性:effectively final。问题又出现了:将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?若是基本类型,其值是不能改变的,就保证了copy与原始的局部变量的值是一样的;首先我们看一下匿名内部类的例子。转载 2022-08-21 19:13:47 · 668 阅读 · 0 评论 -
Java 编译和反编译
在介绍编译和反编译之前,我们先来简单介绍下编程语言。编程语言分为低级语言和高级语言。机器语言和汇编语言属于低级语言,直接用计算机指令编写程序。而C、C++、Java、Python等属于高级语言,用语句编写程序,语句是计算机指令的抽象表示。上面提到语言有两种,一种低级语言,一种高级语言。简单的理解:低级语言是计算机认识的语言、高级语言是程序员认识的语言。那么如何从高级语言转换成低级语言呢?这个过程其实就是编译。转载 2022-08-21 18:42:13 · 308 阅读 · 0 评论 -
Lambda 表达式
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为Lambda 操作符或箭头操作符。左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)原创 2022-08-21 18:17:14 · 4449 阅读 · 0 评论 -
Java反射机制
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。动态语言 vs 静态语言。原创 2022-08-21 14:08:53 · 136 阅读 · 0 评论 -
Java在编译到执行过程的编码问题
Javac和Java是JDK自带的工具,其中Javac是编译工具,Java工具启Java虚拟机并执行java程序。这两个工具都带有设置字符编码的选项。本文讨论字符编码选项的使用场景,和出现乱码的原因。javac编译器根据-encoding后跟随的字符编码,解析.java文件。-encoding不设置的时候,使用系统默认字符集解析.java文件。Windows的默认字符集是GBK。无论之前的.java文件采用什么编码,编译后的.class文件都使用UTF-8编码。转载 2022-08-20 17:41:23 · 2885 阅读 · 0 评论 -
UTF-8 与 UTF-16编码详解
UTF-16是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为 "storage format")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元, 长度为2 Byte)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。引用维基百科中对于UTF-16编码的解释我们可以知道,UTF-16最少也会用2 Byte来表示一个字符,因此没有办法兼容ASCII编码。转载 2022-08-19 19:39:08 · 25489 阅读 · 4 评论 -
char可以存汉字吗,底层是怎么存的?
char变量是用来存储Unicode编码字符的,采用Unicode编码集,一个char占用两个字节,而一个中文字符也是两个字节,因此Java中的char是可以表示一个中文字符的;char字符存储的是Unicode编码的代码点,也就是存储的是U+FF00这样的数值,然而我们在调试或者输出到输出流的时候,是JVM或者开发工具按照代码点对应的编码字符输出的。但是对于超过16bit的Unicode字符集,也就是Unicode的扩展字符集,一个char是放不下的,需要两个char才能放。java中char类型使用。转载 2022-08-19 13:54:42 · 2292 阅读 · 0 评论 -
Java IO流
我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能。如果文件不存在则会去创建文件,如果存在则不会创建。处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。...原创 2022-08-19 10:17:17 · 263 阅读 · 0 评论 -
java.io.Serializable(序列化)接口详细总结
虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。原创 2022-08-19 09:44:43 · 7454 阅读 · 0 评论 -
计算机中的编码问题
但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。乱码只是因为我们在对字节解析的时候,组装错误了,就类似于玩积木的时候,放错位置了,但本质的字节没有改变。字符流不能设置字符集,只能是把字符流变为字节流才能进行字符集的设置,因为字节流才有设置字符集的方法。......转载 2022-08-18 18:27:30 · 825 阅读 · 0 评论 -
Java File类的使用
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。File对象可以作为参数传递给流的构造器。.........原创 2022-08-17 17:33:22 · 217 阅读 · 0 评论 -
Java泛型
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念, 允许我们在创建集合时再指定集合元素的类型,正如:List,这表明该List只能保存字符串类型的对象。...原创 2022-08-17 12:56:11 · 320 阅读 · 0 评论 -
Java泛型中通配符的使用详解
?extends T>确定了上界为T,那么获取值时类型一定是T或T的父类,但赋值时由于不能确定具体是T或者T的某个子类而赋值失败。转载 2022-08-17 12:24:19 · 4446 阅读 · 3 评论 -
Java集合
集合、数组都是对多个数据进行存储操作的结构,简称Java容器。说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)Java 集合可分为 Collection 和 Map 两种体系:Collection接口:单列数据,定义了存取一组对象的方法的集合Set:元素无序、不可重复的集合List:元素有序、可重复的集合Map接口:双列数据,保存具有映射关系“key-value对”的集合。...原创 2022-08-16 16:59:44 · 371 阅读 · 0 评论 -
Java注解的使用
从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注解)Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加 载, 运行时被读取, 并执行相应的处理。通过使用 Annotation, 程序员 可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证 或者进行部署Annotation 可以像修饰符一样被使用, 可用于修饰。...原创 2022-08-12 17:52:08 · 1954 阅读 · 0 评论 -
Java枚举类
/自定义枚举类//1.声明Season对象的属性,private final修饰//2.私有化构造器,不定义无参构造器}//3.提供当前枚举类的多个对象:声明为public static final修饰public static final Season SPRING=new Season("春天","春暖花开");public static final Season SUMMER=new Season("夏天","夏日炎炎");...原创 2022-08-12 16:20:33 · 77 阅读 · 0 评论 -
Java多线程操作
生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器,Lock需要手动的启动同步lock(),同时结束同步也需要手动的实现unlock()问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票。...原创 2022-08-12 12:55:19 · 80 阅读 · 0 评论 -
Java异常处理
继承于现的异常结构:RuntimeException 、Exception提供全局常量:serialVersionUID提供重载的构造器}}}原创 2022-08-11 18:45:15 · 373 阅读 · 0 评论 -
接口中的抽象方法,默认方法,静态方法,私有方法
接口是功能的集合,是一种数据类型。接口里定义方法默认是public abstract(抽象方法),没有具体的实现,实现由实现类实现,且必须实现。JDK7及以前:只能定义全局常量和抽象方法全局常量:public static final的,书写时可以省略抽象方法:public abstract的,可以省略JDK8:增加了静态方法、默认方法。JDK 9:增加了私有方法。...原创 2022-08-11 18:02:35 · 3250 阅读 · 0 评论 -
Java面向对象的学习
成员内部类和局部内部类,在编译以后,都会生成字节码文件。成员内部类:外部类$内部类名.class局部内部类:外部类$数字 内部类名.class。原创 2022-08-11 17:26:45 · 506 阅读 · 0 评论 -
Java基本语法
注意:需要根据相应的方法,来输入指定类型的值。原因:简洁、执行效率高。数组:多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节)结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。调用Scanner类的相关方法(next() / nextXxx()),来获取指定类型的变量。此时的容量大小指的是,表示数的范围的大和小。...原创 2022-08-10 18:47:59 · 135 阅读 · 0 评论