java自学笔记

sunian

贡献于2017-02-08

字数:6509 关键词: Java开发

第一、java基础部分 1.1java程序执行过程: 源文件.java-> 1.2重载和重写: -重载:同名函数,参数个数和参数列表不同,与返回值无关 -重写:子类与父类具有相同的方法名,返回类型和参数,则父类方法被重写 1.3面向对象三大特性: 1)继承 2)多态 3)封装 1.4面向对象和面向过程 1.5修饰符应用场景汇总: -权限修饰符 public protected default private 同一类中 ok ok ok ok 同一包中 ok ok ok x 子类中 ok ok x x 不同包中 ok x x x -transient: 瞬态,数据是特有的不是公用的,还不想被序列化,就用这个 1.6>>和>>>区别:>>最高位补1>>>最高位补0,所谓无符号 1.7静态代码块、局部代码块,构造代码块: 局部代码块:存在于方法内 静态代码块:存在于类内方法外。随着类的加载而执行,类加载一次,静 态代码块也只执行一次,用于给类进行初始化 构造代码块:存在于类内方法外,用于对对象初始化,创建几次对象就执 行几次,先于构造函数执行 1.8 final关键字: -final修饰的类不可以被继承 -final修饰的方法不可以被覆盖 -final修饰的变量是一个常量 -内部类只能访问被final修饰的局部变量 1.9异常:Exception体系下除了RuntimeException都需要被声明throws或捕获 try-catch 1.10 异常注意事项: 1).子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法 只能抛出父类的异常或者异常的子类 2).如果父类抛出多个异常,那么子类只能抛出父类异常的子集 简而言之,子类覆盖父类,只能抛出父类的异常或者异常的子集,如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛 1.11线程: -创建线程两种方式: 第一、继承Thread类,覆盖run()方法,将需要多线程的代码份封装到run()方法当中 创建Thread子类,利用start()启动线程 第二、实现Runnable接口,覆盖run()方法,创建Thread类,将实现Runnable接口的子类作为构造函数的参数传递进去,调用start()方法开启线程 -run()方法和start()方法区别:run()任务封装,start()开启线程 -两种创建线程的优缺点: -第一种:有局限性,java的单继承有应用的局限性 -第二种:将线程的任务从线程子类中分离出来,进行了单独的封装。按照面向对象的思想将任务封装成对象。避免了java单继承的局限性 -开启多个线程,在运行时会在栈里也开启多个执行路径,所以有时我们看到main方法出栈或者异常了,其他线程却还在正常执行-深思多线程的安全问题!!! -线程同步: -解决问题:解决多个线程操作共享数据的安全问题 -同步优点:解决了线程安全问题 -同步缺点:相对降低了效率,因为同步外的线程都会判断同步锁 -同步前提:必须有多个线程并使用同一个锁 -同步函数:同步函数的锁是this -同步函数和同步代码块区别: 同步函数的锁是this,同步代码块的锁是任意的对象 静态函数同步的锁是什么?当前对象的字节码文件 -线程间通信:等待唤醒机制 -wait():让线程处于冻结状态 ,被wait()的线程会被存储到线程池中 -notify():唤醒线程池中的一个线程 -notifyAll():唤醒线程池中的所有线程 -JDK1.5新特性: -Lock接口:出现替代了同步代码或者同步函数。将同步的隐士锁操作变成现实锁操作。同时更为灵活。可以一个锁上加上多组监视器 lock():获取锁 unlock():释放锁,并且通常需要定义在finally代码块中 -Condition接口:出现替代了object中的wait notify notifyAll方法,将这些监视器方法单独进行了封装,变成Condition监视器对象,可以与任意锁进行组合 await() signal() signalAll() -wait()和sleep()区别: 第一、wait可以指定时间也可以不指定,sleep必须指定时间 第二、在同步中,对cpu的执行权和锁的处理不同 wait:释放执行权,释放锁 sleep:释放执行权,不释放锁 -interrupt():可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu的执行资格。但是强制动作会发生InterruptedException异常,记得处理 -setDaemon():随着其他线程存在而存在,无论处于什么状态,都会随着其他线程消失而消失 -join():执行此方法的线程释放执行权释放和执行资格,优先其执行 1.12常见对象 -String: -String s="abc"和String s1=new String("abc")区别: 前者和后者“值”相等,但是前者创建一个对象在字符串常量池中,后者是创建两个对象在堆内存中 -Stringbuffer和StringBuilder: -StringBuffer:字符串缓冲区,用于存储数据的容器 -特点: -1、长度可变,初始容量为16 -2、可以存储不同类型数据 -3、最终要转成字符串进行使用 -StringBuilder: 兼容StringBuffer -StringBuffer和StringBuilder区别: StringBuffer线程同步,保证安全,StringBuilder线程不同步,不保证安全 1.13集合 -特点: 1.用于存储对象的容器 2.集合长度是可变的 3.集合中不可以存储基本数据类型值 -迭代器Iterator:取出元素的方式,即迭代器;该对象必须依赖于容器,因为每一个容器的数据结构不同。所以该迭代器对象是在容器中进行内部实现的。对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可,也就是iterator方法。Iterator接口就是对所有的Collection容器进行元素取出的公共接口 -划分: |-Collection: |---List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复 |---Set:元素不能重复 List: -遍历:两种,一种角标,一种迭代器 -Iterator迭代器迭代集合时不允许并发修改,否则引发java.util.ConcurrentModificationException,迭代器的局限性。在在子接口中,有一个ListIterator,可以实现在迭代器迭代过程中完成对元素的增删改查。注意:只有List集合具备该迭代功能 List: |--Vector:内部是数组数据结构,是同步的。增删查询都很慢 |--ArrayList:内不是数组数据结构,是不同步的。替代了Vector。查询速度快 |--LinkedList:内部是链表数据结构,是不同步的;链表特点:增删元素的速度很快 Set:元素不可重复,无序(存取不一致) |--HashSet:内部数据结构是哈希表,是不同步的,无序的 -如何保证该集合的元素唯一性呢? 是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashcode值不相同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。如果为true视为相同元素,不存,如果为false,那么视为不同元素,就进行存储。 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,比如人等,通常都需要覆盖equalshashCode方法。建立对象判断是否相同的依据 |--LinkedHashSet:相比较HashSet是有序的,存取一致 |--TreeSet:有序,指的是按照元素自然顺序对元素进行排序,是不同步的。 判断元素唯一性的方式就是根据比较方法compareTo的返回结果是否是0,是0,就是相同元素,不存,跟hashCode和equals无关 TreeSet对元素排序的 方式一:让元素自身具备比较功能,元素需要实现Comparable接口,覆盖conpareTo方法; 方式二:如果不想按照对象中具备的自然顺序进行排序,或者如果对象中不具备自然顺序。(要么对象不具备比较性,要么比较性不是我们想要的,比如对象不是我们自定义的),则使用方式二: 让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。让集合具备比较性 -如何选择合适的集合? 元素需要唯一吗? |-需要:Set 需要指定顺序吗? |-需要:TreeSet |-不需要:HashSet |-不需要但是需要一个和存储顺序一致的(有序):LinkedHashSet |-不需要:List 需要频繁增删吗? |-需要:LinkedList |-不需要:ArrayList -如何记住每一个容器的结构和所属体系呢? 后缀名是该集合所属体系,前缀命是该集合的数据结构 -看到Array:就要想到数组,想到查询快,有角标 -看到Link:就要想到链表,就要想到增删快 -看到Hash:就要想到哈希表,就要想到唯一性,就要想到需要覆盖hashCode和equals方法 -看到Tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable和Comparator接口 |-Map:(K,V) ,K必须唯一,所以KeySet实则是Set集合 如何取出Map所有数据? |-方式一:通过keySet()方法获取map中所有的键所在的Set集合,再通过Set的迭代器获取到每一个键,再对每一个键通过map集合的get方法获取其对应的值即可 |-方式二:通过Map转换成Set就可以迭代。通过map方法entrySet返回包含该map键和值的映射关系的Set集合,而这个映射关系的类型就是Map.Entry,然后通过Map.Entry的getKey、getValue获取相应值 |-HashTable:内部结构是哈希表,是同步的。不允许null作为键作为值 |-Properties:属性集。用于存储键值对型的配置文件。可以和IO技术相结合。 -特点: 1.该集合中的键和值都是字符串类型 2.集合中的数据可以保存到流中,或者从流中读取 -应用: 通常该集合用于操作以键值对形式存在的配置文件 |-HahsMap:内部结构是哈希表,不是同步得。允许null作为键,null作为值 |-TreeMap:内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。 |-Comparable和Comparator区别: |-Comparable: int compareTo(T o):让类具有比较性,实现此接口,覆盖此方法 |-Comparator:让集合具备比较性 int compare(T o1, T o2) boolean equals(Object obj) -工具:Utilities |-Collection: |-Arrays: 1.14泛型: -好处: 1、将运行时期的问题ClassCastexception转到了编译时期 2、避免了强制转换的麻烦 -<>:什么时候用?当操作的引用数据类型不确定的时候。就使用<>.将要操作的引用数据类型传入即可。其实<>就是一个用于接受具体引用数据的参数范围。 泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。 -泛型的擦除:在运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。为什么擦除呢?为了兼容运行的类加载器 -泛型的补偿:在运行时,通过获取元素的类型进行转换动作。不用使用者再强制转换了。 -当方法静态时,不能访问类上定义的泛型。如果静态方法使用泛型,只能将泛型定义在方法上,泛型放在返回值前面,修饰符后面 -泛型通配符:? -泛型限定上限: 上限::接收Person或Person的子类,上限 下限::接收E类型或者E的父类型,下限 1.15 IO流: 分类: -按照操作数据分为字节流和字符流 -字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。再对这个文字进行操作。简单说:字节流+编码表 -按照数据流向分为输入流和输出流:相对于内存设备而言,将外设数据读入内存中为输入流,将内存中的数据写入到外设中,为输出流 IO体系: |-字节流: |-InputStream |- |-Outputstream: |- |-字符流 |-Reader: |-BufferedReader -readLine() |-LineNumberReader |-Writer |-BufferedWriter -newLine() |-总结: |-流的操作规律: 如何明确开发时到底用哪个对象? 1.明确源和目的: 源:InputStream Reader 目的:OutputStream Writer 2. 源:是纯文本 Reader 否:InputStream 目的:是纯文本 Writer 否: OutputStream 到这里就明白用哪个体系了 3.明确具体的设备: 源设备: 硬盘:File 键盘:System.in 内存:数组 网络:Socket流 目的设备: 硬盘:File 控制台:System.out 内存:数组 网络:Socket流 4.是否需要其他额外功能 1.是否需要高效(缓冲区); 是:就加上buffer 2.需要转换吗? 需要: InputStreamReader OutputStreamWriter |-转换流的应用: 1.源或者目的对应的设备是字节流,但是 却操作的是文本数据,可以使用转换流作为桥梁 2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流,因为FileReader和FileWriter默认的是本地编码表,所以FileWriter其实就是字节流加本地编码表 -操作文件相关File: -其他流对象: -PrintStream: -1.提供了打印方法可以对多种数据类型值进行打印。并保持数据的表示形式 -2.他不抛出IOException -PrintWriter: -SequenceInputStream:序列流,对多个流进行合并 -ObjectInputStream和ObjectOutputStream:操作对象,专用于对象序列化的。但是对象需要实现Serializable接口 -类序列化作用:给类加id号, -RandomAccessFile:不是io体系中的子类。 特点: 1.该对象既能读又能写 2.该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素 3.通过getPoint方法获取指针和seek方法设置指针位置 4.其实该对象就是将字节输入流和输出流进行了封装 5.该对象的源或者目的只能是文件,通过构造函数就可以看出 6.如果文件存在则创建,如果文件不存在则不创建 -PipedInputStream和PipedOutputtream:管道流输入输出可以直接连接,一般集合线程使用 -DataInputStream和DataOutputStream:操作基本数据类型 -ByteArrayInputStream和ByteArrayOutputStream:操作字节数组,源和目的都是内存关闭ByteArrayOutputStream无效,因为未调用底层资源,只是在内存里操作资源 -CharArrayReader和CharArrayWriter:操作字符数组 -StringReader和StringWriter:操作字符串 - 第二、java基础加强 第三、web基础部分 -3.1 Servlet: -生命周期:第一次被访问的时候创建,随着web容器的关闭或者web应用移除容器时销毁 第四、常用框架 -4.1 struts2: -4.2 Spring: -核心部分:IoC控制反转和AOP面向切面编程 -体系结构: -核心容器:Beans Core Context Expression -AOP模块:切面 -Data Access数据访问:JDBC 事务管理

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ]
2 人已下载

下载文档

相关文档