Week04手写笔记

本周内容

day 14

1.多态的经典题
1.1 孔子装爹–经典的多态的成员访问特点
向上转型		Fu fu = new Zi()
成员变量:编译看左,运行看左
成员方法:编译看左,运行看右
访问子类的的特有方法 :向下转型
		Zi zi = (Zi) fu ;
1.2 台灯
设计一个台灯类(Lamp)其中台灯有灯泡类(Buble)这个属性,
还有开灯(on)这个方法。设计一个灯泡类(Buble),
灯泡类有发亮的方法,其中有红灯泡类(RedBuble)和绿灯泡类(GreenBuble)
他们都继承灯泡类(Buble)一个发亮的方法,请设计出一段代码可以使台灯开启灯泡发亮
红灯泡发红光,绿灯泡发绿光!(多态)
public class Lamp{
	Buble buble ;	//灯泡类
	public void on(Buble buble){
	buble.shine();
	}
}
public class Buble {

    //定义一个发亮的方法
    public void shine(){
        System.out.println("灯泡可以发亮了...") ;
    }
}
public class RedBuble extends Buble {
    @Override
    public void shine() {
        super.shine();
        System.out.println("红灯泡发红光");
    }
}
public class GreenBuble extends Buble{
    @Override
    public void shine() {
        super.shine();
        System.out.println("绿灯泡发绿光");
    }
}
public class LampTest{

    public static void main(String[] args) {
    	Lamp lamp = new Lamp() ;
        Buble buble = new RedBuble();
       Lamp.on(buble);
         Buble buble1 = new GreenBuble();
        Lamp.on(buble1);
    }
}
1.3 猫狗的多态案例
定义一个动物类,里面有一个方法voice(),
		定义一个类Cat,实现voice方法
		然后增加一种新的动物类型:Pig(猪),实现voice()方法。
		定义一个Dog类,实现voice方法
		定义一个Store(宠物店)类的getInstance方法:
		如果传入的参数是字符串dog,则返回一个Dog对象;
		如果传入pig,则返回一个Pig对象;否则,返回一个Cat对象。
		
		提示:字符串进行判断 通过equals(字符串)方法
public class Animal {
    public void voice(){
        System.out.println("voice方法");
}
}
public class Dog extends Animal {
    @Override
    public void voice() {
        System.out.println("汪汪");
    }
}
public class Pig extends Animal{
    @Override
    public void voice() {
        System.out.println("哼哼");
    }
}
public class Cat extends Animal{
    @Override
    public void voice() {
        System.out.println("喵喵");
    }
}
public class  Store  extends Animal{
    public Animal getInstance(String name){
        if(name.equals(dog)){
            return new Dog()  ;
        }else if(name.equals(name)){
            return new Pig();
        }else{
            return new Cat();
        }
    }
}
public class AnimalTest(){
	public static void main(String[] args){
			Stroe store = new Store();
			Animal animal = store.getInstanc("dog");
			animal.voice();
			animal = store.getInstanc("pig");
			animal.voice();
	}
}
2. 抽象类和接口
2.1 什么是抽象类
定义:和之前定义成员方法一样,只是方法没有方法体而已,没有{}!
		权限修饰符  abstract 返回值类型 方法名(参数列表) ;
	抽象类中,不一定有抽象方法,也可以是非抽象方法;但是有抽象方法的类一定是抽象类;
	抽象类的本质:强制子类必须做的事情,重写抽象类的所有抽象方法
	重写方法的快捷键:
		在父类上----alt+enter,选择implements methons--重写方法
2.2 抽象类的特点
1)抽象类不能实例化,就是不能new对象
	1.抽象类的注意事项:抽象类不能实例化,那么需要具体的子类进行具体化
	2.抽象类的实例化--通过抽象类多态,父类引用子类对象,有最具体的子类
	3.子类的权限范围不能低于父类的权限范围,尽量保证访问权限足够大
2.2.1 抽象类的本质
强制子类重写抽象类中的所有抽象方法;
2.2.2 抽象类的成员特点
1.成员变量
		1)可以是变量,也可以是自定义常量final
2.成员方法
		1)可以是抽象方法,也可以非抽象方法
3.构造方法
		1)子类继承父类,存在继承关系,分层初始化
注意:如果一个抽象类中没有抽象方法,那么把这个类定义为抽象类的意义何在?
答:就是不想让外界类直接new对象,肯定是有具体的子类存在
		
2.2.3 abstract不能和哪些关键字使用
abstract修饰成员方法不能与哪些关键字共用
1.private
2.final
3.static
标准格式:		public abstact 返回值类型 方法名(参数列表)
2.3 猫狗案例—加入抽象的概念
public class Animal {    public void voice(){};}
2.4 什么是接口
宏观角度:事物能够实现的扩展的额外功能微观角度:就是一种规范,能够实现接口中的额外功能,那么就说明当前这个事物具备这个功能接口(类)的表示:			关键字:interface 接口名{}   		接口名遵循大驼峰命名法
2.5 接口的特点
1)接口中的方法只能是抽象方法,不能有方法体2)接口类不能实体化3)接口的实例化是通过接口多态
2.6 接口的子实现类和接口的关系--------implements 实现关系
一般接口的子实现类名:接口名+Implinplement实现关系		class 子实现类名 implements 接口1,接口2...如果当前子实现类是一个抽象类,一定会存在抽象类的子类,否则借口多态,子实现类new不了,所以当前抽象类一定有具体的子类		
2.6.1 案例
interface Jump{//    public void jump(){ //接口的方法只能是抽象方法    }   public abstract void jump() ;//(public abstract可以隐藏)}interface  ComplateCal{//做计算的接口    public abstract  void cal() ;}class Dog{    public void lookDoor(){        System.out.println("狗可以看门");    }}//跳高高它是狗,然后局部额外的功能,跳高class JumpDog extends Dog  implements Jump,ComplateCal{ //继承一个类的同时,可以实现多个接口    @Override    public void jump() {        System.out.println("狗可以跳高了...");    }    @Override    public void cal() {        System.out.println("狗可以做计算了...");    }}//测试类public class InterfaceDemo {    public static void main(String[] args) {        //创建接口对象       // Jump jump = new Jump () ;//接口不能实例化,        //如何实例化呢:接口多态---提供接口的子实现类        Jump jump = new JumpDog() ;//接口类型---->子实现类对象 (接口类型)        jump.jump() ;        //向下转型        JumpDog jumpDog  = (JumpDog) jump;        jumpDog.lookDoor() ;        ComplateCal cc = new JumpDog() ;//接口多态        cc.cal() ;    }}
2.6.2 关系的区别
类与类的关系:继承关系,只能支持单继承,不支持多继承,但是可以多层继承类与接口的关系:实现关系,一个类在继承另一个类的同时,可以实现多个接口		class 子实现类名 父类名 implements 接口1,接口2...接口与接口的关系		继承关系:可以实现多继承,也可以多层继承					Interface 子实现类 extends 接口1,接口2...接口与抽象类有什么关系:1.成员关系的区别2.关系的区别3.设计理念的关系
2.6.3 接口的成员特点
1.成员变量		接口多态:编译看左,运行看左		成员变量只能是常量,存在默认修饰符public static final,可以省略不写2.构造方法: 接口中没有构造方法3.成员方法		只能是抽象方法
2.7 引用类型是实际参数,引用类型作为返回值,怎么操作?
形参问题:方法的形式参数传递是基本数据类型和引用数据类型		基本数据类型传递数据值		引用数据类型传递空间地址值	形式参数是引用类型,实际参数需要传递实际参数,就是形式参数类型的空间地址值1.如果形参是具体类	1)第一步:创建工具类对象	2)调用工具类的有返回值类型方法	3)创建具体类的对象	4)传入工具类2.如果形参是抽象类型	父类引用指向子类对象	Fu fu = new Zi()	传入fu3.如果形参是接口		创建子实现类的对象		接口名 变量 = new 子实现类名();返回值是引用类型问题:1.返回值是具体类----返回当前类的对象		public Student method(){		Student student = new Student();		return student ;		}2.如果返回值类型是抽象类	创建子类对象,返回子类对象3.如果返回值类是接口	创建接口的子实现类,创建子类对象,返回子类对象
3. 内部类()不做重点,了解–属于"设计层面"
定义:一个类A中定义一个类B,B称为A的内部类,A称为B的外部类
3.1 成员内部类和局部内部类
成员内部类:在外部类的成员位置定义的类;局部内部类:在外部类的成员方法位置定义的类;
3.2 内部类的应用场景
3.3 成员内部类的访问特点
1.成员内部类的成员可以访问外部类的成员变量包括私有;2.外部类的成员方法如何调用成员内部类的方法?		1)创建成员内部类的对象去访问内部类的方法;		间接方法		2)就是将外部类的成员内部类--当做是外部类的成员	直接访问			前提条件:当前的成员内部类是非静态的的			外部类名.内部类名 对象名=new 外部类对象.new 内部类对象 ;					对象名.内部类方法名		public class StaticDemo {    private int num = 10 ;    int num2 = 20 ;    public class Inner{        public void show(){            System.out.println(num);        }    }    public void method(){        Inner inner = new Inner();        inner.show();        }    }	    public class InnerClassDemo {    public static void main(String[] args) {//测试类        Outer outer = new Outer() ;		//方式一:间接访问        outer.method();        system.out.println("--------------------");方式二:直接访问     Outer.Inner s = new Outer().new Inner();//外部类名.内部类名 对象名=new 外部类对象.new 内部类对象 ;     			s.show();			//对象名.内部类方法名       }}3.如果成员内部类是静态的,那么只能访问外部类的静态成员变量,与成员内部类的成员方法是否静态无关	成员外部类的成员方法访问静态的成员内部类的成员方法,那么将成员内部类看做成员外部类的静态成员,				1)外部类名.内部类名 对象名=new 外部类名.内部类名();//不推荐				2)外部类名.内部类名.方法名class  Outer3{//外部类    public int num = 10 ;    public static int num2 = 20 ;     static class Inner3{        public void show(){         System.out.println(num);        System.out.println(num2);        }        public static void show2(){            System.out.println(num2) ;        }    }}//测试类public class InnerClassDemo3 {    public static void main(String[] args) {        //外部类名.内部类名 对象名 = new 外部类名.内部类对象() ;        Outer3.Inner3 oi = new Outer3.Inner3();        oi.show();        oi.show2() ; //不推荐,不出来,得自己补全,因为show2()静态方法        System.out.println("-------------------------------");        Outer3.Inner3.show2();方式二,推荐    }}
3.4 局部内部类的访问特点
1.局部内部类也依然可以访问外部类的成员变量,包括私有;2.外部类访问局部内部类的成员方法如何访问?		在成员外部类的成员方法中创建局部内部类的对象.成员内部类成员方法名();		在测试类中,创建外部类的对象.外部类成员方法名.内部类成员方法名();3. 面试题:局部内部类访问局部变量的时候,能访问码?局部变量有什么要求?	局部变量在jdk以及jdk7以上,必须用final修饰局部变量,作为常驻常量,这是因为局部内部类随着类的加载而加载,随着方法的结束而结束,但是我们调用局部内部类的成员方法,需要new对象,所以局部内部类中的局部变量不会立即被GC回收,所以需要在局部内部类中局部变量前加上final	jdk8以及以上版本默认给局部内部类的局部变量修饰final修饰
4.权限修饰的范围
 private:只能在当前类中访问 默认修饰符:只能在同一个包下访问 protect:受保护的-->只能在当前类或者子类中中使用,和包没关系 publc:权限范围足够大 	同一个包下的当前类中这四个修饰符都可以使用 	同一个包下的子类中或者无关类中   private不能被访问 	在不同包下的子类中			private,默认修饰符不能访问 	在不同包下的无关类中			private,默认修饰符,保护修饰符
5. 包;package在开发中的真实含义
在真实的开发环境中,包是需要针对代码分层的;一般都是多级包;每一层都有自己的含义,符合"javaBean"规范javaBean规范:是一种规范,不是技术,com.qf.pojo---存储的是实体类,这个类是具体类classXXX---必须私有化---提供getXXX和setXXX方法
5.1 带包编译和运行
手动方式:	1)创建com.qf文件	2)使用javac先对源文件进行编译	3)将字节码文件放在qf这个把文件夹下,带包名来运行  java 包名.类名自动方式:	1)javac -d.java  它会自动的产生报名的结构以及编译后的字节码文件	2)java 包名.类名不同包下----->需要导包,并且将类的字节码文件放到该文件夹中
6. 常用类 object类
object类:作为超类,所有类的父类	所有的类都默认继承超类;	常用方法:	1)public final  class getClass():表示 获取当前正在运行的Class类对象(字节码文件);	我们运行结果是字节码文件---class类对象			所以返回:class 包名.类名;	
6.1 常用方法 getClass()
public final  class getClass():表示 获取当前正在运行的Class类对象(字节码文件);Class类中,public String getName():获取当前类或者接口的名称,字符串形式----包名.类名--->称为"类的全限定名称                                                	获取字节码文件的方式一:我们运行结果是字节码文件---class类对象			所以返回:class 包名.类名;	方式二:类名.class	public class ObjectDemo {    public static void main(String[] args) {        Student s1= new Student();        Student s2 = new Student();//空间地址值        System.out.println(s1==s2);//false        Class c1 = s1.getClass();//接受返回值        System.out.println(c1);//结果  class com.test2.Student        Class c2 =s2.getClass();//接收返回值        System.out.println(c2);//结果  class com.test2.Student        System.out.println(c1==c2);//ture    }}public class Student extends Object {    public static void main(String[] args) {    }}
6.2 哈希码值 hashCode
public int hashCode():  "一个地址值",不是实际意义的地址值,它是经过底层的哈希算法(hash)算出来的				一般情况下,不同的对象它的哈希码值是不一样的,有些中文除外					 System.out.println(s1.hashCode());//356573597        System.out.println(s2.hashCode());//1735600054        System.out.println("刘宝寿".hashCode());//20946970        System.out.println("王东磊".hashCode());//29076217                                  
6.3 public String toString()
返回对象是字符串表现形式(地址值),返回结果应该是简明扼要,容易读懂的,建议所有子类重写该方法;重写toString方法:idea自动生成alt+ins键----->tostring	没有重写toString之前,返回的是地址值	重写后,返回的是重写后的关系表达式;public class Student {    private String name;    private int age;    public Student() {    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Student(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}public class ObjectDemo {    public static void main(String[] args) {        Student s1 = new Student("高圆圆",42);//Student{name='高圆圆', age=42}        Student s2 = new Student("赵又廷",45);// Student{name='赵又廷', age=45}        System.out.println(s1);//Student{name='高圆圆', age=42}        System.out.println(s2);//Student{name='赵又廷', age=45}    }}
6.3 equals方法
public boolean equals(Object obj):引用该类型比较的是地址值是否相同1.==和equals的区别:		==如果连接的引用类型,比较的是地址值是否相等.			如果连接的是基本数据类型,比较的是数据值是否相等	如果我们不重写Object的equals方法,默认比较的是两个引用类型的地址值是否相同,如果重写了equals方法而且同时重写了hashCode()比较的是成员信息是否相同!			 public boolean equals(Object obj) {                               return (this == obj);                      }					快捷键:alt+enter---eauals and hashCode---->
6.4 clone方法(了解)
protected Object clone():创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。 一般的意图是,对于任何对象x ,本质:就是在复制正在运行的类的对象;	表达式: 	x.clone().equals(x)	首先,如果此对象的类不实现接口Cloneable ,则抛出CloneNotSupportedException 。	CloneNotSupportedException - 如果对象的类不支持Cloneable接口。 覆盖clone方法的子类也可以抛出此异常以指示实例无法克隆。 
7.匿名内部类
定义:没有名字的类,一般很少使用具体类的匿名内部类,在抽象类和接口中使用最多固定格式: new 类名(一般是抽象类名和接口名)(){重写抽象类或者接口的抽象方法}本质:继承该抽象类或者接口的子实现类对象
7.1 匿名内部类在开发中的使用
一般在一个类中的某个局部位置;如果接口或者抽象类中有一个抽象方法,如何调用?			new 类名(){}.抽象方法名如果接口或者抽象类中有多个个抽象方法,如何调用?	给匿名内部类起一个名字  类型 对象名 = new 类名(){};在实际开发中的使用:1)方法的形式参数是一个抽象类,调用方法的时候,作为实际参数传入匿名内部类2)方法的形式参数是一个接口,调用方法的时候,匿名内部类作为接口的子实现类对象传入实际参数;3)方法的返回值如果是一个接口,那么需要接口的子实现类对象;			return 匿名内部类 ;jdk8有一个新特性:拉姆达表达式γ当且仅当接口有且仅有一个抽象方法的时候,那么这个接口可以成为"函数式接口"函数接口名--->实现方法的时候有一个箭头直接可以实现接口的方法	class LoveDemo{	void show(子实现类对象){	()->        System.out.pringln("我爱生活");	}	}
8.重点类 String
String类默认重写ToString方法;什么是String?String 代表字符串,是一个常量,"abc"都被实现为此类的实例,字符串是不变的,他们的值在创建后不能更改;除非重新提供新的字符串;	String str = "abc";-----创建字符串对象的标准格式
8.1 String的构造方法
获取长度:length();*解码过程:String(byte[]bytes);把字节转换为字符串将一部分字节数组转为字符串:String(byte[] bytes, int offset, int length) *将字符数组--->字符串:String(char[] value)String(String original) :初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本concat(String str):拼接字符序列;注:String类型,变量相加:现在常量池开辟空间				常量相加:先拼接,再在常量池中开辟新的空间;
8.2 String的判断功能
public boolean contains(String序列 s):字符串中是否包含指定的字符public boolean endsWith(String suffix):是否以指定的字符串结尾public boolean startsWith(String prefix):是否以指定的字符串开头public boolean isEmpty()判断字符串内容是否空字符,长度为0,就是truepublic boolean equals(Object anObject)-->重写Object                     区分大小写判断字符串内容是否相同public boolean  equalsIgnoreCase((Object anObject)
8.3 String的获取功能
String类的获取功能(都必须掌握)public char charAt(int index)获取指定索引出的字符值 public String concat(String str):拼接功能--->获取新的字符串          最传统的拼接使用+:字符串拼接符号public int indexOf(int ch)返回指定字符第一次出现的字符串内的索引public int indexOf(String str):返回指定字符串中字符串第一次出现索引值public int lastIndexOf(int ch):返回指定字符最后一次出现的索引String substring(int beginIndex) :从指定位置开始默认截取到末尾--->返回一个新的字符串String substring(int beginIndex, int endIndex)  :从指定位置开始截取到指定位置结束               包前,不包后(只能取到endIndex-1处),返回的一个字符串;左闭右开public String[] split(String regex):按照指定的分割符号--拆分成字符串数组				String str = "JavaEE-Python-Php-Go-R-Hadoop-C" ;				String[] strArray = str.split("-");      				  for (int i = 0; i <strArray.length ; i++) {           					 System.out.println(strArray[i]);
8.4 String的转换功能
public char[] toCharArray():将字符串转换为字符数组public byte[] getBytes():将字符串转换成字节数组---使用平台默认字符集编码         String的构造方法---String(byte[] bytes):使用平台默认字符集解码 public String toLowerCase():将字符串转换成小写 public String toUpperCase():将字符串转换成大写			 public static String : String valueOf(int/double/float/char[]/Object i);万能方法:将任何数据类型转换成String类型
8.5 String的其他功能(替换/去除两端空格)
public String replace(char oldChar,char newChar):将指定的字符使用新字符进行替换public String replace(String oldStr,String newStr):替换指定字符串public String trim():去除两端空格
9.StringBuffer
StringBuffer和StringBulide的区别?共同点:就是具有相互间兼容的API(StringBuffer能用的,StringBulide也能用);不同点:StringBuffer:线程安全的类--同步操作--执行效率低	StringBulide:线程不安全的类---不同步操作--执行效率高所以,单线程环境:只考虑效率;----StringBulide多线程环境:先考虑安全,再考虑效率;---StringBuffer		
9.3 StringBuffer的构造方法
 StringBuffer:字符串缓冲区-->里面存储的是可变的字符序列,但是它的类型StringBuffer类型 StringBuffer s = new StringBuffer();返回s返回的是字符序列值; int length():获取字符串缓冲区的长度(里面实际的字符序列的长度); public int capacity():获取缓冲区的容量大小=16(默认缓冲区容量)+字符序列长度	字符串缓冲区默认16个初始容器里(英文字符)
9.2 StringBuffer的获取功能
public StringBuffer append(任何类型数据) :追加功能 			(常用的),返回值是字符串缓冲区本身			在缓冲区中的默认的字符序列后面依次追加public StringBuffer insert(int offset,char c/String str):返回值是字符串缓冲区本身,在指定的位置插入指定的字符或者字符串public StringBuffer deleteCharAt(int index):删除指定索引处的字符,返回字符串缓冲区本身public StringBuffer delete(int start,int end);删除从执行位置开始到指定位置的字符序列,不包括end位置,是end-1处,返回字符串缓冲区本身compareto():按照字典顺序比较{从第一个字符比较,如果不相等,则输出ASSI差,如果字符全部相等,则是字符序列长度之差}String subString(int beginIndex,int endIndex)--->从指定开始截取到指定位置结束endIndex-1出,返回的新的字符串(String类型)
9.3 StringBuffer的反转功能
String sunString(int index,int lastindex):截取功能,包前补包后,返回的是String类型;StringBuffer reverse():反转,返回字符串缓冲区本身
10.String类型和StringBuffer类型转换
10.1 String------>StringBuffer:
方式一;无参构造赋值public class StringBufferDemo1 {    public static void main(String[] args) {        String str = "helloWorld";        StringBuffer s = new StringBuffer();//无参构造        s =s.append(str);//返回的是字符串缓冲区的字符序列,还是他本身        System.out.println(s);        System.out.println("----------------");方式二:有参构造赋值        StringBuffer s2 = new StringBuffer(str);//有参构造赋值        System.out.println(s2);    }}
10.2 StringBuffer---->String
方式一:toString:返回当前对象的字符串	StringBuffer().toString();方式二:	StringBuffer s3 = new StringBuffer("javase");          String string = new String(s3);          System.out.println(string);//String类型的javase
11.Integer类
Integer类定义:Integer是引用类型,nteger类在对象中包装了一个基本类型 int 的值,是int类型和String类型相互转换的桥梁parseXXX(String str)方法:将String类型的数据转变为XXX;Int类型的取值范围:Integer类的静态的自定义常量;public static final int MAX_VALUE ;最大值//2147483647public static final int MIN_VALUE ;最小值//-2147483648
11.1 Integer的构造方法
 1)Integer(int value)--->可以将基本类型数据转换为Integer类型 2)Integer(String s)throws NumberFormatException :将String转换为Integer类型,但是String必须是"数字字符串",否则会出现数字化格式异常; 			1)Integer i = new Integer(100) 			2)Integer integer = new Integer("20") ;
11.2 Integer的方法
jdk5以后,存在新特性--自动拆装箱功能:每一个基本类型都自动装箱为对应的包装类类型!这些包装类型是为了更好地在String类型之间相互转换! 	基本类型会提示为对应的包装类型--->称为"装箱" 	包装类类型会自动降为基本类型--->称为"拆箱"		parseXXX方法(String str)--->xxx基本类型	ParseInt(String str)---->int类型public static String toBinaryString(int i):将十进制数据--->二进制数据的字符串形式public static String toOctalString(int i):将十进制数据--->八进制字符串形式public static String toHexString(int i):将十进制数据---->十六进制数据的字符串形式
11.3 String类型和int类型怎么相互转换
1)String类型转为int类型(基本类型):ParseInt(String str)---->int类型,其他基本类型同理;		public class IntegerDemo2 {    public static void main(String[] args) {        String str = "50" ;        int i = Integer.parseInt(str);        System.out.println(i);//int类型的50    }}2)int类型(基本类型)转为String类型		int x = 100 ;        Integer ii = new Integer(x).toString();        System.out.println(ii);
12.Character类
定义:char类型保证类型构造方法:Character(char value) 包含 char类型的值  Character character = new Character('a') ;转为引用类型a  character的三个判断功能:public static boolean isDigit(char ch):是否数字字符public static boolean isLowerCase(char ch):是否为小写字母字符public static boolean isUpperCase(char ch):是否为大写字母字符  			char[] ch=str.chatAt(int index);:获取字符串的字符  			Character.isDigit(ch):判断是否是数字字符
13. Date类
java.util.Date:表示日期对象,精确到毫秒!Date日期 格式:Thu Jan 13 22:19:23 CST 2022字符串文本格式:"yyyy-mm-dd"
13.1 构造方法(重点)
无参构造方法:Date date = new Date() ;
13.2 String类型日期与java.util.Date类型转换(重点)
注意:	转换的类:DateFormat:日期格式化类:他是抽象类,不能new对象,所以使用它的子类SimpleDateFormat.public final String format(Date date):格式化 Date-->Stringpublic Date parse(String source) throws ParseException:String--Date:解析parse这个方法本身就存在异常,throws ParseException:String:抛出异常,谁用谁抛出;格式化方法:public SimpleDateFormat(String pattern):并且String的日期格式有固定模板yyyy-MM-dd	public class Test {    public static void main(String[] args) throws ParseException {        //String ---->Date        Date date = new Date();        System.out.println(date);       // 创建转换桥梁SimpleDateFormat        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");        //子类SimpleDateFormat继承父类DateFormatd的方法        String format = s.format(date);//Thu Jan 13 22:42:11 CST 2022        System.out.println(format);//2022-01-13        System.out.println("--------------------------------------------");        //Date --------->String        String str = "1995-9-22";        //创建转换桥梁SimpleDateFormat,如果如果String类型的格式        // 和SimpleDate这里面的模式不一致的话,就出现解析异常        SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");        Date parse = s2.parse(str);//调用parse方法本身就有异常;谁调用谁处理,否则编译报错        //理--throws 继续抛出在main方法上,或者捕获try...catch(开发中业务层代码处理异常捕获)        System.out.println(parse);//Fri Sep 22 00:00:00 CST 1995    }}
使用工具类:public class DateDemo2 {    private  DateDemo2(){};    //String----Date    public static Date string2Date(String source,String pattern) throws ParseException {        return new SimpleDateFormat(pattern).parse(source);    //Date--->String    }    public static String date2String(String pattern,Date date){        return  new SimpleDateFormat(pattern).format(date);    }}class test{    public static void main(String[] args) throws ParseException {        String str = "1995-09-22";        Date date1 = DateDemo2.string2Date(str, "yyyy-MM-dd");        System.out.println(date1);        Date date = new Date();        String string = DateDemo2.date2String("yyyy-MM-dd", date);        System.out.println(string);    }}
14. System类
14.1 System的类字段(成员变量)
1.public static final InputStream int:标准输入流public static final PrintStream out ; 标准输出流public static final PrintStream err ;标准的错误输出流
14.2 System的功能
 public static void exit(int status):参数为0,表示正常终止jvm
15.Math类
16.Random类
17 Scanner类
判断功能:public boolean hasNextXXX(){}:XXX就是对应的数据类型,判断下一个录入的数据是否为XXX类型 if(sc.hasNextInt()){            int num = sc.nextInt() ;//录入int类型,判断录入数据是否为int类型            System.out.println("我录入的是"+num);        }else if(sc.hasNextLine()){//录入String类型,判断录入数据是否为String类型            String line = sc.nextLine() ;            System.out.println("我录入的是"+line);        }else{            System.out.println("其他类型..");        }键盘录入的细节:先录入int,在录入String,有问题	就是因为在录入数据的时候,接受数据--->按"回车键",下一个录入String,但是回车符号就是换行,当空字符进去了,所以第二个数没有录入就结束了	办法1:官方用法 String nextLine()	录入指定的字符串内容	办法2:另一种办法:String next();//录入String类型	办法3:再次创建键盘录入对象,使用String nextLine();String类型是使用最多的----以后再输入有int类型的输入,可以都是用String接受(String nextLine())-->然后将String强转为Integer--Int(前提录入的数字字符串.比如"5")
18.对象数组
定义:能够存储对象的数组;	Student s = new Student[5];
19.集合和数组的区别
1.长度的区别			集合的长度是可变的!			数组的长度是固定的!2.存储数据类型的区别			数组可以存储基本数据类型,也可以存储引用数据类型			集合只能存储引用数据类型--->通过泛型<E>--Element元素(泛型约定集合中的数据类型)3.存储元素的区别			数组只能存储同一种数据类型的元素			集合如果没有泛型的约定,他可以存储任意的引用类型元素4.什么是泛型?	就是集合对象在创建的时候,就已经明确了存储的类型的限定		格式: <E>--Elment--存储的引用数据类型的元素;5.泛型的好处	1)提高了程序安全性,不会出现类型转换问题	2)避免了强制类型转换	3)将运行时期异常提前到编译时期
20. 集合的整体框架体系
父接口:Collection<E>:是所有集合的根接口,存储不唯一,无序的元素		子接口:1)List<E>:存储不唯一,有序的元素2)Set<E>:存储唯一,无序的元素	
21.collection以及他的子实现类
Collectio集合的功能:添加:boolean add(E--Object(任意类型元素) e)判断: 	 boolean contains(Object o):是否包含指定的元素  	 boolean equals(Object o):比较	 boolean isEmpty():判断集合是否为空删除:	 void clear():删除所有元素	 boolean remove(Object o):删除集合中指定的元素获取:	int size() 获取集合元素数	Iterator<E> iterator() :迭代器(理解原理)dk5以后提供了新特性增强for循环语句代替迭代器,写法更简单!		Object[] toArray():传统 方式集合转换成对象数组--->遍历高级功能:带all的功能	boolean addAll(Collection c)添加一个集合中的所有元素    boolean containsAll(Collection c):包括一个集合中元素// 包含一个集合中所有元素才是包含    boolean removeAll(Collection c):删除集合中的包含的元素//只要删除的是包含的其中一个元素,就算删除            boolean retainAll(Collection c):获取两个集合中交集元素,返回值boolean表达的意思什么? A集合对B集合求交集,1)如果没有交集元素,那么A集合内容就是[](-->存储交集的元素 没有交集) * 如果有交集,交集的元素是存在A集合中,返回值是看A集合中的元素内容是否发生变化 * 如果有变化--->true * 如果没有变化--->false
21.1 迭代器的使用和原理
Iterator<E> iterator() :迭代器(理解原理)dk5以后提供了新特性增强for循环语句代替迭代器,写法更简单!	方法:E(Object任意类型) next():获取下一个遍历的元素		 boolean(object) hasnext():是否含有下一个元素迭代器的原理:迭代器本身就是被ArrayList集合的内部类Iter实现类的hasNext()和next()方法public class test1 {    public static void main(String[] args) {        Collection<Student> c = new ArrayList<>();//创建collection对象含泛型        Student s = new Student("高圆圆",42);        Student s1 = new Student("赵又廷",45);        Student s2 = new Student("黄海波",42);        //添加到集合中        c.add(s);        c.add(s1);        c.add(s2);        Iterator<Student> it = c.iterator();//获取迭代器        //遍历集合        while(it.hasNext()){            Student student = it.next();            System.out.println(student.getName()+"-----"+student.getAge());        }    }}
22. List集合
定义:是collection的子接口特点:有序,不唯一的集合特有功能:get(int index):获取指定位置处的元素		list.size()获取集合的元素数量				 for(int x = 0 ; x <list.size() ; x ++){            String s = list.get(x);            System.out.println(s);            	加强for遍历: for(数据类型 变量名:集合对象/数组对象){变量名 }	public class test1 {    public static void main(String[] args) {        ArrayList<Student> c = new ArrayList<>();        Student s = new Student("高圆圆", 42);        Student s1 = new Student("赵又廷", 45);        Student s2 = new Student("黄海波", 42);        //添加到集合中        c.add(s);        c.add(s1);        c.add(s2);        Iterator<Student> iterator = c.iterator();//获取iterator迭代器        //遍历for(数据类型 变量名:集合对象/数组对象){        for(Student stu:c){            System.out.println(stu);        }    }}
22.1 list集合的三个子实现类的特点
ArrayList:大小可变数组的实现。(查询快,增删慢。)此实现不是同步的(多线程问题)。LinkedList:list接口的链表实现。此实现不是同步的。查询慢,增删快,里边包含了大量操作首尾元素的方法Vector:可以实现可增长的对象数组。此实现是同步的。JDK1.0最早期的集合,底层也是数组,但是是单线程的,速度比较慢。
22.2 list集合特有的遍历方式:列表迭代器ListIteator
ListIterator:接口:列表迭代器正向遍历: boolean hasNext():判断是有更多下一个元素可以迭代(遍历) 	 E next()获取下一个可以遍历元素反向遍历:	 boolean hasPrevious():判断是否有更多的上一个元素可以迭代(遍历)	 E previous():获取上一个可以遍历的元素	
22.3 关于并发修改异常出现的原因
就是在描述使用迭代器去遍历元素的时候,不能使用元素去操作元素,否则就会出现并发修改异常:ConcurrentModificationException解决方案:1)使用迭代器去遍历元素,迭代器添加元素---使用列表迭代器ListIteator遍历且添加元素添加位置:列表迭代器在指定的位置后面添加元素 while (it.hasNext()) {            //获取元素            String s = it.next();//ConcurrentModificationException            //判断            if ("world".equals(s)) {                //给集合中新添加一个元素"javaee"                it.add("javaee");            }        }        System.out.println(list);//[hello, world, javaee, java]2>使用list的特有遍历功能E get(int index)+size()de 方式遍历,在集合最后添加		 for(int x = 0 ; x<list.size();x++){          String s = list.get(x);          if("world".equals(s)){              list.add("javaee");          }      }        System.out.println(list);3>加强for就是简化的顺序迭代器 for(String s : list){          if("world".equals(s)){              list.add("javaee");          }      }        System.out.println(list);//ConcurrentModificationException
22.4 选择排序
核心思想:从0位开始,依次和所有元素比较大小,最小值放前面2)比较的次数=数组长度-1public class ArrayList {    public static void main(String[] args) {        int[] arr = {11, 25, 15, 26, 45};        System.out.println("排序前");        printArray(arr);        System.out.println("排序后");       select(arr);       printArray(arr);    }public  static  void select(int[]arr){        for(int x = 0;x<arr.length-1;x++){    for(int y = x+1; y<arr .length;y++){        if(arr[x]>arr[y]){            int temp = arr[x];            arr[x]=arr[y];            arr[y]=temp;        }    }}}    public static void printArray(int[] array) {        StringBuffer s = new StringBuffer();        s.append("[");        for(int x=0;x<array.length;x++){            if(x==array.length-1){                s.append(array[x]);            }else{                s.append(array[x]+",");            }        }        s.append("]");        System.out.println(s);    }}
22.4 List集合的去重问题
方式一:建立一个空集合思想,遍历以前的集合,如果以前集合中的元素在新集合中不包含,那么添加到新集合中;public class ListDemo {    public static void main(String[] args) {        List<String> list = new ArrayList<>();        list.add("hello");        list.add("world");        list.add("java");        list.add("world");        list.add("hello");        List<String> list2 = new ArrayList<>();        for (String s : list) {            if(!list2.contains(s)){                list2.add(s);            }        }        System.out.println(list2);    }}方式二:使用选择排序的核心思想,使用前面角标的元素和后面元素依次比较,如果重复,则把后边的重复元素删掉;	此时用到list的另一个功能:public objet <>remove(int index)	public class ListDemo3 {    public static void main(String[] args) {        List<String> list = new ArrayList<>() ;        //模拟添加一些重复性的字符串数据        list.add("hello") ;        list.add("world") ;        list.add("hello") ;        list.add("hello") ;        list.add("java") ;        list.add("java") ;        list.add("world") ;        list.add("android") ;        list.add("android") ;        list.add("JavaEE") ;        list.add("JavaEE") ;        list.add("hello") ;        list.add("Python") ;        list.add("Python") ;        //选择排序的代码        for(int x = 0 ;x < list.size() -1; x++){//比较次数            for(int y = x +1 ; y < list.size() ; y ++){//中间元素比较                //如果后面的元素和前面的元素重复了,将后面角标对应的元素删除,角标--                if(list.get(y).equals(list.get(x))){                    //将后面的元素 删除                    list.remove(y) ;                    y--;                }            }        }        //遍历集合        for(String s:list){            System.out.println(s);        }    }}  
23.set集合以及他的子实现类
定义:不包含重复元素的集合(唯一,无序);最多出现一个空元素特点:元素唯一,但是无序特有功能:default Spliterator<E> spliterator():

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值