Java核心技术一 上读后感

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格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值