![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java基础
文章平均质量分 78
Java基础,教程【韩顺平 零基础30天学会Java】 学习笔记,以及工作中遇到的知识点
2418728171
这个作者很懒,什么都没留下…
展开
-
Java Stream流
合并两个流的时候,尽可能让两个流类型一致,不然合并后就是两个流的共同父类,这样就会使得子类特有方法无法使用。 **中间方法:**方法返回值还是Stream流,也就是说中间方法操作完后,还可以调用其他API。 **终结方法:**最后一步,调用完毕之后,不能再调用其他API了。 可见,源码中传入的是一个泛型的可变参数,也就是说可以传递数组。 因为返回值还是流,所以可以继续进行流操作,因此叫做中间方法。 终结方法的返回值不再是流,因此无法继续进行流操作。原创 2024-05-30 09:18:16 · 897 阅读 · 0 评论 -
Java不可变集合
不可变集合,顾名思义,就是不可以被修改的集合。 一旦该集合创建完毕,其长度和内容均不能改变(不能增、删、改元素),只能查找集合内的元素。原创 2024-05-30 09:17:53 · 383 阅读 · 0 评论 -
Lambda表达式
当接口中只有一个方法必须被实现时,可以使用@FunctionalInterface注解,表示函数式接口; 有多个非default修饰的方法时,意味着需要实现多个方法,此时Lambda不可以用来实例化接口。如果方法体中只有一句,且这一句为返回语句,则在省略大括号时,也必须省略 return 关键字。 当一个接口只有一个非default修饰的方法,即只有一个需要实现的方法,可以使用;快速的将一个lambda的实现指向一个已经实现的方法。将方法引用语法上,将方法名改为new,意味着构造方法。原创 2024-05-30 09:17:31 · 629 阅读 · 0 评论 -
静态常量(static final)优化详解
在StaticFinal中有一个变量i,当变量类型为基本数据类型或者String类型时,访问该常量不会导致类加载,即不会导致静态代码块种语句执行。JVM可能会对static final修饰的类变量进行静态编译优化,这种优化方式通常是特定于具体的JVM实现和编译器的。JVM会尝试在编译阶段对static final修饰的基本类型或String类型的变量进行编译期常量折叠。JVM(Java虚拟机)在处理static final修饰的类变量时,可能会进行常量折叠和静态编译优化。原创 2024-05-30 09:17:09 · 291 阅读 · 0 评论 -
Java四种引用以及ThreadLocal内存泄露问题
通常情况下,PhantomReference 要与 ReferenceQueue 配合使用,当对象被垃圾回收时,JVM 会将其加入到 ReferenceQueue 中,通过检查 ReferenceQueue 中的引用对象,可以得知对象何时被回收。当 GC 完成后,虚拟机会回收那些标记为“即将回收”的对象。PhantomReference 是一种弱引用类型,它指向的对象已经被 JVM 标记为可回收对象,当对象被垃圾回收器回收时,JVM 会将其加入到引用队列中,供应用程序使用。原创 2024-05-30 09:02:56 · 910 阅读 · 0 评论 -
volatile和synchronized的区别
【进入】synchronized 块的内存语义是把在 synchronized 块内使用的变量从线程的工作内存中清除,从主内存中读取。因为会先清空本地内存变量值,再直接从主内存获取最新值,跳过了缓存,保证了只要使用volatile的变量,就会先从主内存同步。上述例子可以发现,在加油机1和2中(也就是线程处理时,只读取价格的值,不修改价格的值或者说修改价格的值不依赖与价格原本的值)共享变量将在L1、L2和主内存中都存在,这样当L1中存在该变量就不必去主内存寻找,补上了内存速度慢的短板。原创 2024-05-30 09:15:28 · 717 阅读 · 0 评论 -
Java类加载过程
③可以考虑使用 -Xverify:none 参数关闭大部分的类的验证措施,缩短虚拟机类加载时间。到了解析阶段,可以获得类由JVM分配的地址,此时将原来的符号替换成真正的引用。①到初始化阶段,才真正执行类中定义的Java程序代码,此阶段是执行<clinit>()方法的过程。如果多个线程同时区初始化一个类,那么只有一个线程区执行这个类的<clinit>()方法,③虚拟机会保证一个类<clinit>()方法在多线程环境中被正确的加锁、同步。例:使用类的静态属性(不进行new)也会导致类的加载。原创 2024-05-29 14:43:41 · 368 阅读 · 0 评论 -
Java Class类简介
3.对于某个类的Class类对象,在内存中只有一份,因为类只加载一次。7.类的字节码二进制数据,是存放在方法区的。类加载器ClassLoader有个方法LoadClass(),将某个类对应的Class对象生成在堆中。运行时加载需要的类,如果运行时不用该类,则不报错(该类不存在或有其他问题),降低依赖性。也就是说一个类不管实例化多少对象,这些对象都和这个类的Class对象相关联。4.每个类的实例,都会与自己类的Class对象(实例)相关联。1.外部类,成员内部类,静态内部类,局部内部类,匿名内部类。原创 2024-05-29 14:42:00 · 646 阅读 · 0 评论 -
Java反射
2.通过类加载器ClassLoader,在堆中创建一个Class类型的对象(一个类只能生成一个Class类型的对象),里面存放这个类的成员变量、构造器、成员方法等。2.加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整信息。3.然后在堆中创建Cat对象,并且该对象和堆中Class类性的对象互相关联,Cat对象知道自己属于哪个Class对象。4.通过反射获得Class类型的对象,就可以利用该对象创建对象,调用方法等。原创 2024-05-29 14:36:43 · 645 阅读 · 0 评论 -
Java网络
数据报套接字是分组传送服务的发送或接收点。应用程序可以更改创建套接字实现的套接字工厂,以配置自己创建适合本地防火墙的套接字。应用程序通过更改创建套接字实现的套接字工厂,可以配置自己创建适合本地防火墙的套接字。2.UDP数据报通过套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全到达目的地。3.DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端以及接收端的IP地址和端口号。4.UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。原创 2024-05-29 14:30:24 · 847 阅读 · 0 评论 -
Java IO流
文件在程序中是以流的形式来操作的。流:数据在数据源(文件)和程序(内存)之间经历的路径。输入流:数据从数据源(文件)到程序(内存)的路径。输出流:数据从程序(内存)到数据源(文件)的路径。①创建文件new File(String pathname)//根据路径创建一个File对象。new File(File parent, String child)//根据父目录文件+子路径构建new File(String Parent, String child)//根据父目录+子路径构建。原创 2024-05-29 14:24:47 · 864 阅读 · 0 评论 -
Java线程基础
1、程序为完成任务,用某种语言编写的一组指令的集合。2、进程进程是指运行中的程序。进程是程序的依次执行过程,或是正在运行的一个程序,是一个动态过程:有自身产生、存在和消亡的过程。3、线程线程是由进程创建的,是进程的一个实体。一个进程可以拥有多个线程,线程也可以创建线程。4、单线程同一时刻,只允许执行一个线程。5、多线程同一时刻,可以执行多个线程。6、并发同一时刻,多个任务交替执行,看起来像是"同时"进行,单核CPU实现多任务就是并发。7、并行同一时刻,多个任务同时进行。原创 2024-05-29 14:14:32 · 599 阅读 · 0 评论 -
Java泛型
/这是错误的,虽然String 时Object的子类,但是不能这样写,但可以直接赋值String。4.泛型类的类型,是在创建对象时确定的(创建对象时,需要指定类型,没有指定则默认为Object)。注意,在定义Test类对象stringTest时制定了E的数据类型,在编译期间,就确定了E的类型。1、在使用集合时,不能对加入到集合中的元素类型进行约束,因为集合里面的元素类型为Object。可以在类声明时通过一个标识来表示类中某个属性的类型,或者某个方法的返回值类型,或者参数类型。原创 2024-05-29 14:08:19 · 898 阅读 · 0 评论 -
Java集合—TreeSet和TreeMap
先将key转变成Comparable对象,如果Key实现了该对象,则可以转,String、包装类等都有实现该接口。该比较器是一个接口,里面有一个方法叫compare(),传入一个实现该接口的类(匿名内部类)根据compare()进行判断,若等于0,则重新设置value,并返回旧值。例如,两个String进行比较则调用String的compare()方法。2.若希望添加的元素有序,需要使用TreeSet提供的构造器,传入一个比较器。1.当使用无参构造器,创建TreeSet时,仍然是无序的。原创 2024-05-29 14:03:11 · 404 阅读 · 0 评论 -
集合—Map子类(HashMap、HashTable、Properties)
有元素则判断对应链表每个元素,判断是否相等,如果相等则直接替换value,然后返回对应旧的值。1.Properties类继承自Hashtable类,并实现了Map接口,也是使用键值对来保存数据。首先判断数据是否为null,这一点和HashMap不一样,其不允许value为null。然后在有参构造器中,经过判断之后,直接创建一个内部类Entry类型的数组,大小为11。然后判断count是否大于阈值,大于旧rehash()扩容,小于则直接加入。链表到底,依旧没有,则直接调用addEntry()加入。原创 2024-05-29 14:01:32 · 752 阅读 · 0 评论 -
Java集合—Set(Collection子接口)及其子类(HashSet、LinkedHashSet)包括HashMap源码分析
Set接口是 Collection接口的子接口。1、无序,即添加元素和去除元素的顺序不一致。但是每次取出的顺序是一致的。2、不允许重复元素,可以有null,但只能有一个。3、实现类很多,主要介绍HashSet、LinkedHashSet 和 TreeSet。因为其为Collection的子接口,因此常用方法和Collection一致。因为其是Collection的子接口,所以其遍历方法与Collection一致。即:使用迭代器Iterator使用增强forHashSet实现了Set接口。原创 2024-05-29 11:40:28 · 1495 阅读 · 0 评论 -
Java集合-List(Collection子接口)及其子类(ArrayList、Vector、LinkedList)
如果next ≠ null,说明被移除的结点不是最后一个结点,此时被移除的结点的后一个结点对象持有的prev需要指向null,这样就断开了对移除结点的引用。该节点的prev = l,item = e, next = null,即新建节点前驱为插入前的last节点,值为传进来的值,后驱节点为null;如果next = null,即原来就只有一个元素,删除的不仅是第一个元素,也是Last所指向的元素,所以需要将last也指向null。注意,index位置必须有元素,否则抛出异常。例,list.get(2);原创 2024-05-29 11:35:20 · 885 阅读 · 0 评论 -
Java Map遍历方法(Map的Iterator原理)
由下面源码可知,这三个类中KeySet和EntrySet继承了AbstractSet类Values继承了AbstractCollection类而类AbstractSet继承了AbstractCollection类,AbstractCollection类又实现了Collection接口。原创 2024-05-29 11:26:00 · 800 阅读 · 0 评论 -
Java常用类
常用类包括:包装类(Wrapper)、String、StringBuffer、StringBuilder、Math、Arrays、System、大数(big..)、日期类(Date、Calendar、LocalDate)原创 2024-05-29 11:05:31 · 879 阅读 · 0 评论 -
Java异常
当程序中出现某些错误,这些错误不在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该异常信息。Exception分为两大类:运行时异常和编译时异常(编译时异常就是由编译器检查出来的异常)。在方法声明中使用throws语句声明抛出异常的列表,可以是方法中产生的异常,也可以是它的父类。子类重写的方法,所抛出的异常类型要么和父类异常一样,要么为父类异常的子类。①在try中发生异常,将在异常的位置停止,异常后面的内容不再执行,直接跳入catch块。(用在声明方法时,表示该方法可能要抛出异常)原创 2024-05-29 11:00:52 · 975 阅读 · 0 评论 -
Java注解
RetentionPolicy.CLASS:编译器将把注解记录在class文件主,当运行Java程序时,JVM不会保留注解。注解(Annotation)和注释一样,不影响程序运行逻辑,但是注解也可以被编译允许,相当于嵌入代码的补充信息。被该注解(名词A)注解(动词)的注解(名词B)注解(动词)的类有子类的话,子类将自动继承注解(名词B)。即被该注解注解的注解将在javadoc工具提取成文档时,可以看到。1、@Override:限定某个方法,是重写父类方法,该注解只能用于方法。原创 2024-05-28 17:13:13 · 222 阅读 · 0 评论 -
Java枚举
且public static final Season SPRING = new Season("春天","温暖");当有一些类,希望它的成员的值是具体的有限的值,且只读不需要修改,不希望用户去自定义其他的值。①对象名(构造器参数),如果有多个,逗号相隔。从反编译还可以看到有一个values()方法,该方法返回改枚举类的所有对象。比如季节类,它的成员只能是春夏秋冬,不希望用户构造其他的值。7、从5、反编译可以看出,它继承自Enum,则其含有父类的所有方法。SPRING("春天","温暖");原创 2024-05-28 17:12:27 · 215 阅读 · 0 评论 -
Java内部类
定义在外部类的局部位置,比如方法体中,并且有类名。本质依旧是类。1、可以访问外部类的所有成员,包括私有成员。2、不能添加修饰符。因为它等价于一个局部变量,局部变量不能使用修饰符。可以使用final修饰,局部变量可以使用final修饰。3、作用域:仅在定义它的方法体或代码块中。4、局部内部类访问外部类成员:直接访问5、外部类访问局部内部类成员:先创建对象,再访问。(注意,必须在作用域内)6、外部其他类无法访问内部类,因为内部类只是一个局部变量。原创 2024-05-28 17:08:39 · 857 阅读 · 0 评论 -
Java final关键字
④static+final修饰的String类型或者基本类型常量,JVM规范建议在初始化阶段赋值,但是HotSpot VM直接在准备阶段就赋值了。4、若final修饰的属性是静态的(static) ,则只能在以下赋初值,不能在构造器赋初值。如果是引用类型,它的值就是地址,只要地址不变就行,指向的对象自身属性可以改变。③static修饰的类属性,在类加载的准备阶段赋初值,初始化阶段赋值。3、不希望类的某个属性的值被修改,用final修饰该属性。②final修饰的实例属性,在实例创建的时候才会赋值。原创 2024-05-28 17:06:08 · 534 阅读 · 0 评论 -
Java Object类方法介绍
a.在java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化的方式来实现。当一个对象没有任何引用时,jvm就认为该对象是一个垃圾对象,就会使用垃圾回收机制销毁该对象,可见,所有的引用数据类型,String类型的name中的value值,Student[]类型的数组。3、若不重写该方法,则在销毁某个对象前,会自动调用object的finalize()方法,即什么也不做。3、重写该方法后,打印或拼接对象时,都会自动调用该对象的toString()方法。原创 2024-05-28 17:04:37 · 1147 阅读 · 0 评论 -
Java多态⭐
/animal 编译类型为Animal ,运行类型为Dog,即父类对象引用可以指向子类对象。因为运行时,只看运行时类型,不能使用特有成员是因为编译类型限制。而运行时看实际运行类型,此时肯定时子类,那么就看子类的具体实现。想要使用子类特有的方法时,可以先instanceof判断类型,然后向下转型,再调用特有方法。就是父类引用本来指向的就是子类对象,堆中的对应空间本就是子类对象。因为属性没有重写概念,所以不会像方法一样,子类重写了父类的方法,(4) 编译类型看定义时 = 的左边,运行类型看 = 的右边。原创 2024-05-28 17:03:14 · 463 阅读 · 0 评论 -
Java super关键字
可见,直接父类和间接父类都有a这个属性,可以通过强转 ((Fulei)this).a;来访问间接父类的属性a。super.a 和 ((Fulei2)this).a 这两个在此时作用是一样的。若爷爷类和本类有同名的成员,也可以使用super去访问。若多个上级类都有同名成员,使用super则遵循就近原则。super代表父类的引用,用于访问父类的属性、方法和构造器。原创 2024-05-28 17:01:25 · 160 阅读 · 0 评论 -
Java继承
然后分配 father 中的name和age,name为字符串,在常量池中分配空间初始化之后指向该地址,然后age直接在堆中分配(基本数据类型int)。若将father中的age设为private,虽然不能直接访问,但是在son堆的内存中,依旧有age这个变量。找关系向上找的过程中,只要找到一个同样的变量,若不能访问,即private,无法访问,就会停止向上继续查找。因为在子类的构造器中会默认有一个super(),用来调用父类的无参构造器,注意,即使每一个类都有name,但是不会遮盖,都有自己的空间。原创 2024-05-28 16:59:50 · 477 阅读 · 0 评论 -
Java break细节(标签)
可见在 i = 3 时,仅跳出了内层循环,当 i = 4 时,外层依旧循环。Java break细节(标签)continue也可以使用标签。2、当使用标签时,选择直接跳出外层循环:可见在i = 3 之后,就不再输出了。当有多重循环时,可以配合标签来使用,决定跳出那一重循环。break是用来跳出循环的。原创 2024-05-28 16:55:47 · 249 阅读 · 0 评论 -
Java switch细节
d、enum类型 原因 :实际比较的是enum的ordinal值(表示枚举值的顺序),它也是一个int类型 所以也可以说 switch语句只支持int类型。c、String 类型 原因:实际switch比较的string.hashCode值,它是一个int类型 如何实现的,网上例子很多。2、表达式的值和常量的值必须一致,或者说表达式的值和常量的值可以转换,比如表达式为char,常量为int。3、表达式返回的值必须是byte、short、int、char、enum、String中之一。原创 2024-05-28 16:54:11 · 285 阅读 · 0 评论 -
Java运算符
3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那么,若数字S在T的范围内,则转换为T类型;区别跟1.中类似,当第一个条件为真时,短路或|| 不会判断第二个条件真假,而逻辑或| 还会判断。2 .复合赋值运算符:+=,-=,*=,/=,%=。关系运算符都是返回布尔类型的值,包括 > < == >= <=...,只记录不熟悉的。a ^ b : 逻辑异或,当a和b不同时,结果为true,否则为false。否则,返回false。4 .赋值运算符左边只能是变量,右边可以是变量,表达式,常量值。原创 2024-05-28 16:50:47 · 428 阅读 · 0 评论 -
Java类型转换
5 .byte 、short 和 char 三者之间可以运算,运算时先转换成 int 类型,结果也是 int 类型,因此结果赋值至少需要给 int。3 .String转换基本数据类型时,需要保证字符串可以转换成对应的类型,例如"123"可以转换成int型,但是"hello"不能。3 .char 类型可以保存 int 类型的常量值,但不能保存 Int 类型的变量值,需要强制转换。3 .把精度大数据类型赋值给精度小的数据类型时,会报错,反之就会进行自动类型转换。1 .当进行数据的精度从大到小,就需要强制转换。原创 2024-05-28 16:45:40 · 350 阅读 · 0 评论 -
Java数据类型
字符型存储时,是先找到对应Unicode码中的整数,然后转化为二进制进行存储;字符型读取时,先将二进制转化为整数,然后找到对应Unicode码中的字符输出。6 .浮点数运算 8.1/3 不等于2.7,等于一个接近2.7的小数,这是因为计算机计算的时候保留精度问题。整数类型,存放整数(byte[1] , short[2] , int[4] , long[8])对浮点数(计算得到的)进行相等判断时,要注意精度问题了,即判断两个数差值的绝对值在某个范围内。的,相当于一个整数,值为对应的Unicode中的数值。原创 2024-05-28 16:43:14 · 401 阅读 · 0 评论 -
Java注释
javadoc 工具将你 Java 程序的源代码作为输入,输出一些包含你程序注释的HTML文件。每一个类的信息将在独自的HTML文件里。javadoc 也可以输出继承的树形结构和索引。options 表示 Javadoc 命令的选项;③文档注释:/** + 注释内容(有要求) + */文档注释内容必须为 Javadoc标签。一行一个,以*开头,加标签和标签内容。②多行注释:/* + 注释内容 + */①被注释的文字不会被JVM解释执行。②多行注释里不允许有多行注释嵌套。①单行注释:// + 注释内容。原创 2024-05-28 16:42:23 · 381 阅读 · 0 评论 -
学前基础知识
① JDK 全称 Java Development Kit ,即Java开发工具包。② JDK = JRE + Java开发工具包(包括 java、javac、javadoc、javap等③ JDK是提供给开发人员使用的,包括 开发工具 和 JRE ,因此装了 JDK 就不用装 JRE 了。原创 2024-05-28 16:39:15 · 753 阅读 · 0 评论