JavaSE

来源:互联网 发布:apache安装 编辑:程序博客网 时间:2024/05/02 01:00

1、JavaSE是什么

    之前学习的《Java语言基础》和《Java面向对象》已经能够写程序了,但是有很多功能是做不到的,比如把处理结果保存进硬盘里;比如程序需要访问网路,访问其他计算机;比如创建一个线程和线程控制.....这些需要操作设备硬件的功能就是由JDK提供的。但是JDK的代码并不是直接控制设备硬件,而是底层调用了操作系统的API,比如Java文件IO的代码在windows系统中是调用Windows的WriteFile()和ReadFile()俩API,在Linux系统中是调用Linux的write()和read()俩API;Java创建套接字的代码在windows系统里是调用Windows的socket()接口,在Linux系统中是调用Linux系统中的socket()接口;Java创建线程的代码在windows系统里是调用Windows的CreateThread()接口,在Linux系统中是调用Linux系统中的pthread_create()接口。

    JavaSE是什么已经在《Java语言基础》中的第一、二章节说明了,这里主要是学习{JAVA_HOME}\jre\lib\下的包中的类或接口中封装的API,在Java语言中这些函数以类或接口的形式封装。

2、java.lang包

2.1、java.lang.Object类

a、getClass()方法

b、hashCode()方法


c、equals ()方法

   1、八种基本数据类型之间和String类型之间使用==运算符是判断两侧的值是否相等

   2、引用类型(String除外)的对象之间使用==符号时比较的是两侧对象的地址,但是每个对象在Jvm中的地址是唯一的,所以用==号对对象进行相等判断是没有意义的,而是使用Object类中的equals()方法对对象进行相等判断,但该方法的原始版本实际也是使用==号,所以必须要重写此方法自定义判断规则。同时,JVM规定,两个对象相等是hashCode()返回值等的充分非必要条件,所以要先重写Object类的hashCode()方法。

d、toString()方法 

2.2、三个字符串类

a、java.lang.String类

定义对象

String  myString = 这是个案例;" ;

两种声明定义形式,效果及使用方式都是一样的

String  myString = new String("This is a sample") ;

特点

用String声明定义的字符串,长度是固定的;本质就是个char数组

常用方法

charAt()

根据指定位置返回对应的字符

indexOf()

返回指定的字符(串)在原字符串中第一次出现的位置

lastIndexOf ()

返回指定的字符(串)在原字符串中最后一次出现的位置

substring()

根据开始位置和结束位置截取字符串并返回

endsWith()

如果原串以指定字符(串)结尾就返回true;反之返回false

startWith()

如果原串以指定字符(串)开头就返回true;反之返回false

split()

根据指定字符分割原字符串,然后返回一个String[]

length()

返回字符串的长度

equals()

判断俩字符串的值是否相等,和“==”是一样滴

equalsIgnoreCase()

同上,并且忽略大小写

trim()

截取原字符串首尾的空格,然后返回新字符串

toUpperCase()

把原字符串全部转为大写,然后返回新字符串

toLowerCase()

把原字符串全部转为小写,然后返回新字符串

b、java.lang.StringBuffer类

   String字符串的缺点:字符串的内容有任何的改变,都会创建一个新的字符串对象,过于频繁的操作同一个字符串会都导致程序中String对象过多,资源消耗太大。StringBuffer对象就解决了这个问题,类中的append()、insert()、delete()方法等都是在修改字符串对象本身,并不会产生新的字符串对象。

定义对象

String  myString = new StringBuffer ("This is a") ;

特点

StringBuffer对象在被修改时,会自动开启线程保护,适合多线程项目

常用方法

append ()

在字符串后追加的新的内容,可以是各种数据类型

insert ()

在字符串中指定位置增加指定内容

deleteCharAt()

在字符串中删除指定下标的字符

delete ()

在字符串中删除开始下标-(结束下标-1)的字符

 

其余方法()

和String类类似

c、java.lang.StringBuilder类

         和StringBuffer类一致,区别在于:此类对象没有线程安全机制,一个线程对此对象进行修改时,其他线程也能同时对该对象进行修改,适合单线程的项目。

2.3、包装类

         Java是完全面向对象的语言,但是8种基本类型却是面向过程的概念,比如Java的集合就只能存储引用类型的变量而无法存储基本类型的变量。JDK针对这8种基本数据类型提供了对应的8个包装类。并且每种包装类与对应的基本数据类型之间都有自动拆箱和自动装箱的机制。

      

a、八个包装类

b、自动拆箱与自动装箱

3、java.util包

3.1、时间相关的类

a、系统当前时间

b、指定时间

4、异常

4.1、异常概述

         异常是指不期而至的非正常事件,如:文件找不到、网络连接失败、非法参数等,它发生在程序编译或运行期间,干扰了正常的正常流程。Java通过JDK->API中Exception类及其众多子类描述各种不同的异常事件,所以每一个异常都是Exception类及其众多子类的实例对象,描述了出现在一段编码中的非正常事件。

   Java异常和错误都直接继承自java.lang.Throwable(可抛出)类,但两者是不同的:

   1、Exception能被程序本身可以处理然后程序继续运行;

   2、Error是发生在应用程序的控制之外,是不可查的,也是程序本身无法处理的。大部分的错误与代码编写者执行的操作无关,而表示程序运行时 JVM爆出来的,例如当 JVM 自身不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError,这些Virtual MachineError发生时,Java虚拟机一般会选择线程终止。又如IO错误IOError,类定义错误NoClassDefFoundError,这是Error不是JVM错误。

   3、有些Error会引起Exception。

4.2、异常的分类(案例没有处理异常)

4.2.1、编译异常

   未处理时,在Eclipse里该行会有红叉号提示,DOS里编译时会先报编译错误再报出相应异常不会产生class文件,Eclipse里保存时会在/bin目录下产生class文件,运行时会先报编译错误再报出相应异常。需要使用try...catch...处理。


4.2.2、运行异常

         未处理时,在Eclipse里该行不会有红叉号提示, DOS里可以编译出class文件,但运行时报出相应异常,Eclipse里保存时会在/bin目录下产生class文件,运行时由JVM报出相应异常。需要使用try...catch...处理。


4.3、获取异常信息(案例有处理异常)

         程序在产生异常时,需要被try...catch...处理,否则就终止运行了。在catch块里获取异常信息虽然没有实际意义,但也是异常处理的最简便方法。JDK中,java.lang.Throwable是所有异常类的超类,该类提供了获取异常信息的方法,只要是四个:

    void   printStackTrace()

    String  toString()

   String  getMessage()

   String  getLocalizedMessage()

4.4、JDK内置异常的处理

         程序中如果出现了异常而且没有处理的话,就会禁止编译(编译异常)或者在产生异常的这行终止运行(运行异常)。所以,编码过程中要在可能产生异常的方法里对异常进行捕获/处理,这样即使产生了异常,程序也能继续执行下去。如果没有产生异常,try...catch...就当没写呗。异常捕获的语法结构如下:

4.4.1、在本方法中处理

说明一:在异常范围上,【方法里产生的异常 <= catch的异常】。

a、非故意产生的异常

b、故意throw产生的异常

4.4.2、向上throws,在调用方法中处理

         说明一:C++里方法没有Throws语句代表可以抛出所有异常;Java里方法没有Throws语句代表没有抛出异常

         说明二:在异常范围上,【方法里产生的异常 <= throws的异常 <= catch的异常】。

         说明三:只有方法里产生了匹配的异常,throws语句才会实现抛出效果;如果方法里没有产生异常或者产生的异常和throws的异常不匹配,throws语句等于没写。

 

a、非故意产生的异常

b、故意throw产生的异常

4.5、自定义异常

         JDK中提供的是内置的异常类型,但仍然是不能满足实际开发中的所有需求的,比如求平均值的方法中,要求变量小于0或大于100时都产生异常,JDK就做不到。所以Java允许程序员自定义异常类型,自定义异常主要使用在项目的MCV分层架构中。

   比如在登录过程中对密码进行校验的功能模块。

4.5.1、没有对C层和V层进行分层设计

   这个是很直接的写法,逻辑判断与界面显示都在view层处理了,逻辑清晰。但在管理维护代码方面就带来了麻烦,比如业务逻辑层修改了逻辑判断之后想要界面层仍然维持原来的ui显示时,就必须既修改C层又修改V层,这时使用自定义异常将V层和C层分开就可以仅修改C层代码而不必动V层代码了


4.5.2、使用自定义异常对C层和V层进行分层设计

5、集合框架

5.1、集合框架概述

         详见《数据结构与算法.docx》

5.1.1、集合和数组的关系

1、都是容器,且容器里的元素的数据类型必须一致

2、数组的长度在声明之后就禁止改变,集合的长度是可变的

3、数组既能存储基本数据类型也能存对象类型,集合只能存储对象类型

5.1.2、集合框架的类图

         集合框架主要是3个接口和6个实现类,Java程序员在开发过程中,不必考虑数据结构和算法的实现细节,只需要用这些接口和类创建对象调用操作算法可以了,这样就大大提高了编程效率。


5.1.3、List、Set和Map之间的关系

         List:

线性结构,元素是单个对象

元素有序,所以支持索引,仅List集支持索引操作

数据可重复,新元素只要类型匹配,就可直接加入集合,不会调用hashCode()和equals()

支持迭代器

         Set:

线性结构,元素是单个对象

HashSet类实现的Set集合,无序:TreeSet类实现的Set集合有序

数据不可重复,新元素在被加入集合时,会先调用hashCode()再调用equals()与每个旧元素作比较,如果与某个旧元素两次比较都为ture则加入操作等于无操作,因此需要为元素类重写hashCode()和equals()方法

支持迭代器

         Map:

树形结构,元素是两个对象组成的映射/键值对

HashMap类实现的Map集合,无序:TreeMap类实现的Map集合,键对象升序

键不可重复,但允许值重复,新映射在被加入集合时,其中的key会先调用hashCode()再调用equals()与每个旧元素中的key进行比较,如果与某个旧元素两次比较都为ture则该元素里的value会更新,而不是增加新映射,因此需要为key类重写hashCode()和equals()方法

不支持迭代器

5.2、集合接口的常用方法

5.2.1、List接口的常用方法

5.2.2、Set接口的常用方法

5.2.3、Map接口的常用方法

5.3、集合接口的实现类

5.3.1、List接口的实现类

a、ArrayList类

         可以使用ArrayList实现类声明集合,也可以使用List接口声明集合;前者声明的集合只能被ArrayList类对象初始化和后期赋值,但后者的集合还可以被LinkedList对象初始化和后期赋值,也就是实现了多态的效果。

采用可变数组结构保存对象

因为是数组结构,所以优点是随机(根据索引位置)访问集合中的元素时效率更高

因为是数组结构,所以缺点是根据索引位置插入或删除元素时效率更低

a、LinkedList类

         可以使用LinkedList实现类声明集合,也可以使用List接口声明集合;前者声明的集合只能被LinkedList类对象初始化和后期赋值,但后者的集合还可以被ArrayList对象初始化和后期赋值,也就是实现了多态的效果。

采用链表结构保存对象

因为是链表结构,所以缺点是随机(根据索引位置)访问集合中的元素时效率更低

因为是链表结构,所以优点是根据索引位置插入或删除元素时效率更高

5.3.2、Set接口的实现类

a、HashSet类

         可以使用HashSet实现类声明集合,也可以使用Set接口声明集合;前者声明的集合只能被HashSet类对象初始化和后期赋值,但后者的集合还可以被TreeSet对象初始化和后期赋值,也就是实现了多态的效果。

采用哈希表保存对象

无序

善于存储对象,并快速获取

b、TreeSet类

    可以使用TreeSet实现类声明集合,也可以使用Set接口声明集合;前者声明的集合只能被TreeSet类对象初始化和后期赋值,但后者的集合还可以被HashSet对象初始化和后期赋值,也就是实现了多态的效果。

采用二叉树保存对象

有序

善于对元素进行排序

5.3.3、Map接口的实现类

a、HashMap类

         可以使用HashMap实现类声明集合,也可以使用Map接口声明集合;前者声明的集合只能被HashMap类对象初始化和后期赋值,但后者的集合还可以被TreeMap对象初始化和后期赋值,也就是实现了多态的效果。

采用哈希表保存对象

无序

善于添加和删除映射关系,并快速获取

b、TreeMap类

    可以使用TreeMap实现类声明集合,也可以使用Map接口声明集合;前者声明的集合只能被TreeMap类对象初始化和后期赋值,但后者的集合还可以被HashMap对象初始化和后期赋值,也就是实现了多态的效果。

采用二叉树保存对象

键对象升序

5.4、迭代器

5.4.1、迭代器概述

     迭代器是遍历集合的一种方式,Java中使用java.util.Iterator接口声明迭代器对象,使用List对象或Set对象调用iterator()方法创建实例,迭代器的初始状态.next()是指向集合中第一个元素。

5.4.2、迭代器常用方法

boolean hasNext();

如果仍然有元素可以跌打则返回true,否则返回false

E next();

将迭代器本身后移一位,

void remove();

从集合中删除当前迭代器指向的元素,删除完成后迭代器指向之前的那个元素,初始状态时禁止调用此方法

6、Java I/O流

6.1、流概述

    流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。I/O(Input/Output)流提供了一条通道程序,可以使用这条通道把流中的字节序列送到目的地。虽然I/O流经常与磁盘文件读写有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等,也就是说Java的IO流除了有文件输入输出流之外,还有其他的流。

6.2、File类

         JDK中的java.io.File类用于创建一个文件对象,其中提供了创建文件/夹、删除文件/夹,获取文件/夹元数据的一系列方法等。

6.2.1、文件的创建与删除

6.2.2、获取文件元数据

6.3、文件输入输出流

6.3.1、字节输入输出流

         当执行磁盘文件的字节输入操作时使用FileOutPutStream,当执行磁盘文件的字节输出操作时使用FileInputStream。这俩类都只提供了对字节或字节数组的读取方法,因为文件中的汉字占2字节,所以只能满足简单的文件读取需求。

6.3.2、字符输入输出流

   字节输入输出流都只提供了对字节或字节数组的读取方法。Java中的字符是Unicode编码,是双字节的,字符文本中的汉字占2字节,在读出字符文本时使用字节流如果读取不好就会出现乱码现象。所以在对字符文本进行读写操作时,采用字符输入流FileReader类和字符输出流FileWriter类。

7、Linux网络编程

         JDK中提供了ServerSocket类用于创建TCP套接字对象,提供了DatagramSocket类创建UDP套接字对象,但是Java的网络程序代码并不是直接控制设备硬件,而是底层调用了操作系统的API,在windows系统里是调用Windows的socket()接口,在Linux系统中是调用Linux系统中的socket()接口。所以这直接介绍Linux平台的网络编程:

7.1、计算机网路分层及网络协议

详见《计算机网络》

7.2、Linux 网络编程/套接字编程

7.3、采用TCP 进行Socket 网络程序设计

7.4、采用UDP 进行Socket 网络程序设计

0 0
原创粉丝点击