Java核心技术一 上

第一章 Java程序设计概念

1.1Java程序设计平台

设计平台包含广泛,有很多数据库可以用来被调用,更体现在是一种跨平台的语言,提供环境和应用的数据库

1.2 Java白皮书中关键术语

a、简单性 指出c++与Java相比的简单,删除了部分复杂的内容

b、面向对象 重点将数据放在类与接口上

c、分布式

d、健壮性

e、安全性

f、体系结构中立

可移植性、解释性、高性能性、多线程、动态性

1.3 Java applet与 Internet

Java在Internet上运行的时候,运行的程序称为applet。后来由于互联网的发展导致不同浏览器之间的利用结构不同,渐渐地退出世界的舞台

1.4 Java发展史

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DS1yQ6w1-1601259152313)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200920205246576.png)]

第二章 Java程序设计环境

2.1 Java安装工具包

JDK 编写Java 程序的程序员使用的工具软件

JRE 运行Java程序用户使用的软件

sever JRE 在服务器上运行Java程序的软件

SE 用于桌面或简单服务器应用的Java平台

EE 用于复杂服务器应用的Java平台

ME 用于手机和其他小型设备的Java平台

SDK 老版的JDK 叫法

RPM是文件的格式,.tar.gz是压缩文件

2.1.2 设置JDK

1、最好不要接受路径名称中含有空格的路径位置

2、Linux上安装位置时,.tar.gz 文件解压在某个位置。如果从RPM文件安装,要检查是否安装在/usr/Java/jdk1.8

并且在/.bashrc或/.bash_profile 文件最后一行添加

export PATH=jdk/bin:$PATH (Java的安装目录)

window也要在固定位置上配置环境变量

2.1.3 安装库源文件和文档

库源文件在JDK 中以压缩文件存在,在jdk/bin 目录下解压库文件

3.1 一个简单的Java程序

1、大小拼写错误

2、有明确的命名规范

3、用大括号来包含代码

4、有保留字节专门规定的命名需要特别规定,不能使用

5、注释有两个方法:——注释里面的东西不能有嵌套

(一)、// 标识每行的注释

(二)、/* */ 标识一段文字

(三)、/** */ 标识可以自动生成文档

3.2 数据类型——八种基本类型

4种整型,2种浮点数,1种char字符,1种boolean

整数的形式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K4HswUFF-1601259152329)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200920225615457.png)]

0b或0B ——>二进制 0x或0X——> 八进制

浮点数的形式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgHWPpfm-1601259152333)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200920230022607.png)]

char类型:常常出现一个字节与Unicode编码相互转换的情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9CyZ2Qo-1601259152336)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200920230557469.png)]

码点(code point) 是指与一个编码表中的某个字符对应的代码值。

boolean 类型

用于逻辑条件,常用来判断——false或true

值0相当于布尔值false,非0值相当于true

变量

每一个变量都有一个类型,变量的类型位于变量名之前

Java语句每句话就相当于是一句声明,代表一条完整的Java语句,用分号结束。变量名必须是一个以字母开头并由字母或数字构成的序列(包括 _ $ )变量名的长度上基本上没有限制

常量 ——final

关键字 final 表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上, 常量名使用全大写。

3.3 运算符

算术运算符 +、-、 *、/ 表示加、减、乘、除运算

当参与 / 运算的两个 操作数都是整数时, 表示整数除法;否则, 表示浮点除法

需要注意, 整数被 0除将会产生一个异常, 而浮点数被 0 除将会得到无穷大或 NaN结果。

对于使用 strictfp 关键字标记的方法必须使用严格的浮点计算来生成可再生的结果.

public static strictfp void main(String[] asgs){}

3.4 数学函数与常量

在Math类,包含了各种各样的数学函数。

Math函数引出方法,并且还可以引出对应的常量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuxBNJ9j-1601259152340)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200920233508113.png)]

小类型可以转换成大类型,但是大类型必须通过强制转换成小类型(cast)。强制类型可以通过截断小数部分将浮点数变成整数。

3.5 自增与自减运算符

3.6 位运算符

位运算符包括:

& (“and”) | (“or”) ^(“XOr”) ~(“not”)

在位运算中《表示,位置的变化与移动,相比于运算来说是最快的一种运算方式

枚举类型

表示有限个数列举在一对{ }中

enum Size{1,2,3,4};
Size s = Size.1

3.7 字符串

Java 字符串就是Unicode编码字符序列,并且在标准的Java类库中提供了预定义类,叫String

字串属于String类的substring方法从一个较大的字符串中提取一个字串

在字符串之间的拼接问题中用“+”,并且当其他类型的数据想要标称字符串类型需要添加+“ ”

join属于拼接方法将字符按照一定的规则进行拼接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3R3RnAwT-1601259152341)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200921082420105.png)]

substring替换字符方法,找寻指定字符的特定序列号,再在后面进行添加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0rb3vVY-1601259152343)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200921082440047.png)]

equals方法检测两个字符串是否相等

equalsIgnoreCase方法为忽略两字符串大小写来进行查看字符串是否相等

==是判断两个字符串位置是否相等

3.8 空串与Null串

空串“”是长度为0的字符串——长度为0,内容为空

null 表示目前没有任何对象与该变量关联

3.9 码点与代码单元

char 数据类型是一个采用UTF-16 编码表示Unicode码点的代码单元

char charAt(int index)
int     codePointAt(int index)
int     offsetByCodePoints(int startIndex,int cpCount)
IntStream       codePoints()
new String(int[] codePoints,int offset,int count)
boolean equals(Object other)
boolean equalsIsIgnoreCase(String other)
boolean startsWith(String prefix)
boolean endsWith(String suffix)
int indexOf(String str)
int indexOf(String str,int fromIndex)
int indexOf(int cp)
int indexOf(int cp,int fromIndex)
返回与字符串str或代码点cp匹配的第一个字串的开始位置,这个位置从零开始或fromIndex开始计算。如果存在显示int数据类型,如果不存在则返回-1
int lastIndexOf(String str)
int lastIndexOf(String str,int fromIndex)
int lastIndexOf(int cp)
int lastIndexOf(int cp,int fromIndex)
返回与字符串str或代码点cp匹配的最后一个字串开始的位置,这个位置也可以从原始串尾端或者fromIndex开始计算
int length()    返回字符串的长度
int codePointCount(int startIndex,int endIndex)  返回startIndex和endIndex-1 之间的代码点数量,没有培成对的代用字符将计入代码点
String replace(CharSequence oldString,CharSequence newString)   返回一个新字符串,这个字符串用newString代替原来字符串中所有的oldString
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)
返回一个新字符串,这个字符串包含原来字符串从beginIndex到尾端endIndex-1的所有代码单元
String toLowerCase()
String toUpperCase()
返回一个新的字符串将原来的字符串大写或者小写
String trim()       删除字符串串头和串尾的空格
String jion(CharSQuence delimiter,CharSquence ...elements)
返回一个用给定界限来连接的所有元素

4.0 输入输出

4.0.1 读取输入

首先构造一个Scanner对象,并与“标准输入流”System.in 关联

Scanner in = new Scanner(System.in);

System.out.print(“Whis is your name?”);

String name = in.nextline();

String name = in.line();

line 当调用写入的字符串中含有空格的时候“ ”,代码结束,与之不同的是nextline是看含有回车时进行操作。

4.0.2 格式化输出

可以将System.out.print( x )数值x直接输出到控制台上

System.out.printf(“%8.2f”,x);

可以用8个字符的宽度和小数点后两个字符精度打印x

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3w5WIPZc-1601259152345)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200921101033339.png)]

可以用静态的String.format方法创建一个格式化的字符串

String message = String.format(“Hello,%s. Next year, you will be %d”,name,age);

可以用Date类和相关的格式化选项,格式包括两个字母以t开始,以表中的任意字母结束

System.out.printf( “%tc”,new Date() )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38wHNchQ-1601259152346)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200921101654129.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnTY1atv-1601259152348)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200921101722740.png)]

紧跟在%后面用$ 进行最后得结束,< 表示这个元素将和上个元素相同

4.0.3 文件输入和输出

用file对象构造一个Scanner对象:

Scanner in = new Scanner(Paths.get ( “ myfile.txt ”) ,”“utf-8”);

对于路径不是相对而是绝对的, / 或 \\

要是想写入函数需要创建一个PrintWriter 对象:

PrintWriter out = new PrintWriter(“myfile.txt” , “UTF - 8”)

Scanner(File f); 构造一个从给定文件读取数据的Scanner
Scanner(String data); 构建一个从欧冠给定字符串读取数据的Scanner
PrintWriter(String fileName)  构造指出对应的文件路径构造PrintWriter对象
static Path get(String pathname) 根据给定的路径名构建一个Path对象

5.1 控制流程

块(符合语句)是指用一对大括号括起来的若干条简单的Java语句。块可以进行嵌套,但是不能下嵌套的块中同时声明两个同名的变量。

5.1.1 条件语句

if ( condtion)

{ statement;

}else if(condition)

{ statement;

}else{

statement;

}

5.1.2 循环

先判断,后执行

while(condition){

statement;

}

先执行,后判断

do{

​ statement;

}while( condition)

5.1.3 确定循环

for ( int i=1 ;i <= 10 ; I++)

{

​ statement;

}

5.1.4 多重选择:swich 语句

swich(condition)

{

​ case 1:

​ statement;

​ break;

​ case 2:

​ statement;

​ break;

​ default:

​ break;

}

case标签可以是:

*类型为 char、byte、short 或 int 的常量表达式。

*枚举常量。

*从 Java SE 7开始, case标签还可以是字符串字面量。

5…2 中断控制流程语句

continue 与 break

5.3 大数值

来源于Math中的BigInteger 和 BigDecimal 两个可以表示包含任意长度数字序列的数值,但是进行运算时不能使用一般的操作运算符,只能使用Math的相关方法进行处理。

6 数组

数组是一种数据结构,用来存储同一数据类型的集合,用过下标可以访问对应的值

创建一个数组时,所有元素都有规定的初始值,数字数组的初始类型为0,boolean数组元素的初始值为false,对象的初始值是null ,表示元素中没有任何指定的对象。

一旦创建了数组, 就不能再改变它的大小(尽管可以改变每一个数组元素)。如果经常需要在运行过程中扩展数组的大小,就应该使用另一种数据结构— —数组列表(array list) 有关

6.1 for each 循环

依次处理数组中的每一个元素,忽略下标值带来的烦恼

for (variable : collection ) statement

定义暂存一个变量暂存集合中的每一个元素,并执行相应的语句

6.2 数组排列

这种方法可以快速排列

static String toString(String[] args) 返回包含a中数据元素的字符串
static type copyOf(type[] a, int length)
static type copyOf(typr[] a, int start,int end);
static void sort(type[] a) 采用优化的快速排序算法对数组进行排序
static int binarySearch(type[] a ,type v);
static void fill(type[] a ,type v) 将数组的所有数据元素都设置成一个值
static boolean equals(type[] a,type b) 检查两个数组对应数据是否相同
6.3 多维数组

第四章 对象和类

4.1 面向对象程序设计(OOP)

4.1.1 类

类是构造对象的模板或蓝图,由类构造(construct)对象的过程称为创建类的实例( instance )

封装(encapsulation 数据隐藏 ) 是与对象有关的一个重要该奶奶,将数据和行为组合在一个包中,对对象隐藏数据的实现方式。对象中的数据称为实例域(instance field),操作数据的过程称为方法。通过扩展一个类来建立另外一个类的过程称为继承

4.1.2 对象
4.1.3 类之间的关系

依赖:一个类的方法操作另一个类的对象

聚合:类A的对象包含B的对象

继承:类之间的继承,继承相应的 方法和实例变量

4.1.4 对象与对象变量

使用对象有时需要指定其初始状态,然后对对象使用对应的方法

在Java中使用构造器(constructor)构造新实例,用来初始化新的实例,构造器的名字与类的名字相同,在创建构造器的时候,需要在前面加上new的操作符。可以使用toString()方法将目标实例进行对象化的输出并且使用

一个对象变量没有包含一个对象,而仅仅引用一个对象。任何对象的值都是对存储在另外一个地方的一个对象的引用。局部变量不会自动的初始化为null,而是必须调用new或将他们设置为null进行初始化

static LocalTime now() 构造一个表示当前日期的对象
static LocalTime of(int year, int month ,int day) 构造一个表示指定日期的对象
int getYear()   获取年
int getMonthValue() 获取月份
int getDayOfMonth() 获取日子
DayOfWeek getDayWeek 获得当前的日子是这个星期的星期几
LocalDate plusDays(int n)
LocalDate minusDays(int n)
生成当前日期之后或之前的n天日期
4.1.5 用户自定义类

各种主力类是指用户对象中所遇到的需要创建功能的类,通常没有main方法,但是有自己的实例域和实例方法,然后通过若干这样的类进行合并引用,创建一个只含有main方法的实例对象类。类名应该与文件名相同

public是一种访问级别,总共由4种

public 意味着任何类的任何方法都可以调用这些方法

private只有该类自身的方法才能够访问这些实例类,而其他类的方法不能够读写这些域

4.1.6 从构造器开始

构造器与类同名,在构造这个方法会自动调用这个构造器。每一个类可以有一个以上的构造器,构造器里可以有一个以上的参数,构造器伴随着new操作一起调用。

实例域

实例方法

4.1.7 final实例域

实例域定义为final,构造对象时必须初始化这样的域,在后面的操作中不能对这个域做出修改和变动

4.1.8 静态域域静态方法

每个类只能有一个这样的域

4.1.9 工厂方法

4.2 main方法
4.3 方法参数

按值调用:表示方法接收的是调用者提供的值

引用调用:方法接收的是调用者提供的变量的值

4.4 对象析构与finalize方法

对象析构简单的说就是一种代码回收器,在最后执行。

finalize方法将在垃圾回收器消除对象之前调用。

4.2 包

Java允许使用package将类进行组织,借助于包来进行组织代码,并将自己的代码与别人的代码进行分开管理

一般用域名的反写作为整个项目的名称,然后对整个项目添加不同的后缀进行包的区分,以此来区分不同的类

4.2.1引入包

全写的引入和在所有代码的开始引入包

4.3文档注释

Javadoc它可以由源文件生成一个HTML 文档,每个/** */文档注释在标记之后紧跟着自由格式文本(free-form text)。标记由@表示

第五章 继承

5.1 类、超类、子类

反射是指在程序运行期间发现更多的类及其属性的能力

已经存在的类称为超类、基类、父类

新类称为子类、派生孩子类

定义子类用extends 构建正在派生的新类,已经存在的 类称超类

5.1.1 覆盖方法

在子类继承父类当中,子类中有很多方法不一定全部都继承父类,有一定的方法需要进行改正(覆盖)

5.1.2 子类构造器

一个对象变量(变量e)可以指示多种实际类型的现象被称为多态(polymorphism)在运行市能够自动地选择调用哪个方法的现象被称为动态绑定(dynamic binding)

5.1.3 继承 层次

由一个公共超类派生出来的所有类的集合被称为继承层次(inheritance hierarchy)在继承层次中,从某个特定的类到其祖先的路径被称为该类的继承链

5.1.4 多态

左边用父类作为限制,右边是子类

5.1.5 理解方法调用
5.1.6 强制类型转换

将一个类型强制转换成另外一个类型的过程被称为类型转换

5.1.7 抽象类

abstract 对类进行封装

对于封装类的继承关系中存在调用与非调用,当子类想调用父类的方法时,对父类中方法进行封装保留了父类方法的私有性,同时让子类可以进行调用(protected)

在Java当中所有类的父类都是Object ,其类型只能用于作为各种值得通用持有者,要想对其进行操作首先要通过强制类型转换将其转换成对应的类型

5.2 equals方法

在Object类中,这个方法将判断两个对象是否具有相同的引用

int hashCode()       返回对象的散列码,散列码可以是任意整数,包括正数或负数。两个相等的对象要求返回相等的散列码
static int  hash(Object... objects) 返回一个散列码,由提供的所有对象的散列码进行组合得到的
static int hashCode(Object a)   如果a为null返回0,否则返回a.hashCode()
static int hashCode((int|long|short|byte|double|float|char|boolean) value) 返回指定的散列码

5.3 toString 方法

它用返回对象值的字符串,在java处理数据整合的时候,使用+进行相连接的时候会自动调用toString() 方法,所以再有的时候需要对这个方法进行重写

一般对于数组的显示toString方法只能显示地址

class getClass() 返回包含对象信息的类对象
boolean equals(Object otherObject)   比较两个对象是否相等是否指向同一块储存的区域
String toString()   返回描述该对象值得字符串,在自定义类中应该重写此方法
String getName()        返回这个类的名字
Class getSuperclass()   以class对象得形式返回这个类得超类信

5.4 泛型数组列表

一旦能够确认数组元素列表大小不在发生变化,就可以调用trimToSize方法这个方法将储存域得大小调整成为需要的大小,剩余的空间垃圾回收机制将会处理。一旦整理了数组列表得大小,添加元素就需要花时间再次移动存储块

ArrayList<E>()     构造一个空数组列表
ArrayList<E>(int initialCapacity) 用指定容量构造一个空的数组列表
boolean add(E obj)      在数组列表的尾端添加一个元素,返回值为 true
int size()      返回储存在数组列表中当前元素数量
void ensureCapacity(int capacity)   确保数组列表在不重新分配存储空间的情况下就能够保存给定数量的元素
void trimToSize()   将数组列表的存储容量消减到当前尺寸

对应列表的使用方法set()、add()、get()、remove()

对于get() 方法调用方法后返回的是Object 对象,需要经过强制转换成需要使用的对象。或者使用对应的方法

5.4.1 类型化与原始数组列表的兼容性
5.4.2 对象包装器与自动装箱

将基本类型转换成对象,成为包装类,这些对象包装器类有对应的方法和对应的名字(Integer\Long\Double\Short\Byte\Character\Void\Boolean)

由于每个值分别包装在对象中,所以ArrayList的效率远远低于int[ ] 数组

int inValue() 以 int 的形式返回 Integer 对象的值
static String toString(int i)   以一个新的String 对象的形式返回给指定数值i 的十进制表示
static String toString(int i,int radix) 返回数值i 的基于给定radix 参数进制表示
static int parseInt(String s)
static Integer valueOf(String s)
5.4.3 参数数量可变的方法

每个Java方法都有固定数量的参数,然而现在的版本中的参数是可以变化。——变参

public class PrintStream
{public PrintStream printf(String fmt,Object ...args){return format(fmt,args);}
}
枚举类

public enum Size{ SMALL,MEDUM,LAGE}

比较两个枚举类型的值,永远不要用equals ,而直接使用 “ == ”

每个枚举类型都有一个静态的values 方法,它将返回一个全是枚举值的数组

反射

反射库(refllection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码程序。

反射机制的作用:

1、在运行时分析类的能力

2、在运行时查看对象,例如编写一个 toString 方法供所有类使用

3、实现通用的数组操作代码

4、利用Method 对象

class 类

在程序运行期间,Java运行时系统始终为所有的对象维护一个被成为运行时的类型标识。getClass() 获取类的名称

Class.forName( ) 调用静态的方法

5.5 捕获异常

try{

}catch(Exception){

}

try…catch…对于处理来说是,进行try的语句,当出现错误时直接跳出进入catch的剩余语句

5.5.1 利用反射分析类的能力

第六章 接口、lambda表达式、内部类

6.1 接口

接口不是类,而是对类的一组需求描述,这些类要遵守从接口描述的统一格式进行定义

两个步骤:

一、将类声明为实现给定的接口

二、对接口中的所有方法进行定义

int compareTo(T other)       用这个对象与other进行比较,这个小于other 则返回负数;如果相等则返回0;否则返回正数
Static void sort(Object[] a)    使用mergesort 算法对数组a中的元素进行排序。要求数组中的元素必须实现了Comparable接口的类,并且元素之间必须是可以进行比较的

6.2 接口的特性

接口不是类不能通过 new 来进行运算,尽管不能构造接口的对象,但是却能声明接口的变量接口变量必须引用接口的类对象

接口中的所有方法在继承的子类中都要进行重新写,并且自身上也是覆盖关键字public ,父类中不能有任何的写入。但是之后出现了default 关键字,实现了接口的实现方法。

当发生接口默认方法冲突:

1)超类优先

2)接口冲突 必须覆盖这个方法来解决冲突

6.3 接口示例

6.3.1 接口与回调

回调:可以指出某个特定时间发生时应该采取的动作

6.3.2 Comparator 接口

6.4 对象克隆

原变量与副本都是一个对象的引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBFgLbhj-1601259152350)(C:\Users\华为\AppData\Roaming\Typora\typora-user-images\image-20200922150045534.png)]

6.5 lambda表达式

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。简单的来说允许把函数作为一个方法的参数

Java8Tester tester = new Java8Tester;
MathOperation addition = (int a,int b)-> a+b;
MathOperation subtraaction = (a,b)-> a-b;
System.out.println("10+5=" + tester.operation(10,5,addtion))
int b = tester.operation(10,5,subtration)
函数式接口

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda 表达式

方法引用

6.6 内部类

是定义在另一个中的类

目的:

​ 1、内部类方法可以访问该类定义所在作用域中的数据,包括私有的数据

​ 2、内部类可以对同一个包中的其他类隐藏起来

​ 3、当想要定义一个回调函数 且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷

6.7 代理(proxy)

利用代理可以在运行时创建一个实现了一组给定接口的新类

第七章 异常、断言和日志

7.1 处理错误

对于错误出现时,对待错误如何进行处理

7.1.1 异常分类

所有异常都是由Throwable 继承而来的,分成两个分支:Error和Exception

Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象

Exception类层次结构,分为两个分支RuntimeException和IOException。RuntimeException由于程序错误导致的异常。IOException的出现是由于IO错误这类问题导致的异常

派生于RuntimeException的异常包含下面几种情况:

1、错误的类型转换

2、数组访问越界

3、访问null指针

第八章 泛型程序设计

使用泛型机制编写的代码要比那些杂乱地使用Object 变量,然后再进行变量强制类型转换的代码具有更好的安全性和可读性

目的:泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用

定义简单的泛型类
public class Pair<T>
{private T first;private T second;public Pair(){first = null;second = null;}public Pair(T first,T second){this.first = first;this.second = second;}public T getFirst(){return first;}public T getSecond(){return second;}public void setFirst(T newValue){first = newValue;}public void setSecond(T newValue){second = newValue;}
}

这里引入一个类型变量T,用尖括号<> 括起来了,并在类名的后面

泛型类可以有多个类型变量,类定义中的类型变量指定方法变量就可以实例化泛型类型,可以将结果想象成带有构造器的普通变量类,经常将泛型类看作普通类的工厂。

泛型方法:定义一个带有类型参数的简单的方法

class ArrayAlg
{public static <T> T getMiddle(T ..a){return a[a.length/2];}
}

类型变量放在修饰符的后面,返回类型的前面

泛型方法可以定义在普通类中,也可以定义在类型类中。

类型变量的限定 有时需要对类和方法进行一些约束
class ArrayAlg{public static <T>T min(T[] a){if(a==null || a.length==0) return null;T smallest=a[0];for(int i;i<a.lenght;i++){if(smallest.comareTo(a[i]>0) smallest=a[i]);return smallest;}}}

这里需要将T 限制成为实现了Comparable接口的类,可以通过类型变量T 设置限定实现这点:

public static <T extends Comparacle > T min( T[] a)…

一个变量或通配符可以有多个限定(可以有多个接口类型,但至多含有一个类)

T estends Comparable & Serializable

限定类型用 “&” 分隔,用逗号来分隔类型变量,如果有用一个类作为类型,必须是限定列表中的第一个

虚拟机没有泛型对象–所有对象都属于普通类

public class Pair
{private Object first;private Object second;public Pair(Object first,Object second){this.first = first;this.second = second;}public Object getFirst(){return first;}public Object getSecond(){return second;}public void setFirst(Object newValue){first = newValue;}public void setSecond(Object bewValue){second = newValue;}
}

因为T 是一个无限定的变量,所以直接用Object 替换

当使用泛型方法时,如果擦拭返回类型,编译器插入强制转换类型

1、对原始方法进行Pair.getFirst的调用

2、将返回的Object 类型强制转换成为Employeee类型

当存取一个泛型域时也要插入强制类型转换

通配符类型 允许类型参数变化

Pair <Manage> managerBuddies = new Pair<>(ceo,cfo);

Pair <? extends Employee> wildcardBiddies = managerBuddies;

通配符类型:Pair<? extends Employee>

表示任何泛型类Pair类型,它的类型参数是Empolyee的子类,同时对于通配符还可以指定一个超类super

引入super的原因:

带有超类型限定的通配符只能起到限定的作用,可以为方法提供参数,但是不能使用返回值,只管来说,带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。

反射和泛型

反射允许你在运行时任意分析对象

泛型Class 类,类型参数十分有用,这是因为它允许Class方法的返回类型更加具有针对性

可以使用反射API 来确定:

这个泛型方法有一个叫做T的类型参数

第九章 集合

9.1 Java 集合框架

9.9.1 在Java中将集合的接口与实现分类
9.9.2 Collection’接口

在Java的集合中集合类的实现接口是Collection接口

常见的方法:

集合中不能存在重复的元素

一、add向集合中添加元素,返回值为boolean

二、iterator方法是迭代器的接口,这个迭代器依次访问迭代器中的元素。

9.1.3 迭代器

通过反复调用next方法,可以逐个访问集合中的每个元素,如果集合的末尾达到,则方法就会抛出一个NoSuchElementException.因此在调用next方法之前调用hasNext方法。Colleaction接口扩展了I特让步了接口。因此,对于标准类库中的任何集合都可以使用“for-each”循环,甚至可以使用lambda表达式

元素被访问的顺序取决于集合类型,

list 接口是一个有序集合

元素会增加到容器的指定位置,可以使用迭代器访问,也可以使用整数索引来访问

void add(int index,E elemnet)
void remove(int index)
E get(int index)
E set(int index,E elemet)

LisIterator 接口是Iterator的一个子接口,它定义了一个方法用于迭代器位置前面增加一个元素

set 接口是一个等同于Collection接口

不过其方法的行为有更严谨的定义。集(set)的add方法不允许增加重复元素,要适当的定义集的equals方法:只要两个集合包含同样的元素就认为是相等的,而不要求这些元素有同样的顺序。hashCode方法的定义要保证包含相同元素的两个集会得到相同的散列码

9.2 具体的集合
集合类型 描述
ArrayList 一种可以动态增加和缩减的索引序列
LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序列表
ArrayDeque 一种用循环数列实现的双端队列
HashSet 一种没有重复元素的无序集合
TreeSet 一种有序集合
LinkedHashSet 一种可以记住元素插入次序的集
ProrityQueue 一种可以高效删除最小元素的集合
HashMap 一种存储键/值关联的数据结构
TreeMap 一种键值属于有序排列的映射表
EnumMap 一种键值属于枚举类型的映射表
linkHashMap 一种可以记住键/值项添加次序的映射表
WeakHashMap 一种其值无用武之地后可以被垃圾回收器回收的映射表
IdentityHashMap 一种用 == 而不是equals 比较键值的映射表
9.2.1 链表

对于数组和数组列表来说都有一个很大的缺陷,这就是从数组中间位置删除一个元素将会付出很大的代价,原因是数组中处于一个被删除后,剩下的元素都要向前进行一次移动。而链表将有地址作为标记使得前后的元素都可以进行相连接,可以任意进行删除和添加元素。

当一个链表被多个迭代器同时使用时,会出现ConcurrentModificationException 异常。每个迭代器都维护一个独立的计数值。每个迭代器方法的开始出检查自己改写操作的计数值是否与集合改写操作计数值一致。

链表与泛型集合之间有一个重要的区别,链表是一个有序集合(ordered collection),每个对象的位置都很重要。LinkedList.add方法将对象添加到链表的尾部。但是,常常需要将元素添加到链表的中间

散列集

对于链表和数组可以按照人们的意愿进行排列元素的次序,但是有一种众所周知的散列表,就是一个对应值对应一个散列码。其散列码是由String类的hashCode方法产生。有时候会遇到桶装满的情况,这种现象被称为散列冲突(hashcollection)

桶数是只用于收集具有相同散列值的桶的数目

树集

TreeSet类与散列集十分类似

优先级队列

优先级队列中的元素可以按照任意的顺序插入,却总是按照顺序的顺序进行检索

第13章 部署Java 程序

13.1 JAR文件

一个jar文件既可以包含类文件,也可以包含诸如图像和声音之类的文件,此外JAR文件是压缩的,同时也是ZIP格式

Java核心技术一 上读后感相关推荐

  1. 与时俱进的Java——《写给大忙人看的Java核心技术》读后感

    作为一个Android工程师,对书中那一句"成也框架,败也框架"深有同感:刚入门的时候只需要用Picasso或者OKHttp等开源框架实现简单的功能就能得到一个结果,有了经验之后才 ...

  2. 你必须掌握的 21 个 Java 核心技术!

    经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容. 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理 ...

  3. public接口可以被任何一个类实现_一文带你深入Java核心技术:对象克隆+接口与回调,还有这种操作...

    对象克隆 当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,如图6-1所示.这就是说,改变一个变量所引用的对象将会对另一个变量产生影响. Employee original = new Employ ...

  4. java12章_【有书共读】java核心技术卷1--第12章

    ==============java核心技术卷1第12章----Swing用户界面组件===========主要内容:1 swing和模型-视图-控制器设计模式2布局管理 3文本输入4选择组件 5菜单 ...

  5. Java 基本功之(三)Java 核心技术

    转载自https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/basis/Java%E5%9F%BA%E7%A1%80%E7%9F% ...

  6. Java核心技术点之集合框架

    1. 概述     Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容 ...

  7. Java核心技术笔记 语言基础

    <Java核心技术 卷Ⅰ> 第3章 Java 的基本程序设计结构 一些规则 类命名:CamelCase 驼峰命名法,以及必须是字母开头,后面跟字母和数字的任意组合: 源代码文件名:必须与公 ...

  8. Java核心技术点之动态代理

    本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代 ...

  9. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读

    前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开 ...

最新文章

  1. ScrollView的基本用法丶代理方法
  2. 没有为类型定义方法怎么办_拼多多开店没有流量怎么办?有什么方法?新手必看!...
  3. 笔记-高项案例题-2017年上-变更管理-需求管理
  4. Asp.Net Core Docker镜像更新系统从wheezy改为stretch
  5. 【UML】类图Class diagram(转)
  6. regionserver.HRegionServer: Failed construction RegionServer
  7. 嵌入式软件架构设计之分层设计
  8. ×××技术详解(二)
  9. java 中文变拼音包,中文转化为拼音工具包
  10. ADNI影像数据解析及下载
  11. 获取企业微信code
  12. 两寸证件照的尺寸是多少?如何换两寸证件照的背景色?
  13. python兔子生兔子
  14. 进程管理API之find_get_pid
  15. 教你巧用后视镜判断车距
  16. 生产周期缩短42%,效率提升28%,申菱展示数据智能成绩单
  17. 2021年5月国产数据库排行榜:阿里系“OPA”持续攀升,华为“高斯模式”获成功...
  18. CF Pairs of Topics
  19. 河南省焦作市谷歌高清卫星地图下载
  20. android 先拍照后对焦,何须羡慕诺基亚 安卓也可先拍照后对焦

热门文章

  1. CAD2018软件安装
  2. 【论文阅读】12-PatchMatch Stereo - Stereo Matching with Slanted Support Windows
  3. 砸自家招牌?PS 发布准确率高达 99% 的「去 PS」神器
  4. 亿级流量电商详情页系统设计与实战-虚拟机centos环境搭建
  5. 虚拟机linux桌面无法打开网页,虚拟机ie无法打开网页
  6. 第1155期AI100_机器学习日报(2017-11-16)
  7. 钱荒围剿门户 悬崖边上的中关村在线如何谋变
  8. 【Active Learning - 10】图像分类技术和主动学习方法概述
  9. 获取安卓设备唯一ID
  10. 数字电路实验怎么接线视频讲解_单相电机+双电容,怎么控制电机正反转,老电工老告诉你!...