【Java高级学习记录1】

发布于:2023-01-01 ⋅ 阅读:(445) ⋅ 点赞:(0)

day01--多线程

.

 

 

public void main()

 

public void start()

 多个进程并行执行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

停止状态

 

多线程的主要方法都在Thread类中定义了

 

 其实来自java命令开启的进程

 

 

 

 

 

 休眠一旦被打断,必须进行处理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 优先级只能提高先执行的概率,并不是一定每次都是优先执行

 所以会导致出现-1的情况,尤其是线程休眠的时候体现的很明显

 解决同步问题的关键是锁,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

day02--java基础类库

 

 StringBuffer

 

 

 

 

 

 

 

 

 

 CharSequence

 

 StringBuilder和StringBuffer构造方法就可以接收CharSequence

 

 

 

 AutoCloseable

 

 

 

 

 runtime

 

 

 

 内存调优方案先关方法:

 

 

 System

 

 

 

 

 

 

 

 

 

 

Math类

 

 

完成

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

所以字符串是一个万能的类型。

 

 

 

 

主要用于验证功能上,比如idea的代码的自动生成。

 

 

 

 

 

 

 

 

 

 

 很多例子:https://developer.aliyun.com/lesson_1012_9004?spm=5176.10731542.0.0.5fcf7906KXrggw#_9004

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 UUID

这里的无重复指的是正常情况下,概率很小可能是几千万亿分之一。

正常返回的是UUID对象,但是输出对象调用的是toString();

 

 

optional

 

 

 

 

 

 

 ThreadLocal

解决开发中,多线程引用资源的传递问题

 

 

 

 定时器

java.tutil包如果都了解熟悉,大部分程序都敢写。

 

 

 

 

 

 

 

 

 

 

比较器

 

 

 

自定义的数据类型,试试看。会报错

 

 

 

 

 

 

 

 

 

 

 

able

 

 

 二叉树结构:

 

 

 

 

 

 

comparable的基本结构

 

 

 

 

 

 

,效果一样,子节点顶替父节点

 

 

此时没有考虑左右子节点的情况,有待商榷。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 file文件操作

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 需要先获取父目录,在使用renameTo()进行修改

 字节流与字符流

 

 

 

 

 

 OutputStream字节输出流

 

 

 

 

 

最常用的是第三种

 

 

 

 

inputstream

 

 

 常用的是第二种

 

 

 

非要说用只能读固定的,一般不超过10k。

 

 

 

 

 

 

 

 

 

 

 

 

转换流

 

 

 

 

 

 

 

 

 

 

 

文件的传输流程:

 字符编码

 

 

 

 

 

 

 

 

 内存操作流

 

 

 

 

 

 

 

 

 

 

 

 ByteArrayOutStream功能随着发展已经不怎么用了,比如

,但是比好麻烦,已经有更好的方法了。

 

 管道流

 

 

 

 

 

 

 RandomAccessFile

RandomAccessFile是java Io体系中功能最丰富的文件内容访问类。即可以读取文件内容,也可以向文件中写入内容。但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。 
  因为RandomAccessFile可以自由访问文件的任意位置,所以如果我们希望只访问文件的部分内容,那就可以使用RandomAccessFile类

与OutputStearm,Writer等输出流不同的是,RandomAccessFile类允许自由定位文件记录指针,所以RandomAccessFile可以不从文件开始的地方进行输出,所以RandomAccessFile可以向已存在的文件后追加内容。则应该使用RandomAccessFile。

RandomAccessFile有两个构造器,其实这两个构造器基本相同,只是指定文件的形式不同而已,一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象还需要指定一个mode参数。该参数指定RandomAccessFile的访问模式,有以下4个值:

  • “r” 以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
  • “rw” 以读,写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
  • “rws” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新都同步写入到底层设备。
  • “rwd” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容每个更新都同步写入到底层设备。

打印流:

打印流是输出信息最方便的类,注意包含字节打印流PrintStream和字符打印流:PrintWriter。打印流提供了非常方便的打印功能,

可以打印任何类型的数据信息,例如:小数,整数,字符串。只负责输出,不负责读取。与其他输出流不同

PrintStream永远不会抛出IOException异常

好处:

通过定义的构造方法可以发现,有一个构造方法可以直接接收OutputStream类的实例,与OutputStream相比起来,PrintStream可以更方便的输出数据,

相当于把OutputStream类重新包装了一下,使之输出更方便。

System类对IO的支持

掌握System对IO的三种支持:

    System.out

    System.err

    System.in

掌握System.out及System.err的区别

使用System.out输出的时候就是将输出的位置定义在了显示器之中。

FileOutputStream是定位在文件里,而System.out是定位在屏幕上输出

System.out 和System.err 的区别:
System.out和System.err都是PrintStream的实例化对象,而且通过代码可以发现,两者都可以输出错误信息,但是一般来讲System.out是将信息显示给用户看,是正常的信息显示,而System.err的正好相反是不希望用户看到的,会直接在后台打印,是专门显示错误的。
一般来讲,如果要输出错误信息的时候最好不要使用System.out而是直接使用System.err 这一点只能从其概念上划分。

System.in实际上是一个键盘的输入流,其本身是InputStream类型的对象。那么,此时就可以利用此方式完成从键盘读取数据的功能

为System.out输出重定向使用setOut()方法完成,重定向之后就不会在屏幕输出了

System.in是指屏幕的建瓯按输入,也可以通过setIn()方法,将其输入流的位置改变。

BufferedReader缓冲输入流

BufferReader的作用是为其它Reader提供缓冲功能。创建BufferReader时,我们会通过它的构造函数指定某个Reader为参数。BufferReader会将该Reader中的数据分批读取,每次读取一部分到缓冲中;操作完缓冲中的这部分数据之后,再从Reader中读取下一部分的数据。
为什么需要缓冲呢?原因很简单,效率问题!缓冲中的数据实际上是保存在内存中,而原始数据可能是保存在硬盘或NandFlash中;而我们知道,从内存中读取数据的速度比从硬盘读取数据的速度至少快10倍以上。
那干嘛不干脆一次性将全部数据都读取到缓冲中呢?第一,读取全部的数据所需要的时间可能会很长。第二,内存价格很贵,容量不想硬盘那么大。

Scanner 扫描流

Scanner类用于获取键盘输入(是一个基于正则表达式的文本扫描器),它可以从文件、字符串、输入流中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可以接收文件、字符串和输入流作为数据源,用于从文件、字符串和输入流中解析数据。

Scanner类主要提供了两个方法来扫描输入:
1)hasNextXx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()。

2)nextXxx():获取下一个输入项。Xxx的含义同上。

默认情况下,Scanner使用空白(包括空格、Tab空白和回车)作为多个输入项的分隔符。

java对象序列化的概念

1.序列化的概念 序列化的概念就是把一个Object直接转换成为Byte流写到硬盘或者通过网络进行传播。Java序列化技术可以将一个对象的状态写入一个Byte流里,并且可以从其它地方把该Byte流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、EJB等技术的技术基础。

2.序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象 传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的注意点

注意点1
如果某个类能够被序列化,其子类也可以被序列化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可序列化接口。 则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接口,则该类的父类所有的字段属性将不会序列化

注意点2
声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据

注意点3
在java.io包提供的涉及对象的序列化的类与接口有

ObjectOutput接口 
该接口继承DataOutput接口并支持对象的序列化,其writeObject()方法实现存储一个对象。

ObjectInput接口
该接口继承DataInput接口并支持对象的序列化,其readObject()方法实现读取一个对象。

ObjectOutputStream类
该类继承OutputStream类并实现ObjectOutput接口,可调用接口中的writeObject方法。

ObjectInputStream类。
该类继承InputStream类并实现ObjectInput接口,可调用接口中的readObject方法。

注意点4
对于父类的处理时,若父类没有实现序列化接口,则其必须有默认的构造函数,否则编译的时候就会报错。在反序列化的时候,默认构造函数会被调用。若把父类标记为可以序列化,则在反序列化的时候,其默认构造函数不会被调用。因为Java对序列化的对象进行反序列化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。

序列化和反序列化的概念

  把对象转换为字节序列的过程称为对象的序列化
  把字节序列恢复为对象的过程称为对象的反序列化
  对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

  在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

  当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

transient的作用及使用方法

我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

但是,有时候我们不想让某些信息泄露,不想让这些信息序列化,如密码等。那么此时就用到了tranient关键字。

即:java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化

transient使用小结

1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

2)transient关键字只能修饰变量,而不能修饰方法和类。注意, 本地变量 是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。(如果不懂本地变量的话,可以参看我这篇文档Java中的变量之成员变量、本地变量与类变量)

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

 我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null

反射机制,很少用到

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。

反射机制能做什么

反射机制主要提供了以下功能:

  1. 在运行时判断任意一个对象所属的类;
  2. 在运行时构造任意一个类的对象;
  3. 在运行时判断任意一个类所具有的成员变量和方法;
  4. 在运行时调用任意一个对象的方法;
  5. 生成动态代理。

反射机制的使用

想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。

获取字节码文件对象的三种方式。

1、Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。

2、Class clazz2 = Person.class;    //当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。

3、Class clazz3 = p.getClass();    //通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段 

类集简介

核心接口:Collection、List、Set、Map、Iterator、Enumeration

  1.collection是一个被高度抽象出来的接口、提供基本的操作数据的行为、属性的定义


网站公告

今日签到

点亮在社区的每一天
去签到