常用类
内部类
1. 基本概念
- 分类:成员内部类、静态内部类、局部内部类、匿名内部类
- 概念:在一个类的内部再定义一个完整的类。
- 特点:
(1)编译之后可生成独立的字节码文件
(2)内部类可直接访问外部类的私有成员,而不破坏封装。
(3)可为外部类提供必要的内部功能组件。
2. 成员内部类
- 在类的内部定义,与实例变量、实例方法同级别的类。
- 属于外部类的一个实例部分,创建内部类对象,必须依赖外部类对象。
- 创建
Outer out=new Outer();
Outer.Inner in=out.new Inner();
- 当外部类存在同名属性时,优先访问内部类属性,通过外部类类名.this.外部类实例属性
- 成员内部类不能定义静态成员
3. 静态内部类
- 不依赖外部类对象,可直接创建或通过类名访问,也可声明静态成员
- 创建
Outer.Inner.静态成员
Outer.Inner in=new Outer.Inner();
4. 局部内部类
- 定义在外部类的方法中,作用范围和创建对象的范围仅限当前方法中。
- 局部内部类访问外部类局部变量时,因无法保障变量的生命周期与自身相同,所以修饰为final。
- 隐藏类的信息、限制类的作用范围。
5. 匿名内部类
- 没有类名的局部内部类
- 必须继承一个父类或实现一个接口。
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
- 优:减少代码量,书写的思路流畅。
- 劣:可读性较差。
- API:Appplication Programming Interface应用程序编程接口(一些预先定义的函数)
Object类
1.概念
- 超类、基类,所有类的直接或间接父类,位于继承树顶端
- 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类
- Object类中所定义的方法,是所有对象都具备的方法。
- Object类型可以存储任何对象:
(1)作为参数,可接受任何对象。
(2)作为返回值,可返回任何对象。
2. 常用方法:
1.public final Class<?> getClass ( ) { }
- 返回引用中存储的实际对象类型。
- 应用:通常用于判断两个引用中实际存储对象类型是否一致。
2.public int hashCode ( ) { }
- 一个对象的整数表现形式(整数型的名字)。
返回该对象的十进制的哈希码值。
哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值。
哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码。
3.public String toString ( ) { }
- 返回该对象的字符串表示(表现形式)。
可以根据程序需求覆盖该方法,如:展示对象各个属性值。
4.public boolean equals(Object obj) { }
-
默认实现为(this == obj),比较两个对象地址是否相同。
可进行覆盖,比较两个对象的内容是否相同。 -
覆盖equals的顺序:
1). 比较两个引用是否指向同一个对象。
2). 判断obj是否为null。
3). 判断两个引用指向的实际对象类型是否一致。
4). 强制类型转换。
5). 依次比较各个属性值是否相同。
5.protected void finalize() throws Throwable //了解(面试题中可能有坑)
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象。
垃圾回收: 由GC销毁垃圾对象,释放数据存储空间。
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
手动回收机制:使用System.gc(); 通知JVM执行垃圾回收。
注:附加源代码:Windows --> Preferences --> Java --> Installed JREs --> 选中JRE --> Edit --> xxx/rt.jar --> Source Attachment --> External Location --> External File 选中src.zip
包装类
1. 概念
- 基本类型所对应的包装类型
- Object可统一所有数据,包装类的默认值是null
- 包装类实际上就是持有了一个基本类型的属性,作为数据的存储空间(Byte中有一个byte属性),还提供了常用的转型方法,以及常量。既可以存储值,又具备了一系列的转型方法和常用常量,比直接使用基本类型的功能更强大。
- 包装类型中提供了若干转型方法,可以让自身类型与其他包装类型、基本类型、字符串相互之间进行转换
2. 转型方法
- 8种包装类型中,有6种是数字型(Byte、Short、Integer、Long、Double)继承自java.long.Number父类
- java.long.Number父类为所有子类分别提供了6个转型的方法,将自身类型转换成其他数字型。
byteValue(), shortValue(), intValue(),
longValue(),doubleValue(),floatValue()
- paraseXXX(String s)静态转型方法,7种包装类型都有。除了Character,都可以通过String进行构建
byte b=paraseByte(“123”);
paraseShort(“123”); paraseInteger(“123”);
paraseLong(“123”); paraseDouble(“123”); paraseFloat(“123”);
- valueOf(基本类型)、valueOf(字符串类型),静态转型方法,8种包装类型。
Byte b1=Byte.valueOf((byte)10);
Byte b2=Byte.valueOf(“20”);
- 注意:在使用字符串构建包装类型对象时,要保证类型的兼容,否则产生NumberFormatException
- JDK5之后,自动装箱、拆箱,简化使用包装类的编程过程
Byte b4=40;//自动装箱,将基本类型直接赋值给包装类型调valueOf(byte b) byte
b5=b4;//自动拆箱,将包装类型的值,直接赋值给基本类型调用byteValue()
- 自动装箱时,会调用valueOf方法,Byte、Short、Integer、Long,四种整数包装类型都提供了对应的cache缓冲区,将常用的256个数字提 前创建对象并保存在数组中,实现复用。即在区间的复用已有对象,在区间外创建新对象。
String
1. 概念
- 字符串是常量,创建之后不可改变。
- 字符串字面值存储在字符串池中,可以共享。
2. 创建及常用方法
String s = “Hello”; 产生一个对象,保存在池中
String s2 = new String(“World”); 产生两个对象,池、堆各一个
3. 可变字符串:
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全。
4. BigDecimal
- 位置:java.math包中
- 作用:精确计算浮点数
- 创建方式:BigDecimal bd=new BigDecimal(“1.0”);
- 方法:
BigDecimal add(BigDecimal bd); 加
BigDecimal subtract(BigDecimal bd); 减
BigDecimal multiply(BigDecimal bd); 乘
BigDecimal divide(BigDecimal bd); 除
BigDecimal(BigDecimal bd,int scal,RoundingMode mode);除法
- 参数scal:指定精确到小数点后几位
- 参数mode:指定小数部分的取舍模式,通常采用四舍五入的模式,
取值为BigDecimal.ROUND_HALF_UP
集合
1 .Collection体系集合
- Collection父接口:该体系结构的根接口,代表一组对象,称为“集合”,每个对象都是该集合的”元素”
- 概念:对象的容器,存储对象的对象,可替代数组
特点:容器的工具类,定义了对多个对象进行操作的方法
位置:java.util.*;
代表一组任意类型的对象,无序、无下标 - List接口特点:有序、有下标、元素可重复
- Set接口特点:无序、无下标、元素不可重复
2. List接口
- 特点:有序、有下标、元素可重复
- 继承父接口提供的共性方法,同时定义了一些独有的下标相关的操作方法
3. List实现类:
- JDK8的ArrayList,实际长度是0
- 首次添加元素时,需要实际分配数组空间,执行数组扩容操作(10)
- 真正向数组空间插入数据,Lazy懒用的时候再创建,或再加载,有效降低无用内存空间
- ArrayList
(1)数组结构存储,查询快,增删慢。//注册(1次)—>查询(N次)
(2)JDK1.2版本,运行效率快、线程不安全 - Vector
(1)数组结构存储,查询快,增删慢
(2)JDK1.0版本,运行效率慢、线程安全 - LinkedList:
链表(链接列表)结构存储,查询慢,增删快
了解:Queue接口:队列、双端队列
了解:栈结构Last In First Out(后进先出)
了解:队列结构:First In First Out(先进先出)
4. 泛型集合
-
概念:参数化类型、类型安全的集合。强制集合元素类型必须一致。
-
特点:
(1)编译时即可检查,而非运行时抛出异常。
(2)访问时,不必类型转化(拆箱)
(3)不同泛型之间引用不能相互赋值,泛型不存在多态 -
泛型:高级类别的知识,熟练应用,需要时间、经验积累(常用名称:E=Element/T=Type/K =Key/V=Value)
(1)概念:约束、规范类型
(2)泛型的场景:
定义泛型:
A)实例泛型(类、接口):a)类:创建对象时,为类所定义的泛型,进行参数化赋值
b)接口:实现接口时,为借口所定义的泛型,进行参数化赋值B)静态泛型
a)定义在方法的返回值类型前面,
< T >、< T extends Object>、<T extends Comparable< T >>、
<T extends Comparable<? Super T>
- 可应用在形参列表、返回值两种场景下,不单单可以规范泛型,还可以语义化返回值
b)定义在方法的形参列表当中:
<?>、<? Extends Object>、<? Super Integer>
- 不支持使用&。只能应用在参数列表上,规范泛型
5. Collections工具类
1.public static<T extends Comparable<? Super T>> void sort(List list)//排序, 要求:必须实现Comparable,必须可与自身类型相比,以及父类类型相比
2.public static void reverse(List<?> list)//反转、倒置元素
3.public static void shuffle随机重置顺序
- 经验:一级目标能看懂能调用,二级目标能定义、能设计
6. set子接口
- 特点:无序、无下标、元素不可重复(当插入新元素时,如果新元素与已有元素进行equals比较,结果为true时,则拒绝新元素插入
- 方法:全部继承自Collection中的方法
- foreach循环
for(数据类型 变量名:容器名称){
//可遍历集合或数组(常用在无序集合上)
}
- Set接口实现类
- HashSet(重要):
1)HashSet的底层使用的HashMpa类,即将即将所有需要存入HashSet的值,直接保存在HashMap中
2)先判断hashcode是否一致,==比较地址,equals比较内容 - LinkedHashSet(了解)
底层使用LinkedHashMap(链表结构)存储,节点形式独立存储数据,并可以指向下一个节点,通过顺序访问节点,可保留元素插入顺序 - TreeSet(了解)
1)实现了SortedSet接口,要求必须可以对元素排序。底层TreeMap
2)所有插入元素,必须实现Comparable接口,覆盖compareTo方法
3)根据compareTo方法返回0作为去重依据,(意为重复)
7. Map体系集合
- Map地图、映射
概念:存储一对数据(Key-Value),无序、无下表,键不可重复,值可重复 - HashMap算法:拿到任何一个对象后,通过hash(key)做运算,key>>>16(除以16),只可能得到0~15之间的一个数组,作为插入数组的下标
- 分类:
- HashTable:HashMap的线程安全版本
- TreeMap:自动对key做排序,根据compareTo的返回值去重
- Properies:Hashtable子类,主要用于存储key和value都是字符串的情况,常在读取配置文件后,保存文件中的键值对。反射、JDBC
- Map集合的遍历
(1)keySet();获得Map集合的所有键,返回的是Set集合
(2)Values();获得Map集合中的所有值。返回的是Collection集合
(3)entrySet();返回的是Map.Entry(Node)包含了getKey()和getValue()。直接输出调用的是toString打印键值对
(4)Iterator迭代器 专注于迭代Collection体系集合的