java基础学习

由于本人有c/c++基础,今天上手感觉java要比c++简单不少,不能说简单,但是我觉得c++转java要比java转c++要轻松。学了一天我发现java应该是目前综合素质最高的语言了,既没有c++的繁琐和编译问题也没有python自由过头的那种随意性,而是条理清晰,结构分明,封装优秀的泛型,而且社区资源非常好,又找到了学c语言时那种一板一眼的感觉,总之我认为写java代码不会为一些不知名的错误而烦恼。

基础体系

内存模型

分为方法区,堆区,栈区,方法区还有一个静态区

基本类型

byte,short,int long,float,double,char,boolean

  • 这些类型都有固定的长度
  • 少字节向多字节转换时可为隐式转换,多字节向少字节转换时必须显式强制类型转换,格式和c语言一样
  • 在java中0和非零不再表示真和假,boolean不能转化为其他类型

引用类型

除了基本类其他变量都是引用类型,类似c++的引用,但不用&符号。他们指向用new建立的对象,而且我们不用手动释放这些对象,当一个对象的引用为零时就会自动释放

标识符

关键字
关键字全为小写字母
用户自定义标识符
可以由数字字母下划线$构成,不能以数字开头

运算符和语句

运算符没变
语句中gotobreak取代了
continue也可以加标号
增强for只能遍历集合和数组

可变参数

修饰符 返回值类型 方法名(参数类型... 形参名){ }

等价于下述定义

修饰符 返回值类型 方法名(参数类型[] 形参名){ }

递归

说明

  • 递归分为两种,直接递归和间接递归。直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
  • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
  • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
  • 构造方法,禁止递归

数组

这个对象一旦初始化就不能在改变了,如果改变了那就是创建了一个新的对象
但是指向他们的引用是可以直向其他对象的
创建变量
类型名 [ ]变量名
类型名 变量名 [ ]
初始化对象
1、=“ ”
2、=new 类型名[]{内容}
3、=new 类型名[大小]

String

太重要了只能放在这里
说明

  • 字符串的值在创建后不能被更改。
  • 它们可以被共享
  • "abc"等效于 char[] data={ 'a' , 'b' , 'c' }

方法

  • public String() :初始化新创建的 String对象,以使其表示空字符序列
  • public String(char[] value) :通过当前参数中的字符数组来构造新的String
  • public String(byte[] bytes) :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。
  • public boolean equals (Object anObject):将此字符串与指定对象进行比较
  • public boolean equalsIgnoreCase (String anotherString):将此字符串与指定对象进行比较,忽略大小写
  • public int length ():返回此字符串的长度
  • public String concat (String str) :将指定的字符串连接到该字符串的末尾。
  • public char charAt (int index) :返回指定索引处的 char值。
  • public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引
  • public String substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
  • public String substring (int beginIndex, int endIndex):返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex
  • public char[] toCharArray ():将此字符串转换为新的字符数组。
  • public byte[] getBytes ():使用平台的默认字符集将该 String编码转换为新的字节数组。
  • public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。
  • public String[] split(String regex):将此字符串按照给定的regex(规则)拆分为字符串数组

面向对象体系

面向对象的实现就是类,与c++不同,实现全部在类内,在一个文件内有且只有一个public类且与文件名相同
构造函数和c++相同,没有析构函数

封装


类似于c++中的头文件

  • 使用import关键字导包,在类的所有代码之前导包,引入要使用的类型,java.lang包下的所有类无需导入

thissuper

  • super :代表父类的存储空间标识(可以理解为父亲的引用)。
  • this :代表当前对象的引用(谁调用就代表谁)。

访问成员

this.成员变量 ‐‐ 本类的
super.成员变量 ‐‐ 父类的
this.成员方法名() ‐‐ 本类的
super.成员方法名() ‐‐ 父类的

访问构造方法

this(...) ‐‐ 本类的构造方法
super(...) ‐‐ 父类的构造方法

static
静态成员

  • 静态成员是属于类的而不某个具体对象的,静态变量任何对象都可以修改,可以用对象访问也可以直接用类名访问

静态方法

  • 静态方法只能直接访问静态变量和静态方法,不能使用this

静态代码块

  • static{}

  • 优先于main方法和构造方法执行

final

类:被修饰的类,不能被继承。
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,不能被重新赋值。
  • 基本类型final局部变量只能被赋值一次
  • 引用类型final局部变量只能指向一个对象,但是对象可变
  • final成员变量可以显示初始化,也可以构造方法初始化。但只能二选一

权限修饰符
java基础学习_第1张图片

  • 不加和default相同

abstract抽象
抽象类

abstract class 类名字 {
}
  • 抽象类不一定抽象方法,包含抽象方法的类必为抽象类
  • 抽象类可以有构造方法,是供子类对象创建时初始化父类对象使用的
  • 抽象类不能创建对象,只能创建非抽象子类的对象

抽象方法

修饰符 abstract 返回值类型 方法名 (参数列表)
  • 子类必须重写父类的抽象方法,除非子类也是一个抽象类

内部类

class Car { //外部类
class Engine { //内部类
}
  • 内部类仍是一个独立的类,在编译后会生成.class文件,前面带有外部类的名字和$符号
  • 内部类可以访问外部类的所有成员
  • 外部类不能直接访问内部类的成员

内部类对象

外部类名.内部类名 对象名 = new 外部类型().new 内部类型()

匿名内部类

new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
  • 前提:匿名内部类必须要继承一个父类或接口

interface接口

public interface 接口名称 {
// 抽象方法
// 默认方法
// 静态方法
// 私有方法
}
  • 主要为了封装方法
  • 接口不是类而是一种引用数据类型,因此可以在类中定义接口变量
  • 接口中不能定义成员变量,但可以定义成员常量,默认使用public static final修饰符
  • 接口中没有构造方法,不能创建对象
  • 抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。
  • 默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。
  • 静态方法:使用 static 修饰,供接口直接调用。
  • 私有方法:使用 private 修饰,供接口中的默认方法或者静态方法调用。
  • 私有静态方法:默认方法和静态方法可以调用

继承

子类具有与超类相同的属性和行为,子类可以直接访问超类的非私有属性和行为
集成是多态的前提
extends

class 父类 {
...
}
class 子类 extends 父类 {
...
}

继承后的成员

  • 不重名没有影响,重名用super访问父类成员

继承后的方法

  • 不重名没有影响,重名需要重写,重写时子类方法的权限必须大于等于父类的方法,子类方法的返回值函数名和参数列表必须和父类相同

继承后的构造方法

  • 子类无法继承父类的构造方法,在子类的构造方法中必须先执行父类的初始化,super()表示调用父类的构造方法

implements接口实现

class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}
  • 必须重写接口中的抽象方法
  • 如果有抽象方法重名,只需要重写一次,
  • 如果默认方法有重名,必须重写一次(接口重写默认方法可以保留default,子类重写默认方法不能保留default),
  • 父类中的成员方法和接口中的默认方法重名,子类会选择执行父类的成员方法

多态

同一行为具有不同的表现形式

父类类型 变量名 = new 子类对象;
变量名.方法名();
  • 前提:1. 继承或者实现【二选一】2. 方法的重写【意义体现:不重写,无意义】3. 父类引用指向子类对象【格式体现】
  • 当使用多态使用成员时,首先检查父类中是否有该成员,如果没有则编译错误,如果有,执行的时是子类重写的方法

转型

  • 使用多态时不能调用子类有而弗雷没有的方法,如果想要调用子类特有方法就要进行向下转型

向上转型

父类类型 变量名 = new 子类类型();

向下转型

子类类型 变量名 = (子类类型) 父类变量名;

instanceof

变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false

常用类

  • 其实这些类也可以不用记,你只要知道有这么个方法就行,打出几个字母来就会有提词,你只需要根据返回值和参数类型选择就行了,即使你不知道也可子自己面向过程编写方法是不
    当然最好是下一个中文版的手册可以随时查阅
    jdk 6.0 api 中文版

Object类
说明

  • 即所有类的父类。它中描述的所有方法子类都可以使用,其他类的部分方法就是重写的该类方法。

方法

  • public String toString():返回该对象的字符串表示。toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
  • public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。默认地址比较,如果没有覆盖重写equals方法,那么Object类中默认进行==运算符的对象地址比较,只要不是同一个对象,结果必然为false。对象内容比较,如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法.

Objects工具类
说明

  • 它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。

方法

  • public static boolean equals(Object a, Object b):判断两个对象是否相等。

包装类
说明

  • Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类
  • int变为Integer,char变为Character,其他都是手写字母变大写
  • 基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“,由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。
  • 为泛型做准备

方法

  • +“”:基本类型转化为字符串类型
  • public static byte parseByte(String s):将字符串参数转换为对应的byte基本类型。
  • public static short parseShort(String s):将字符串参数转换为对应的short基本类型。
  • public static int parseInt(String s):将字符串参数转换为对应的int基本类型。
  • public static long parseLong(String s):将字符串参数转换为对应的long基本类型。
  • public static float parseFloat(String s):将字符串参数转换为对应的float基本类型。
  • public static double parseDouble(String s):将字符串参数转换为对应的double基本类型。
  • public static boolean parseBoolean(String s):将字符串参数转换为对应的boolean基本类型。

Scanner类.
说明

  • 一个可以解析基本类型和字符串的简单文本扫描器。

方法

  • public Scanner(InputStream source): 构造一个新的 Scanner ,它生成的值是从指定的输入流扫描的。
  • public int nextInt():将输入信息的下一个标记扫描为一个 int 值

Random类
说明

  • 此类的实例用于生成伪随机数

方法

  • public Random():创建一个新的随机数生成器。
  • public int nextInt(int n):返回一个伪随机数,范围在 0 (包括)和 指定值 n (不包括)之间的int 值。

StringBuilder类
说明

  • 称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。

方法

  • public StringBuilder():构造一个空的StringBuilder容器。
  • public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去。
  • public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。
  • public String toString():将当前StringBuilder对象转换为String对象。

Arrays类
说明

  • 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法

方法

  • public static String toString(int[] a):返回指定数组内容的字符串表示形式。
  • public static void sort(int[] a):对指定的 int 型数组按数字升序进行排序。

Math类
说明

  • 其所有方法均为静态方法,并且不会创建对象

方法

  • public static double abs(double a):返回 double 值的绝对值。
  • public static double ceil(double a):返回大于等于参数的最小的整数。
  • public static double floor(double a):返回小于等于参数最大的整数。
  • public static long round(double a):返回最接近参数的 long。(相当于四舍五入方法)

日期时间类

Date类
说明

  • 在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。

方法

  • public Date():初始化为当前系统时间
  • public Date(long date):date为即1970年1月1日00:00:00 GMT)以来的指定毫秒数。由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒
  • public long getTime() :把日期对象转换成对应的时间毫秒值。

DateFormat类
说明

  • 抽象类,我们可以使用这个类来完成Date对象和String对象之间的转换

方法

  • public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat,
  • y年d日H时m分s秒
  • public String format(Date date):将Date对象格式化为字符串。
  • public Date parse(String source):将字符串解析为Date对象。

Calender类
说明

  • 抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象

方法

  • public static Calendar getInstance():使用默认时区和语言环境获得一个日历
  • public int get(int field):返回给定日历字段的值。
  • public void set(int field, int value):将给定的日历字段设置为给定值。
  • public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
  • YEAR 年 MONTH月DAY_OF_MONTH 月中的天HOUR时HOUR_OF_DAY时(24小时制)MINUTE分 SECOND 秒 DAY_OF_WEEK周中的天

System类
说明

  • 提供了大量的静态方法,可以获取与系统相关的信息或系统级操作

方法

  • public static long currentTimeMillis():返回以毫秒为单位的当前时间。
  • public static void arraycopy(Object 源, int srcPos, Object dest, int destPos, int length):将数组中指定的数据拷贝到另一个数组中。

泛型编程体系

泛型的实现就是类似c++模板概念,就是将数据类型也当做参数传递
不得不说java的泛型编程封装的实在是太好了,相信很多自学c++都是在泛型各种容器上放弃的

定义格式

  • 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }:定义泛型方法
  • 修饰符 class 类名<代表泛型的变量> { }:定义泛型类
  • 修饰符 interface接口名<代表泛型的变量> { }:定义泛型接口

说明

  • 泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
  • 用集合创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型
  • 泛型类型只能是引用类型,也可以在定义时默认指定一个
  • 泛型中的类型不存在继承关系

类型< T>

说明

  • 用集合创建对象时,将未知的类型确定具体的类型。可以默认指定一个泛型,当没有指定泛型时,默认类型为Object类型
  • 泛型类型只能是引用类型
  • 泛型中的类型不存在继承关系

通配符?
说明

  • 当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
  • 此时只能接受数据,不能往该集合中存储数据。

泛型上限
类型名称 对象名称:只能接受该类型和子类
泛型下限
类型名称 对象名称:只能接受该类型及其父类型

Iterator< E>迭代器

和c++差不多,好似指针,创建它的对象要用集合中的方法
说明

  • Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。
  • 迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

方法

  • public E next():返回迭代的下一个元素。在调用next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
  • public boolean hasNext():如果仍有元素可以迭代,则返回 true。

函数式编程体系

函数式接口

说明

  • 函数式接口在Java中是指:有且仅有一个抽象方法的接口。
  • 函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

Lambda表达式

格式

(参数类型 参数名称)> { 代码语句 }

Supplier接口

说明

  • .Supplier 接口仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对
    象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。

Consumer接口

说明

  • .Consumer 接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。

方法

  • 法 void accept(T t) ,意为消费一个指定泛型的数据
  • 如果一个方法的参数和返回值全都是Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是 Consumer 接口中的default方法 andThen

Predicate接口

说明

  • 有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用Predicate 接口。

方法

  • boolean test(T t) 。用于条件判断的场景
  • 既然是条件判断,就会存在与、或、非三种常见的逻辑关系。其中将两个 Predicate 条件使用“与”逻辑连接起来实现“并且”的效果时,可以使用default方法 and
  • 与 and 的“与”类似,默认方法 or 实现逻辑关系中的“或
  • “与”、“或”已经了解了,剩下的“非”(取反)也会简单。默认方法 negate

Function接口

说明

  • Function 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,
    后者称为后置条件。

方法

  • Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。
  • Function 接口中有一个默认的 andThen 方法,用来进行组合操作

数据结构体系

Collection< E>集合

说明

  • 是单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是ListSet。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有ArrayListLinkedListSet接口的主要实现类有HashSetTreeSet

通用方法

  • public boolean add(E e): 把给定的对象添加到当前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把给定的对象在当前集合中删除。
  • public boolean contains(E e): 判断当前集合中是否包含给定的对象。
  • public boolean isEmpty(): 判断当前集合是否为空。
  • public int size(): 返回集合中元素的个数。
  • public Object[] toArray(): 把集合中的元素,存储到数组中。
  • public Iterator iterator():获取集合迭代器

Collections集合工具类
说明

  • 用来对集合进行操作

方法

  • public static boolean addAll(Collection c, T... elements) :往集合中添加一些元素。
  • public static void shuffle(List list) 打乱顺序 :打乱集合顺序。
  • public static void sort(List list) :将集合中元素按照默认规则排序。这个方法完成的排序,实际上要求了被排序的类型需要实现Comparable接口完成比较的功能
  • public static void sort(List list,Comparator ) :将集合中元素按照指定规则排序。使用此方法必须自己定义规则
public int compare(String o1, String o2) :比较其两个参数的顺序。
两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回001大于02返回(正数) 如果要按照降序排序 则o1 小于o2,返回(正数),相等返回001大于02返回(负数)

Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()‐o1.getAge();
}
}

list< E>集合
说明

  • 元素存取有序
  • 带有索引
  • .集合中可以有重复的元素

方法

  • public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index) :返回集合中指定位置的元素。
  • public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素
  • public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

ArrayList< E >类
说明

  • 大小可变的数组的实现, ArrayList 中可不断添加元素,其大小也自动增长。

方法

  • public ArrayList() ·:构造一个内容为空的集合
  • public E remove(int index):移除此集合中指定位置上的元素。返回被删除的元素。
  • public E get(int index):返回此集合中指定位置上的元素。返回获取的元素。

LinkedList< E>类
说明

  • 集合数据存储的结构是双向链表结构。方便元素添加、删除的集合。

方法

  • public void addFirst(E e) :将指定元素插入此列表的开头。
  • public void addLast(E e):将指定元素添加到此列表的结尾。
  • public E getFirst():返回此列表的第一个元素。
  • public E getLast():返回此列表的最后一个元素。
  • public E removeFirst() :移除并返回此列表的第一个元素。
  • public E removeLast() :移除并返回此列表的最后一个元素。
  • public E pop() :从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e) :将元素推入此列表所表示的堆栈。
  • public boolean isEmpty() :如果列表不包含元素,则返回true。

set< E>集合
说明

  • 元素存取无序
  • 没有索引
  • 元素不重复

HashSet< E>类
说明

  • 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法
  • 给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保
    证HashSet集合中的对象唯一

LinkedHashSet< E>类
说明

  • 链表和哈希表组合的一个数据存储结构
  • 元素排列有序

Map< E>集合

说明

  • 是双列集合类的根接口,用于存储一系列符合某种规则的元素,每个元素由键与值两部分组成,通过键可以找对所对应的值,它有一个重要的子接口,HashMap,HashMap下有个子类LinkedHashMap。
  • Map 中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在 Map 中是一一对应关系,这一对对象又称做 Map 中的一个 Entry(项) 。 Entry 将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历 Map 集合时,就可以从每一个键值对( Entry )对象中获取对应的键与对应的值。
  • :Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数据类型可以相同,也可以不同。

方法

  • ·public V put(K key, V value)· : 把指定的键与指定的值添加到Map集合中。使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的
    值,替换成指定的新值。
  • ·public V remove(Object key)· : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
  • public Set keySet() : 获取Map集合中所有的键,存储到Set集合中。
  • public Set> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
  • public K getKey() :获取Entry对象中的键。
  • public V getValue() :获取Entry对象中的值。
  • public Set> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

HashMap< E>集合
说明

  • 存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法

LinkedHashMap< E>类
说明

  • HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

异常体系

说明

  • 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止
  • 异常机制其实是帮助我们找到程序中的问题,异常的根类是 Throwable 。

异常分类

Throwable类
说明

  • 其下有两个子类:Error 与 .Exception ,平常所说的异常指Exception

方法

  • public void printStackTrace() :打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
  • public String getMessage() :获取发生异常的原因。提示给用户的时候,就提示错误原因。
  • public String toString() :获取异常的类型和异常描述信息(不用)。
  • public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
  • public String toString() :获取异常的类型和异常描述信息(不用)。
  • public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台

Error类
说明

  • 严重错误Error,无法通过处理的错误,只能事先避免。
  • 此类错误有内存溢出和系统崩溃

Exception类
说明

  • 表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。
  • 此类异常有编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
    运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)

异常处理

说明

  • 使用异常处理的五个关键字:try、catch、finally、throw、throws

抛出异常throw
说明

  • throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

格式

throw new 异常类名(参数);

声明异常throws
说明

  • 关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

格式

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2{ }

捕获异常try…catch
说明

  • try:该代码块中编写可能产生异常的代码。
  • catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。

finally代码块
说明

  • finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。finally不能单独使用.

格式

try...catch....finally

自定义异常
说明

  • 自定义一个编译期异常: 自定义类 并继承于Exception 。
  • 自定义一个运行时期的异常类:自定义类 并继承于RuntimeException 。

线程体系

线程实现

说明:

  • 第一种方法继承Thread类并重写run方法
  • 实现Runnable接口类

Thread类
说明

  • Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务

方法

  • public Thread():分配一个新的线程对象。
  • public Thread(String name) :分配一个指定名字的新的线程对象。
  • public Thread(Runnable target) :分配一个带有指定目标新的线程对象
  • public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字
  • public String getName():获取当前线程名称。
  • public void start() :导致此线程开始执行;Java虚拟机调用此线程的run方法。
  • public void run() :此线程要执行的任务在此处定义代码。
  • public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
  • public static Thread currentThread():返回对当前正在执行的线程对象的引用。

线程安全

同步代码块
格式

synchronized(同步锁){
需要同步操作的代码
}
  • . 锁对象 可以是任意类型。
  • 多个线程对象 要使用同一把锁。

同步方法
格式

public synchronized void method(){
可能会产生线程安全问题的代码
}
  • 对于非static方法,同步锁就是this。
  • 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

Lock锁

  • public void lock() :加同步锁。
  • public void unlock() :释放同步锁。

线程状态

Timed Waiting(计时等待)
说明

  • 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态
    将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、
    Object.wait。

BLOCKED(锁阻塞)
说明

  • 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。

Waiting(无限等待)
说明

  • 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。

NEW(新建)
说明

  • 线程刚被创建,但是并未启动。还没调用start方法

Runnable(可运行)
说明

  • 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操
    作系统处理器。

Teminated(被终止)
说明

  • 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。

线程池

说明

  • 其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源

方法

  • public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象。(创建的是有界线程池,也就是池中的线程个数可以指定最大数量)
  • public Future submit(Runnable task)获取线程池中的某一个线程对象,并执行

file体系

file类

说明

  • .File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
  • 一个File对象代表硬盘中实际存在的一个文件或者目录。
  • 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
  • public File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
  • public String getAbsolutePath():返回此File的绝对路径名字符串。
  • public String getPath():将此File转换为路径名字符串。
  • public String getName():返回由此File表示的文件或目录的名称。
  • public long length():返回由此File表示的文件的长度。
  • public boolean exists():此File表示的文件或目录是否实际存在。
  • public boolean isDirectory():此File表示的是否为目录。
  • public boolean isFile():此File表示的是否为文件。
  • public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete():删除由此File表示的文件或目录。
  • public boolean mkdir():创建由此File表示的目录。
  • public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。
  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录

IO流体系

说明

  • 根据数据的流向分为:输入流和输出流。
  • 输入流 :把数据从 其他设备 上读取到 内存 中的流。
  • 输出流 :把数据从 内存 中写出到 其他设备 上的流。

字节流

说明

  • 以字节为单位,读写数据
  • Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;
  • Unix系统里,每行结尾只有 换行 ,即 \n ;
  • Mac系统里,每行结尾是 回车 ,即 \r 。从 Mac OS X开始与Linux统一

OutputStream字节输出流
说明

  • .OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

方法

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节输出流。

*FileOutputStream类
说明

  • FileOutputStream 类是文件输出流,用于将数据写出到文件。

方法

  • public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。
  • public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。

InputStream字节输入流
说明

  • .InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法

方法

  • public void close():关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read(): 从输入流读取数据的下一个字节。
  • public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

FileIuputStream类
说明

  • .FileInputStream 类是文件输入流,从文件中读取字节。

方法

  • FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名
  • FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

字符流

说明

  • 以字符为单位,读写数据
  • 当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为
    一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文
    件。

Reader字符输入流
说明

  • .Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

方法

  • public void close():关闭此流并释放与此流相关联的任何系统资源。
  • public int read(): 从输入流读取一个字符。
  • public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

FileReader类
说明

  • FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
  • 字节缓冲区:一个字节数组,用来临时存储字节数据。

方法

  • FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象
  • FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称

Writer字节输出流
说明

  • Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

方法

  • void write(int c)写入单个字符。
  • void write(char[] cbuf)写入字符数组。
  • abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
  • void write(String str)写入字符串。
  • void write(String str, int off, int len)写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
  • void flush()刷新该流的缓冲。
  • void close() 关闭此流,但要先刷新它。

FileWriter类
说明

  • FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

方法

  • FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。

Io流异常处理

try catch finally语句
try-with-resource语句

try (创建流对象语句,如果多个,使用';'隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}

优化后的try-with-resource语句

// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");
// 引入方式:直接引入
try (resource1; resource2) {
// 使用对象
}

Properties类

说明

  • .Properties 继承于 Hashtable ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时,ystem.getProperties 方法就是返回一个 Properties 对象。

方法

  • public Properties():创建一个空的属性列表
  • public Object setProperty(String key, String value): 保存一对属性。
  • public String getProperty(String key):使用此属性列表中指定的键搜索属性值。
  • public Set stringPropertyNames() :所有键的名称的集合。
  • public void load(InputStream inStream): 从字节输入流中读取键值对。

缓冲流

说明

  • 缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类:

字节缓冲流
方法

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

字符缓冲流
方法

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
  • public BufferedWriter(Writer out): 创建一个新的缓冲输出流。
  • BufferedReader: public String readLine() : 读一行文字。
  • BufferedWriter: public void newLine(): 写一行行分隔符,由系统属性定义符号

字符转换流

InputStreamReader类
说明

  • o.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

方法

  • InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流

** OutputStreamWriter类**
说明

  • o.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

方法

  • OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

序列化反序列化

说明

  • Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、 对象的
    类型 和 对象中存储的属性 等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
    反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。 对象的数据 、 对象的类型 和 对象中
    存储的数据 信息,都可以用来在内存中创建对象。看图理解序列化:

ObjectOutputStream类
说明

  • .ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

方法

  • public ObjectOutputStream(OutputStream out): 创建一个指定OutputStream的ObjectOutputStream。
  • public final void writeObject (Object obj): 将指定的对象写出。

ObjectInputStream类
说明

  • ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

方法

  • public ObjectInputStream(InputStream in): 创建一个指定InputStream的ObjectInputStream。
  • public final Object readObject (): 读取一个对象。

打印流

** PrintStream类**
方法

  • public PrintStream(String fileName): 使用指定的文件名创建一个新的打印流。

网络体系

CS架构

Socket客户端
方法

  • public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。
  • public InputStream getInputStream() : 返回此套接字的输入流。如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。关闭生成的InputStream也将关闭相关的Socket。
  • public OutputStream getOutputStream() : 返回此套接字的输出流。如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。关闭生成的OutputStream也将关闭相关的Socket。
  • public void close() :关闭此套接字。一旦一个socket被关闭,它不可再使用。关闭此socket也将关闭相关的InputStream和OutputStream 。
  • public void shutdownOutput() : 禁用此套接字的输出流。任何先前写出的数据将被发送,随后终止输出流。

SeverSocket服务器
方法

  • public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。
  • public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

BS架构

你可能感兴趣的:(java)