以前笔记:String 是final类型不可被继承底层是char类型数组常量 线程安全:synchronized 这个保证线程间隔离 String:不可被改变 真正意义上的安全 在字符串频繁拼接的情况下 则速度非常慢 StringBuffer:线程安全的,速度慢 StringBuilder:线程不安全的,速度快 绝对路径和相对路径: 绝对路径一般从根目录开始,写全路径 相对路径一般从当前目录开始 String: 是final类型,不可被继承,底层是char类型数组常量,不可更改 而对String对象重新赋值的过程,其实是新建对象的过程 如果需要对String对象频繁赋值, 则不推荐使用String
FileInputStream读文件的流程: 先把文件装入输入流中 从流中读数据 最好转成字符串 最后关闭输入流 1FileInputStream对象和String结果对象申明 2然后创建FileInputStream对象(文件路径或File对象) 3读单字节或整个读到byte数组中 4最后转成字符串 5关闭FileInputStream流 6返回结果字符串
FileOutputStream写文件的路径 把目标文件装入输出流 把 字符串转为byte数组写入流中关闭输出流 1File对象装载文件路径 2判断文件父级目录是否存在,不存在则创建 3声明FileOutputStream对象 4创建FileOutputStream对象(File对象,是否追加) 5把要写的字符串转成byte数组,并写入输出流 6关FileOutputStream流
1什么是io流如何 分类 io流是对文件读取和写入的操作类 分输入流InputStream reader和输出流OutputStream Writer 按读取的单元: 字节流InputStream OutputStream 字符流:Reader Writer 4io流读写过程中有可能的异常是什么 IOException 文件找不到包括目录 文件FilenotFounfExeption
中文字符也是一个char 但是是3个byte 所以用read来操作中文 流的分类: 普通流分类: 流向: 读取数据单元 转换流:InputStreamreader,OutputStreamWriter 高级流:不能直接作用于文件 要装载普通流或者和转换流 缓冲流: 二进制流: 对象流: 写对象: 1,要求对象的类型必须是可序列化类型(实现了Serializabnle接口) 2先有写入的目标 3创建对象流,把输出流装入 4调用对象流的writeObject()把对象装入 5关闭资源 读对象: 1先有输入的源文件流 2创建对象输入流装入文件输入流 3调用对象流的readObject()读取到对象 4关闭资源 保存一个对象的流程: 1创建类必须要实现serializable接口 2创建对象并写入到文件 3把工程打包 4把jar包和文件发给对应的人 5导入别人的ar包读取接收到的文件
1如何复制一个图片 字节流读取图片二进制信息 再用字节流写出 2保存一个对象的流程 1,要求对象的类型必须是可序列化类型(实现了Serializabnle接口) 2先有写入的目标FileOutPutStream 3创建对象流,把输出流装入 4调用对象流的writeObject()把对象装入 5关闭资源 3高级流的特点 不能直接作用于文件和文件路径 要装载普通流或转换流 4转换流是由什么转换成到什么 转换流是由字节转字符 InputStreamReader OuputStreamWriter 线程的创建方式: 继承Thread类 实现RUnnable接口 实现Callabl接口 创建 就绪 运行 阻塞 死亡是现成的五个状态
1创建线程有哪几种方式 1继承Thread类 2 执行Runnable接口3 执行Callable接口 2start()和run()方法的区别 start启动线程 run线程启动时调用 run只在主线程运行一次 3什么是线程安全 多个线程操作同一共享数据时 导致数据不安全 当一个线程在访问时其他不能访问 synchronized套住 4线程和进程的关系 线程必须存在于进程中 一个进程可以有好多线程 获取类对象的三种方式: 1类型.class 2Class,forName("类型的全路径名“)就是包名加类名 3对象.getClass()
1什么是反射 有什么作用 反射实在运行过程中 可以观察和修改类或者类的对象的属性和行为的特性 2获取类对象的三种方式 1类型.class 2Class,forName("类型的全路径名“)就是包名加类名 3对象.getClass() 3反射对对象属性赋值的三种方式 1Constructor() 2Field() 3Method() Collection:无序,可重复的一组数据 List:有序,可重复(有序指的是插入顺序 重要) 实现类:ArrayList:底层是可变数组 遍历元素更快(找到) 改变也快 LinkedList:底层是双向链表 插入快删除快 Set:无序,不可重复 Map:目的就是实现一一对应(Entry) 实现类:HashMap 1、set中存放的是无序,唯一的数据 2、set不可以通过下标获取对应位置的元素的值,因为无序的特点 3、使用treeset底层的实现是treemap,利用红黑树来进行实现 4、设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode的方法,如果没有,比较的是地址 5、树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话,需要自定义比较器 比较器分类: 内部比较器 定义在元素的类中,通过实现comparable接口来进行实现 外部比较器 定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集合中 注意:外部比较器可以定义成一个工具类,此时所有需要比较的规则如果一致的话,可以复用,而 内部比较器只有在存储当前对象的时候才可以使用 如果两者同时存在,使用外部比较器 当使用比较器的时候,不会调用equals方法 1集合类框架常见接口及其特性 Collection List Set Map 2集合类框架实现类及特点 ArrayList遍历和随机访问快 LingkedList增删快 HashSet HashMap:底层是HashMap 确保唯一性 3迭代器 Iterator itm=a.iterator() while(itm.hasNext) { String b=(Stringitm.Next) sout(b) } 4list he set如何实现元素的增删改查 .add() .remove() .set() contain() get(i) Set只有增删 List都有 其他常用实现类: List接口:Vector:线程安全的list集合 ConcurrentLinkedList:线程安全的链式表 Set接口:LinkHashSet:有顺序的HashSet Map接口:ConcurrentHashMap:线程安全的map 对所有数据分段上锁 HashTable:所有数据都上锁,如果一个线程访问了某段数据,那么其他人都不能访问所有数据
1Map接口的特点: 键值对(Map.Entry<K,V>) 键对应Set的存储结构 值对应collection的存储结构 数据结构:在长度小于8时,是由Node构成的数组 超过8时 转成红黑树储存 当map的长度原来大于8,通过什么方法使得长度小于6的时候就转回到数组 树:每次遍历时,根据当前节点与查找数据的大小,数据量减半 红黑树:没插入一次数据,如果破坏数的平衡,就通过旋转回复平衡 2快速排序的基本逻辑: 第一个为标准位,从前和从后同时与标准位比较,比他小的去前面,比它大的去后面,如此循环 3集合框架的组成部分: Collection接口分为Iterator List Set Map这几个接口 4Collections类的常用方法有哪些,使用前提是什么 遍历Map类 Collections(sort):集合进行升序排列 max()min() compareTo() binarySearch()
枚举:可以认为是类的变种 里面的直接写的值都是该类的公共静态常量,可以用类型.值的方式调用 可以和普通一样定义属性和方法 valueof方法用来将类的枚举类型与字符串类型比较 包装类:对应每个基本数据类型,都有一个包装类型与之对应 目的:可以把基本数据类型转换成对象 也可以把字符串转成相应的基本数据类型 泛型是不可以放基本数据类型 装箱和拆箱:把基本数据类型赋值给包装类型叫装箱 反之叫拆箱 常用的几种取值方法: new Interger(整形) new Integer(字符串) Integer.valueOf(字符串 整形) Integer.pareseInt(字符串)
byte:Byte short:Short int:Integer long:Long float:Float double:Double char:Character boolean:Boolean
Math类常用方法啊介绍 ceil: floot:
1什么是拆箱和装箱 把基本数据类型赋值给包装类型叫装箱 反之叫拆箱 2创建Integer对象的集中方式 new Interger(整形) new Integer(字符串) Integer.valueOf(字符串 整形) Integer.pareseInt(字符串) 3枚举类型和普通class的区别 关键字:enum class 枚举可以认为是类的变种 里面写的都是该类的公共静态常量 break:跳出当前循环 但是不出循环 继续下一次 continue:强制循环提前返回 执行下一次i+1的循环 return:达到条件退出方法
有()一般都是方法 除了if那些后面的括号 类是对象的抽象 对象是类的具体实现 玩返回值的时候关注的重点是过程 储存过程 【public】 访问修饰符类型 可选】void 方法名(){ 代码;} 有返回值得时候关注的重点是结果 函数 【public】 访问修饰符类型 可选】返回值类型方法名(){ 代码;} 方法的调用 无参方法直接用 对象.方法名()即可 有参方法 必须要有返回值类型变量名=对象名。方法名();(调用的同时要接受) 方法之间可以互相调用 同类可以直接调用(一般)
1类和对象的关系:类是对象的抽象 对象是类的具体实现 2类包含什么 定义的步骤是什么 类包含属性 方法 步骤是先申明属性及方法 再定义 public class 类名 3对象的创建几使用的步骤 先创建对象的属性 方法 public class Person{ public String name public String gender public int age
} 4方法的结构 有返回值和无返回值的区别 有返回值要具体写访问类型 无返回值加void 1定义 方法的结构; 访问修饰符 返回类型 方法名([参数列表]); 2什么是构造方法 有什么作用 构建对象默认提供的方法 public(访问修饰符) 类名()没有返回值 对对象进行赋值 构造方法就是构造一些方法以便在接下来的程序中进行使用 作用 给属性赋值方便以后程序地进行 使得代码更加方便 3重载的规则有哪些 同一个类 方法名相同 但参数值或个数类型等不完全相同 返回值不能作为判断方法的依据 4为什么要方法重载 并不会减少代码 多个方法名称可以一样而已 同一种功能方法名相同 方便在调用的时候由参数列表来指定调用 的方法。更加灵活 比较好的编程体验 1定义 方法的结构; 访问修饰符 返回类型 方法名([参数列表]); 2什么是构造方法 有什么作用 构建对象默认提供的方法 public(访问修饰符) 类名()没有返回值 对对象进行赋值 构造方法就是构造一些方法以便在接下来的程序中进行使用 作用 给属性赋值方便以后程序地进行 使得代码更加方便 3重载的规则有哪些 同一个类 方法名相同 但参数值或个数类型等不完全相同 返回值不能作为判断方法的依据 4为什么要方法重载 并不会减少代码 多个方法名称可以一样而已 同一种功能方法名相同 方便在调用的时候由参数列表来指定调用 的方法。更加灵活 比较好的编程体验 方法结构: public 访问修饰符 返回值类型 方法名();里面看i有可无参数列表里面 加代码 有可能有returen 具体的返回值 基本数据类型做参数时,传递的是之,不能出方法的范围 引用数据类型做参数时,传递的时地址,可以影响方法外部 String类型做参数时,基本等同于基本数据类型
1什么是封装 封装就是将属性和方法与隐藏起来 保护起来 2什么是继承 继承是子类得到父类的东西 但是有些private里的不行 3static关键字作用在属性上有什么效果 直接方法加点调用 static属性又称为类变量 就是该类所有对象共享 没有对象 也可以用类名.shuxingmingde 方式调用 4static代码块如何执行 程序第一次访问该类时执行 且只执行一次 如果有多个static 则按顺序执行 5classA{ publicA(){ sout"A计划就绪"} }classBextendA publicB(){ sout“什么是B计划”} public B(sTRING str) sout"B计划就是+str" publicsvm B b=new (“随便”) sout 计划选择成功 什么是B计划不会打印出来 走有参就不走无参了 B计划就是随便 计划选择成功
在有继承关系的前题下 子类的方法满足以下条件: 1方法名相同 2参数列表相同 3返回值类型相同或者时父类返回值类型的子类 4访问修饰符的权限不能小于父类方法(严于) 5抛出的异常不能多于父类 super调用构建对象时必须第一条 其他不用在第一条
多态 抽象类abstract关键字修饰类 抽象类不能被实例化就是不能创建对象 抽象方法: 抽象方法必须在抽象类中 抽象方法没有结构体 子类继承抽象类的时候,必须重写父类的抽象方法 除非这个子类也是抽象类 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
1方法重写的规则: 在有继承关系的前题下 子类的方法满足以下条件: 1方法名相同 2参数列表相同 3返回值类型相同或者是父类返回值类型的子类 4访问修饰符的权限不能小于父类方法(严于) 5抛出的异常不能多于父类 super调用构建对象时必须第一条 其他不用在第一条 2什么是多态: 子类对象引用父类类型 父类类型做参数 父类类型作为返回值 pet p= new dog(); 一个特定类型的变量可以引用不同类型的对象 并且能够自动调用引用对象的方法 响应不同的操作 3向上转型和向下转型的注意点: 在有父子关系 或者说继承关系 子类类型转换成父类类型叫向上转型 即父类类型 对象名=new 子类类型 这时不能使用子类特有的属性和方法 父类类型转换成子类类型叫向下转型 要用instanceof关键字来判断类型 再进行强制类型转换 静态方法又叫工具方法直接类名.使用 实现类必须实现所有方法 除非他是抽象类
接口: 定义接口 使用interface关键字 实现接口使用implements 接口下不能有构造方法 接口可以多实现 即一个类可以实现多个接口用逗号分隔 接口不能被实例化 接口中的所有方法默认都是公共抽象方法 接口的目的是订立一个标准
1什么是接口? interfance 功能的扩展 方法的聚集 一种约定 2抽象类和接口的异同点 异:接口需要实现(implements),但是抽象类需要继承(extends) 一个类可以实现多个接口,但一个类只能继承一个抽象类 抽象类可以有示例方法 接口的属性只能是publc static final类型 抽象类可以定义构造方法 接口不可以有静态方法但抽象类可以有 同: 都是抽象的 都不能被实例化 接口的实现类或者抽象类的子类都只有实现了接口或者抽象类中的方法后才能被实例化。 都包含抽象方法 Throwable Error:错误 无法恢复的 Exception:异常处理之后能正常运行的(1确定会发生异常的情况checked就是提前处理 2不确定:运行期异常就是遇到了再解决) 常见的异常类型: 算数异常:ArithmetaciException 空指针异常:NullpointException 数组越界异常:ArrraysIndexOutOfBoundException 索引越界异常:IndexOutBoundsException 类型转换异常:ClassCastexception 输入类型不匹配:InputMismatchException 输入输出异常:IOException SQL异常:SQLException 非法参数异常:IllegalArgumentException 数字格式化异常:NumberFormatException 未找到类的异常ClassNotoFoundException
异常处理“: try{ 有可能发生问题的代码块 }catch{有可能发生的异常类型 e} finally{必定会运行的代码}(除非强制退出) throw和throws throw:抛出,手动产生异常 throw抛出必须在条件语句内!!! throws:声明该方法未处理的异常 Runttimeexception:不一定要处理 Exception:一定要处理 自定义异常类的过程: 继承某个已知的异常类 有参构造super(message)调用父类的有参构造就行
面向对象:(最长问的面试问题就是这里面的what when where why whom how) 类与对象的关系:类是对象的抽象对象是类的实现 类是由属性和方法组成,他的每一个对象都有对应的属性和方法 方法: 1方法的重载和重写 方法重载:方法名相同 参数列表不同 与其他无关(针对同一个行为的多种表现对应相同方法名的多个方法) 2类方法=static方法 类名.方法()或者对象.方法()调用 封装: 为了保护属性值不被随意修改 私有化属性并提供getter/setter对外接口 继承: 为了少写代码代码重用 继承是多态的基础 extends关键字 默认的跟类是Object java里是单根继承但可传根 方法的重写: 有继承关系()可以是子与爷爷 方法名相同参数列表相同返回值相同或小于父类访问修饰符不能小于父类异常不能多余父类(严于) 构造方法:默认的构造方法都会先走父类无参构造方法 用super指定的构造方法,调用指定的构造方法前也是先走父类的无参构造 多态: 以父类做参数类型的:(父类不仅仅是类型 可以是接口) 父类中的方法如果被子类重写,那么在使用父类类型调用该方法时则看具体的子类类型,决定调用的是哪个重写后的方法 以父类做返回值类型的: 如果只调用父类方法则没有问题 如果需要调用子类特有方法, 则需要向下强制转型 抽象类和接口: abstrac关键字定义抽象类和抽象方法 interface关键字定义接口 implements关键字实现接口 抽象类和接口的异同点: 同:都不能被实例化 都可以有抽象方法 不同:接口的所有方法都默认是public abstract类型 接口的所有属性都默认是public static final类型 抽象类用来被继承 主要的目的是代码重用 只能继承一个类 接口主要用来扩展功能 可以实现多个接口 异常: 异常的分类:Throwable(Error,Exception) Exception(check异常和运行期异常RuntimeExcepton) 异常的处理: try{有可能产生异常的代码} catch{打印堆栈 打印异常信息}(有可能的异常类型 e) finally{最终快,用于关闭资源} 自定义异常:继承已知的异常类 写出有参构造方法 并用super调用父类的有参构造(这一步可以没有) Collection:无序,可重复的一组数据 List:有序,可重复(有序指的是插入顺序 重要) 实现类:ArrayList:底层是可变数组 遍历元素更快(找到) 改变也快 LinkedList:底层是双向链表 插入快删除快 Set:无序,不可重复 Map:目的就是实现一一对应(Entry) 实现类:HashMap 1、set中存放的是无序,唯一的数据 2、set不可以通过下标获取对应位置的元素的值,因为无序的特点 3、使用treeset底层的实现是treemap,利用红黑树来进行实现 4、设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode的方法,如果没有,比较的是地址 5、树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话,需要自定义比较器 比较器分类: 内部比较器 定义在元素的类中,通过实现comparable接口来进行实现 外部比较器 定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集合中 注意:外部比较器可以定义成一个工具类,此时所有需要比较的规则如果一致的话,可以复用,而 内部比较器只有在存储当前对象的时候才可以使用 如果两者同时存在,使用外部比较器 当使用比较器的时候,不会调用equals方法 1集合类框架常见接口及其特性 Collection List Set Map 2集合类框架实现类及特点 ArrayList遍历和随机访问快 LingkedList增删快 HashSet HashMap:底层是HashMap 确保唯一性 3迭代器 Iterator itm=a.iterator() while(itm.hasNext) { String b=(Stringitm.Next) sout(b) } 4list he set如何实现元素的增删改查 .add() .remove() .set() contain() get(i) Set只有增删 List都有 其他常用实现类: List接口:Vector:线程安全的list集合 ConcurrentLinkedList:线程安全的链式表 Set接口:LinkHashSet:有顺序的HashSet Map接口:ConcurrentHashMap:线程安全的map 对所有数据分段上锁 HashTable:所有数据都上锁,如果一个线程访问了某段数据,那么其他人都不能访问所有数据
1Map接口的特点: 键值对(Map.Entry<K,V>) 键对应Set的存储结构 值对应collection的存储结构 数据结构:在长度小于8时,是由Node构成的数组 超过8时 转成红黑树储存 当map的长度原来大于8,通过什么方法使得长度小于6的时候就转回到数组 树:每次遍历时,根据当前节点与查找数据的大小,数据量减半 红黑树:没插入一次数据,如果破坏数的平衡,就通过旋转回复平衡 2快速排序的基本逻辑: 第一个为标准位,从前和从后同时与标准位比较,比他小的去前面,比它大的去后面,如此循环 3集合框架的组成部分: Collection接口分为Iterator List Set Map这几个接口 4Collections类的常用方法有哪些,使用前提是什么 遍历Map类 Collections(sort):集合进行升序排列 max()min() compareTo() binarySearch()
枚举:可以认为是类的变种 里面的直接写的值都是该类的公共静态常量,可以用类型.值的方式调用 可以和普通一样定义属性和方法 valueof方法用来将类的枚举类型与字符串类型比较 包装类:对应每个基本数据类型,都有一个包装类型与之对应 目的:可以把基本数据类型转换成对象 也可以把字符串转成相应的基本数据类型 泛型是不可以放基本数据类型 装箱和拆箱:把基本数据类型赋值给包装类型叫装箱 反之叫拆箱 常用的几种取值方法: new Interger(整形) new Integer(字符串) Integer.valueOf(字符串 整形) Integer.pareseInt(字符串)
byte:Byte short:Short int:Integer long:Long float:Float double:Double char:Character boolean:Boolean
Math类常用方法啊介绍 ceil: floot:
1什么是拆箱和装箱 把基本数据类型赋值给包装类型叫装箱 反之叫拆箱 2创建Integer对象的集中方式 new Interger(整形) new Integer(字符串) Integer.valueOf(字符串 整形) Integer.pareseInt(字符串) 3枚举类型和普通class的区别 关键字:enum class 枚举可以认为是类的变种 里面写的都是该类的公共静态常量
1查询语句的用法 select from join on where group by having(分组后的条件筛选) order by limit (一个参数 两个参数 offset的格式) 2有一张表a 字段有id name price date 想要获取每天的总价格price 按照price降序排列 select sum(price) 总价格 day(date)from a group by day(date) order by sum(price) desc; 3有一张表 字段有 id name age gender 想要分别获取各个年龄段(0——16少年,17-30青年,31-59中年)的男女比例 写出sql select gender ,sum(chile_flag) child,sum(youth_flag) youth , sum(mid_flag) mid, sum(old_flag) old from (select case when age between 0 and 16 then 1 else 0 end child _flag, select case when age between 17 and 30 then 1 else 0 end youth _flag, select case when age between 31 and 59 then 1 else 0 end mid_flag, select case when age between 60 and 120 then 1 else 0 end old _flag, gender from b ) t group by gender 按性别分组 方法2: select count(gender) gender ,flag from (select case when age between a and 16 then 1 else when age between 17 and 30 then 2 else when age between 31 and 59 then 3 else when age between 60 and 120 then 4 else 0 end flag(别名) gender from b ) t group by flag,gender
select a.s_id,a.c_id,a.s_score from score a where (select COUNT(1) from score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2 每门课程分数最高的两个
查看数据库对事物的支持: show variables like ‘event_scheduler’; 设置数据库支持事物: set global event_scheduler=on; 使用事物 关闭自动提交: set autocommit=0; 开启自动提交: set autocommit=1;
set autocommit=0; start trasaction;//begin就可以 开始一个事物,标记事物的起始点 若要取消操作 将事物回滚 rollback update account set cash =cash+500 where name=‘shop’; update account set cash =cash-500 where name=‘customer’ commit; set autocommit=1; 开启自动提交 索引分类和作用 提高查询速度 主键索引 唯一索引 常规索引 全文索引 备份数据SQLyog备份# 退出msyql命令行 mysqldump -uroot -p 数据库名 [表名]>path/m.sql 导入数据库:SQLyog执行脚本 mysql -uroot -p 数据库名< path/m.sql source /path/m.sql mysql命令下执行
确定commit 错了rollbackshow keys from 表 explain select stu_id from 表 expalin 和desc是一样的 where
alter table student add unique key(a); alter table student add index(b); show keys from student;
练习 2: 1 select stu_id, sname,pwd,cname from tb_student a ,tb_course b where pwd%2<>0 and a.sid=b.stu_id; 2 select scores 成绩 ,cname 科目名称 from tb_score a ,tb_course b ,tb_student c where c.sid=b.stu_id,b.cid=a.corse_id and sname=‘梅西’ ; 行转列: select cname 姓名, sum(case course when ‘语文’ then score else 0 end ) as 别名,… from 表group by cname;