由于前段时间准备考试,断更了几天的笔记,今天开始继续:
1、Object类
类Object是类层次结构的根类,每个类都使用Object作为父类,所有对象、包括数组都实现这个类的方法;
Object类中toString()方法获取对象的地址值,如果重写了toString方法,将打印其属性信息
public String toString(){
return name + age;//返回什么就打印什么,将成员变量进行返回
}
看一个类是否重写了toString方法,如果没有没有写,那么打印的就是对象的地址值,默认调用Object类的toString方法;
如果重写了toString方法,那么就按照重写的方式打印
2、public boolean equals(Object obj)其他对象是否等于此对象。
【1】== 基本数据类型,比较的是数据的值,引用数据类型,比较的是数据的地址值,
this 和 Obj 其实比较的是两个对象的地址值是否相同,相同为true,不同为false
多态 Object obj = new Person();
【2】对equals重写时:父类不能访问子类的特有内容的,需要向下转型,instanceOf()判断,来进行向下
转型,同时需要判断比较【对象是不是null和是不是自己本身,是不是同一类的对象】,如果是直接返回,不再进行后续的判断,来提高代码的运行效率
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj==null){
return false;
}
if(obj instanceOf Person){
Person p = (Person)obj;
return b;
}
return false;
}
getClass() !=obj.getClass()使用反射技术,判断obj是否为Person类型,等效于instanceOf()
【3】boolean b = Objects.equals(o1,o2);
return (a==b)||(a!=null && a.equals(b));
//Objects类的equals方法,对两个对象进行比较,防止空指针异常
【4】equals 只能比较引用数据类型,因为equals是一个方法,方法只能被对象进行调用,基本数据类型不是对象,不能调用equals方法;
【5】如果重写了equals方法,那么比较的是其中的属性值;如果没有重写了equals方法,那么比较的是其中的地址值,会调用object中equals方法,对地址值进行比较;
4、Date类:表示日期和时间的类,表示特定的瞬间,精确到毫秒【util包】
1000毫秒 = 1秒
特定的时间:一个时间点,
【毫秒值可以对时间和日期进行计算】:将日期转换为毫秒进行计算,计算完毕,再把毫秒转换成日期
时间原点:1970.1.1 00.00.00–》英国格林威治标准时间,但是中国属于东八区,需要将时间增加8个小时
1970.1.1 08.00.00才可以;
System.currentTimeMills()当前的系统时间到时间原点经历多少毫秒 ,同时注意【毫秒值是long类型的】
5、Date类构造方法和成员方法
【a】构造方法
1、Date()空参构造方法 --获取当前的系统日期和时间
2、Date(long date)–传递毫秒值,把毫秒转换为Date日期
【b】成员方法
Long getTime()–获取毫秒值,把日期转换成毫秒值;–System.currentTimeMills()等效的;
6、DateFormat类,进行日期的设置格式化–是format的子类,同时也是一个【抽象类】, 需要子类进行实现–》SimpleDateFoemat()类 【text包】
日期和时间【格式化】–日期转换成文本–【解析】–文本转换成日期–标准化
【1】成员方法
【a】String format(Date date)按照指定的模式,把date日期,格式化为符合模式的字符串;
【b】Date parse(String source)解析将符合模式的字符串,解析为日期;
【2】SimpleDateFormat(String pattern)用给定的模式和默认语言环境的日期格式符号构造
String pattern:就是指定的格式
格式是区分大小写的,模式中的字母是不能更改的, 里面的连接模式的符号是可以改变的
【3】把日期格式为文本
1、创建一个SimpleDateFormat,构造方法中传递指定的模式;
2、调用format()方法,按照构造方法中指定的模式,把Date日期格式化为符合模式的字符串–文本
【4】文本字符串解析为日期
1、创建一个SimpleDateFormat,构造方法中传递指定的模式;
2、调用parse()方法,但是此方法会抛出parseException异常,必须在方法上声明将异常抛出给虚拟机—throws或try…catch进行处理;把符合构造方法中模式的字符串,解析为Date日期
7、Calendar类
【抽象类】,需要创建子类进行调用方法,直接子类是 GregorianCalendar
【Calendar rightNow = Calendar.getInstance();//静态方法】通过Calenddar的getInstance()方法来创建一个日历对象;
【a】成员方法:
1、public int get(int field)-----get(int field)返回给定日历字段的值
【注意】【int field字段:都是【静态final字段】,需要使用类名进行调用】—static final 修饰的变量—常量 --通过类名进行调用
Calendar c = Calendar.gerInstance();
int year = c.get(Calendar.YEAR);
//都是静态字段,需要使用类Calendar进行调用
2、public void set(int field,int value)设置具体的值
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR,9999);
也可以进行同时设置,使用set的重载参数
c.set(int year,int month,int date);
3、public abstract void add(int field,int amount)–抽象方法
根据日历的规则,将指定的时间量添加或减去给定的日历字段。
例如,要从当前日历的时间减去5天,可以通过调用以下方法来实现add
(Calendar.DAY_OF_MONTH, -5)
4、public final Date getTime() 将日历转换为日期,返回一个日期对象
【12月31 month0-11月】
8、System类
1、public static long currentTimeMillis() 获取当前时间的毫秒值—用来测试程序的效率
2、public static void arraycopy(Object src,int srcPos,
Object dest,
int destPos,
int length)
如果length超出数组的范围或者length为负值,都会报索引越界异常;arraycopy只能正向复制,不能反向复制;
9、StringBuilder类 【lang包】
String s = “abc”;也是一个对象
【1】String类:字符串是常量,在赋值之后不能发生更改,字符串底层是一个被final修饰的字节数组,不能改变,是常量,每创建一个字符串就会开辟一个空间;
底层是一个字节数组private final byte[] value;
【2】StringBuilder类,字符串缓冲区,可以提高字符串的操作效率,可以看成一个长度可变的字符串,底层也是一个字节数组,同时没有被final关键字修饰,可以改变长度,初始容量为16;
byte[] value = new byte[16];
【3】StringBuilder在进行字符串拼接的时候,会将之前的字符串覆盖掉,始终是一个数组,占用的空间少,效率高,如果超出容量,会自动扩容
【4】StringBuilder构造方法和成员方法
【a】构造方法
StringBuilder() 无参
StringBuilder(String str) 有参
【b】成员方法
【1.1】append(…)添加任意类型数据的字符串形式,并返回当前对象自身,也就是返回this,谁调用方法就返回谁,可以使用连式编程,因为append返回的就是调用者对象,那么就可以连续使用append方法进行连接,最后返回的连接好的字符串;
【5】StringBuilder和String相互转换
【a】String—StringBuilder–直接使用StringBuilder的有参构造方法将字符串转换成StringBuilder;
【b】StringBuilder—String–使用StringBuilder中的toString方法将StringBuilder缓存区转换成String字符串
【c】StringBuilder中的reverse()反转方法,将字符串进行反转操作;
10、包装类
Integer Character
【1】装箱和拆箱
【a】装箱—将基本数据类型包装到包装类中
Integer类
Integer(int value)
Integer(String s)传递的字符串,必须是基本数据类型的字符串,否则会抛出异常,"a"就是错误写法
static Integer valueOf(int i)
static Integer valueOf(String s)
拆箱:在包装类取出基本类型的数据
int inValue()
char charValue()….
其他基本数据类型在API中有对应的Value()方法;
【2】自动装箱和自动拆箱—JDK1.5后的新特性
【a】自动装箱:直接把int类型的整数赋值给包装类
Integer in = 1; 相当于 Integer in = new Integer(1);
【b】自动拆箱:
in 是包装类,无法直接参与运算,可以自动转换为基本数据类型的数据,在参与计算
in + 2 --》相当于 in.inValue()+2 = 3
in = in + 2 -->in = new Integer(3)自动装箱
【注意】
Integer aa = 50; Integer aa = new Integer(127);
Integer bb = 50; JVM里面有该数据,而且没有超过byte范围,为了节约空间,就会执行Integer bb = aa;
System.out.println(aa == bb);true
因为数据在byte范围之内时,JVM不会重新new对象,-128-127 如果超过范围将会重新new对象
【3】基本数据类型和字符串之间的转换
【a】基本数据类型—字符串
1、String str ="";—推荐使用,简单
2、使用包装类中的静态方法
static String toString(int i)
String s = Integer.toString(100);
3、使用String类中的静态方法
static String valueOf(int i)
String s = String.valueOf(100);
【b】字符串转换为基本数据类型
parseInt()
int i = Integer.parseInt(“a”);//错误写法,只能是整数类型
数字格式化异常,同时【注意】parseInt(String s) 注意Character 没有parseChar()方法;
11、Collection接口 util包
数组的长度固定,集合长度是可变的
【注意】数组可以存储基本数据类型,也可以存储对象,但集合只能存储对象;
【1】
List接口:vetor集合 ArrayList集合 LinkedList集合
1、有序集合
2、允许存储重复的元素
3、有索引,包含一些带索引的方法
【2】
Set接口:HashSet集合 LinkedHashSet集合–同时LinkedHashSet集合是HashSet集合的子类
1、不允许存储重复的元素
2、没有索引,不包含带索引的方法
3、HashSet集合是无序的集合,LikedHashSet集合是有序的集合
【3】Collection接口–单列集合–List接口 Set接口–》定义的是所有单列集合中共性的方法,所有的集合都可以使用,所以不包含带索引的方法;
【4】顶层接口或抽象类中共性的方法,所有的子类都可以使用,但是顶层接口或抽象类,无法直接创建对象进行使用的,需要使用底层的子类创建对象进行使用
Collection<String> coll = new ArrayList<>();//多态的写法
coll.add()--返回boolean
coll.remove()--返回boolean
--有相同元素,只会删除第一个
--集合中存在元素,删除元素,返回true
--集合中不存在元素,删除失败,返回false,可以进行判断有无元素
coll.contains()--是否包含给定的元素
coll.isEmpty();集合中是否为空
coll.size();集合的长度
coll.toArray() ---返回Object类型的数组
coll.clear()---清空集合中的元素,不是删除集合
12、Iterator迭代器:Collection集合元素通用的获取方式 【util包】
同时注意----迭代器的泛型跟着集合走
hasNext()
next()
【1】Iterator是一个接口,不能直接创建对象使用,需要使用Iterator接口的实现类对象;
通过Collection接口中有一个方法,iterator(),这个方法返回的就是迭代器的实现类的对象Iterator iterator()
1、使用集合中的方法iterator()、获取迭代器的实现类对象,使用Iterator接口接收实现类–多态
2、hasNext()和next()
while(it.hasNext){//判断是否到达集合的末尾,判断集合中是否还有元素
String s = it.next();1、取出当前指针指向的元素,赋值给s
//2、会把指针向后移动一位
}没有元素将会抛出NoSuchElementException
【2】迭代器的并发修改异常,在使用迭代器过程中,修改集合长度,添加元素、删除元素,就会抛出并发修改异常;
【a】解决方法:
1、在迭代过程中,不对集合的长度进行修改
2、Iterator接口有一个子接口ListIterator接口,只有【List接口】下面的集合可以使用,ListIterator接口中定义了add和remove方法,如果使用ListIterator接口中的add和remove方法对集合添加或删除元素,那么迭代
器就不会抛出异常了;
13、增强for foreach
底层使用的也是迭代器,JDK1.5之后出现的新特性
【Tips】Collection接口 extends Iterable接口,所有的单列集合都可以使用增强for循环遍历
格式:
for(集合/数组的数据类型 变量名:集合名/数组名){
sout(变量名);
}
弊端:没有索引,不能操作容器里面的元素,只是对其变量进行赋值遍历,原来的容器元素没有改变;
14、泛型:是一种未知的数据类型,不知道使用什么类型,可以使用泛型
【1】Generic泛型
【a】集合不使用泛型,默认的数据类型可以任意存储,Object类型
例:
ArrayList list = new ArrayList();//不使用泛型 默认就是Object类型
【b】集合使用泛型 存储数据是什么类型,取出就是什么类型,同时把运行时期的异常,提升到编译时期的异常,写代码的时候会报错
【2】泛型的定义
【a】自定义泛型的类
GenericClass<E>
public class GenericClass<E>{
private E name;
public E getName(){
return name;
}
public void setName(E name){
this.name = name;
}
}
【b】自定义含有泛型的方法
修饰符<泛型>返回值类型 方法名(参数列表(泛型)){}
—》含有泛型的方法,在调用方法的时候确定泛型的数据类型,根据传递什么类型,就是什么类型的泛型
public <M>void method01(M m){
System.out.println(m);
}
public static <S>void method01(S s){//静态方法类名调用
System.out.println(s);
}
【c】自定义含有泛型的接口
1、定义接口的实现方式,并且直接指定接口的泛型
interface GenericInterface<I>{
void method(I i);
}
public class GenericInterfaceImpl implements GenericInterface<String>{
public void method(String s){
System.out.println(s);
}
}
2、接口使用什么泛型,实现类就使用什么泛型,类就跟着接口走,创建一个实现类对象,使用什么泛型,那么泛型就什么类型
【3】泛型的通配符?–代表任意的数据类型使用方式,不能创建对象使用,只能作为方法的参数使用【泛型没有继承概念的】