总结java

    技术2022-07-11  77

    Java知识点

    1.Java主要的特点:“一次编译,到处运行”原理是:说的是java语言跨平台的特性: ?JAVA是一种编译型-解释型语言,当执行java文件时,编译器首先会将.java类型的源文件编译成.class类型的字节码文件。 之后jvm虚拟机再运行编译好的字节码文件时,将字节码文件解释成具体平台上的机器指令。java的跨平台特性与jvm虚拟机的存在密不可分, jvm虚拟机可以使java语言在不同的环境中运行。 2.变量的字节大小及有效取值范围 byte占用一个字节,数字大小为-27—27-1 short占用两个字节,数字大小为-215—215-1 int占用四个字节,数字大小为-231—231-1 long占用八个字节,数字大小为-263—263-1 float占用四个字节,数字大小为1.4E-45~3.4E+38 , -1.4E-45~-3.4E+38 。用二进制的指数形式表示一个浮点数的格式,如:10122 , 1012-3 double占用八个字节,数字大小为4.9E-324~1.7E+308, -4.9E-324~-1.7E+308 。 char占两个字节,数字大小为0—216-1,是unicode编码。字符的本来面目,我们为什么可以直接将一个数字赋给字符变量。 Boolean占一个字节,其取值只有两个,true和false。 3.数组 概念:一组相同类型的数据的组合, 数组也是一种引用类型,名称:数组名称不是固定的,与存放的数据的类型有关。 数组中只能存一种类型的数据, 4.栈内存和堆内存的区别 栈:在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它 堆:堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。 5.理解面向对象的概念 面向过程: 在一个结构体中定义窗口的大小,位置,颜色,背景等属性,对窗口换作的函数与窗口本身的定义没有任何关系,如 HideWindow,MoveWindow,MinmizeWindow,这些函数都需要接受一个代表要被操作窗口参数,是一种谓语与宾语的关系 面向对象: 定义窗口时,chul要指定在面向过程中规定哪些属性,如大小,位置,颜色,背景等外,还要指定窗口可能具有的动作,如隐藏,移动,最小化等,这些函数被调用时候、,都是一某个窗口隐藏,某个窗口要移动的语法格式来使用,都是以某个窗口隐藏,某个窗口要移动的语法来使用的,这是一种 主语与谓语的关系 6.面向对象的三大特征:封装,继承,多态 7.重写与重载:重写表示子类重写父类的方法;重载表示有多个同名函数同时存在,区别在于有不同的参数个数或类型 8.垃圾回收过程分析 回收算法有以下四种: 分代收集算法:是当前商业虚拟机都采用的一种算法,根据对象存活周期的不同,将Java堆划分为新生代和老年代,并根据各个年代的特点采用最适当的收集算法。 新生代:大批对象死去,只有少量存活。使用『复制算法』,只需复制少量存活对象即可。 复制算法:把可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用尽后,把还存活着的对象『复制』到另外一块上面,再将这一块内存空间一次清理掉。 老年代:对象存活率高。使用『标记—清理算法』或者『标记—整理算法』,只需标记较少的回收对象即可。 标记-清除算法:首先『标记』出所有需要回收的对象,然后统一『清除』所有被标记的对象。 标记-整理算法:首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。 9.静态变量 类型说明符是static。 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元), 该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放), 也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。

    10.静态方法: 1:用static修饰一个变量是静态变量 2:静态变量,直接使用类名,静态变量名赋值 3:静态变量在内存中只有一份 4:静态的方法就是不需要将类实例化就可以直接使用类名调用到方法或者属性。 一:如果两个方法都是普通方法,那么可以直接用方法名调用 二:如果两个方法都是静态方法, 那么可以直接用方法名调用 三:如果在静态方法中调用非静态方法,那么需要先创建对象,再通过对象名.方法名() 因此,需先创建对象,其次是对象名.方法名() 四:在非静态方法中,可以使用静态方法和静态变量

    11.单态设计模式: 所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 如果要让类在一个虚拟机中只能产生一个对象,首先必须将类的构造方法的访问权限设置为private,这样就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对 12.内部类: 内部类就是定义在另外一个类里面的类。它隐藏在外部类中,封装性更强,不允许除外部类外的其他类访问它; 但它可直接访问外部类的成员。静态内部类和非静态内部类的区别有: 静态内部类是指被声明为static的内部类,可不依赖外部类实例化;而非静态内部类需要通过生成外部类来间接生成。 静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类由于持有对外部类的引用,可以访问外部类的所用 成员 13.一、包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。 2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。 3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。 二、包的定义 在一个.java文件中可以一个public类和多个非public类,如果要将这些类组织在一个包当中,则在.java文件中除注释以外的第一行使用关键字package即可实现。当需要调用此包中的类时,就可以使用关键字import进行导入。在定义包的时候,应该注意几点: 1 为了尽量使包名保持唯一性,包名通常采用小写、按倒写互联网址的形式进行定义。 2 在进行命名包时,应该避免使用与系统发生冲突的名字。

    14.后台线程:默认创建的都是前台线程,对java程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后台线程运行,这个进程就会结束。如果我们对某个线程对象在启动(调用start方法)之前调用了setDaemon(true)方法,这个线程就变成了后台线程。 联合线程:java中还可以将多个线程联合成一个线程,但这里又比单线程灵活的多。比如,可以在某个条件下联合,也可以联合多久后再分开。联合使用的语法是Thread类中的join()方法,将join()线程(线程1)加入到调用join()的线程(线程2)中,合成的新线程中,先执行线程1,然后再执行线程2。 线程的同步:其实,最主要在于那把锁,同一把锁。 15.线程间的通信: wait:告诉我们当前线程放弃监视器并进入睡眠状态直到其他线程进入同一监视器并调用notify为止 notify()¬ifyAll(): 唤醒一个(所有)正处于等待状态的线程 16. API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 (1) Windows API: API函数包含在Windows系统目录下的动态连接库文件中。Windows API是一套用来控制Windows的各个部件的外观和行为的预先定义的Windows函数。 (2)linux API: 在linux中,用户编程接口API遵循了UNIX中最流行的应用编程界面标准—POSIX标准。 17.String, StringBuffer和StringBuilder区别 String:不可变字符串;频繁操作时,每次都需新开辟内存,极易造成内存浪费 StringBuffer:可变字符串、效率低、线程安全;执行速度慢 StringBuilder:可变字符串、效率高、线程不安全;执行速度快

    (1)如果要操作少量的数据用 String; (2)多线程操作字符串缓冲区下操作大量数据 StringBuffer; (3)单线程操作字符串缓冲区下操作大量数据 StringBuilder(推荐使用)。 StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。 StringBuilder类在Java5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。 由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。 然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。 18. java 基本数据类型对象包装类 byte   Byte short  Short int   Integer long   Long boolean Boolean char Character float   Float double Double 19.集合类: Java中的集合类可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。 20.HashTable类不紧可以像Vector类一样动态的存储一系列的对象,而且对存储的每一个对象(称为值)都安排另一个对象(称为关键字)与它相关联。 21.Properties类: Properties类是Hashtable的子类 增加了将Hashtable对象中的关键字和值保存到文件和从文件中读取关键字和值到Hastable对象中的方法 22.System与Runtime类: (1)System:System类提供了代表标准输入、标准输出和错误输出的类变量,并提供一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。 (2)Runtime类代表Java程序的运行时环境,每个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。

    一:IO/输入与输出 File类: 对java来说,File表示的是文件的路径,路径指向的文件可能是存在的,也可以是不存在的。 可以是相对路径,也可以是绝对路径。File的本质,我们可以看成是一串字符串。指向了一个文件。 File类有一个FileSystem成员变量,在进行大部分操作时,他都会用fileSystem对象解释这个路径。 File对象的3种类型: 普通类型: "ok.txt"这个文件名,表示文件是在当前上下文路径的“ok.txt”,fileSystem会认为file指向的文件是处于当前上下文路径下的。因此对fileSystem来说,new File(“ok.txt”)就是指向 “上下文路径/ok.txt”的文件。

    斜杠开头的类型: “/ok.txt”表示在最外层根目录(我的是D盘)下的ok.txt。fileSystem会认为file指向的文件是处于跟目录下的。因此对fileSystem来说,new File("/ok.txt")就是指向 “C:/ok.txt”的文件,在解释真实位置时,不会给file路径加上上下文路径的全部,而只是加上上下文路径所在的盘符。

    盘符开头的类型: 盘符开头的路径,是一个绝对路径,因此“D:/ok.txt”则是一个绝对路径,fileSystem会认为file就是绝对路径,在执行操作之前,不会再解释。他跟斜杠开头的区别是:斜杠开头会在解释时给file路径加上盘符,而盘符开头的类型则不会加。

    二:RandomAccessFile类 RandomAccessFile类提供了众多的文件访问方法 RandomAccessFile类支持“随机访问”方式 RandomAccessFile类在随机(相对顺序而言)读写等长记录格式的文件时有很大的优势 RandomAccessFile类仅限于操作文件,不能访问其他的IO设备,网络,内存映像等 两种构造方法: new RandomAccessFile(f,“rw”);//读写方式 new RandomAccessFile(f,“r”);//只读方式

    三:理解流的感念 流是字节序列的抽象概念 文件是数据的静态存储形式,而流是指数据传输时的形态 流类分为两个大类:节点流和过滤流类(也叫处理流类)

    四:InputStream类: InputStream这个抽象类是所有基于字节的输入流的超类,抽象了Java的字节输入模型。 InputStream类的方法: int read() 二进制形式为11111111的数据,以byte类型表示为-1,以int类型表示255

    int read(byte b)

    int read(byte[] b,int off,int len)

    long skip(long n)

    int available()

    void mark(int readlimit)

    void reset() boolean markSupported()

    void close() 五:OutputStream类: OutputStream类是抽象类,不能直接生成对象,它是所有字节输出流类的父类。该类提供了输出处理的基本方法,它的子类一般都重写这些方法。

    OutputStream类的方法: void write(int b)

    void write(byte [] b)

    void write(byte [] b,int off, int len)

    void flush()

    void close()

    六:PipedInputStream与PipedOutputStream类 PipedInputStream与PipedOutputStream类用于在应用程序中的创建管道通信。管道通信即发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,二者利用管道进行通信。

    ·使用PipedInputStream与PipedOutputStream类编写两个线程间进行通信的程序。 import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream;

    class Sender extends Thread{ PipedOutputStream out = new PipedOutputStream(); PipedOutputStream getPipedOutputStream(){ return out; } public void run(){ try { out.write(new String(“hello baby!”).getBytes()); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

    class Receiver extends Thread{ PipedInputStream in = new PipedInputStream (); PipedInputStream getPipedInputStream (){ return in; } public void run(){ byte[] b = new byte[1024]; try { int len = in.read(b); System.out.println(“The following message comes from sender:/n”+ new String(b,0,len)); in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

    public class Inc { public static void main(String[] args){ Sender sender = new Sender(); Receiver receiver = new Receiver(); PipedOutputStream out = sender.getPipedOutputStream(); PipedInputStream in = receiver.getPipedInputStream(); try { out.connect(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } sender.start(); receiver.start(); } } ? ·PipedWriter和PipedReader类 ·使用管道流类,可以实现各个程序模块之间的松耦合通信。这样可以将多个模块的输入流和输出流相连,拼装成满足需要的应用程序,而不需要修改模块内部代码。

    七:ByteArrayInputStream与ByteArrayOutputStream类 ByteArrayInputStream 与 ByteArrayOutputStream, 用于以IO流的方式来完成对字节数组内容的读写, 来支持类似内存虚拟文件或内存映像文件的功能。

    ByteArrayInputStream的两个构造函数: ByteArrayStream(byte【】buf)

    ByteArrayStream(byte【】buf,int offset,int length)

    ByteArrayOutputStream的两个构造函数 ByteArrayOutStream() ByteArrayOutputStream(int)

    八:字符编码: 首先,说下编码和解码:计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为”编码”;反之,将存储在计算机中的二进制数解析显示出来,称为”解码”。在解码过程中,若使用了同编码方式不同的编码规则饿,则可能导致解析错误或者乱码。

    其次理解字符集和字符编码:

    字符集:是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。一般来说,不同的字符集有不同的对应字符编码规则,因此也常会看到有人说:字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

    字符编码:是一套法则,在符号集合(人们表达信息的方式)与数字系统(计算机存储和处理信息的方式)之间建立对应关系,也就是说字符编码就是将字符转换为计算机可以接受用0、1表达的数。

    九:过滤流与包装类: 1、过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。?

    2、包装类:所谓包装类,就是可以直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就可以看出它们分别对应于?boolean、char、int、long、float和double。而String和Date本身就是类。所以也就不存在什么包装类的概念了。

    3、BufferedInputStream和BufferedOutputStream,过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。

    a)?缓冲流为IO流增加了内存缓冲区,增加缓冲区有两个基本目的:

    i.?允许Java程序一次不止操作一个字节,提高了程序的性能

    ii.?由于有了缓冲区,使得在流上执行skip,mark和reset方法都成为可能

    b)?BufferedInputStream与BufferedOutputStream是Java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。

    ?

    4、DataInputStream和DataOutputStream,过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。

    a)?public?final?void?writeBytes(String?s)//将每个字节写入目标设备中

    b)?public?final?void?writeChars(String?s)//将每个字符写入到目标设

    c)?public?final?void?writeUTF(String?str)//将字符串按照UTF的编码写入到目标设备,目标设备带有长度头

    5、?PrintStream类 ???PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据格式化成字符串输出,对于非基本数据类型先用调用对象的toString()然后打印出来。

    6、ObjectInputStream与ObjectOutputStream类 ???ObjectInputStream与ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。 ???这两个类所读写的对象必须实现了Serializable接口。对象中的translent和static类型的成员变量不会被读取和写入。

    7、字节流与字符流的转换:InputStreamReader和OutputStreamWriter类 ???InputStreamReader和OutputStreamWriter是用于将字节流转换成字符流来读写的两个类。InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。

    8、BufferedReader和BufferedWriter类 BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以同字符流中写入不同操作系统下的换行符

    十:java程序与其它进程的数据通信 在java程序中可以用Proess类的实现对象来表示子进程,子进程的标准输入和输出不再连接键盘和显示器,而是以管道流的形式连接到父进程的一个 输出流和输入流对象上。 调用Proess类的getoutStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。 编程实例:在TestOut类启动java.exe命令执行另一个MyTest类,TestInOut和MyTest通过进程间的管道相互传递数据。 验证管道缓冲区满后,将发生下面的那种情况: (1)新的数据写入时,将最前面写入的数据挤出去,从而发生数据丢失。 (2)与PipedInputStream相连的PipedOutStream无法再写入新的数据, PipedOutStream.write方法处于阻塞状态。 (3)与PipedInputStream相连的PipedOutStram无法再写入新的数据,PipedOutStream.write方法抛出异常

    Processed: 0.017, SQL: 9