java基础回顾

趁着周末整理了一下java知识点,时间比较仓促,大概梳理了一下易忘点还有整体框架。有的地方难免可能会有错误,欢迎提出。

一 switch 结果返回值
byte short int char
        在JDK1.5 的时候可以是枚举
        在JDK1.7 的时候可以是String
二 内存结构
如果一个String类型的变量相加,那么在堆内存中开辟空间。
            例如: String a = "ac";    //a是一个常量,有常量优化机制,在方法区开辟内存空间。
                  String b = a+"d";    // 此时的a是一个变量,在堆内存中开辟空间。
三 类型参数
如果参数是一个引用数据但非String类型,那么值改变。
如果参数是一个基本数据类型||String类ixng,那么值是不变的
匿名内部类使用局部变量 ,局部变量前面必须加final修饰 为了延长局部变量的声明周期
四 排序
  // 冒泡排序
            for (int i = 0; i < args.length -1 ; i++) {
                for (int j = 0; j < args.length - 1- i ;j++){
                    if (args[j] > args[j+1]) {
                        // 互换
                    }
                }
            }

 //选择排序
            for (int i = 0; i < args.length -1; i++) {
                for (int j = i+1; j < args.length ; j++) {
                    if (args[i]> args[j]) {
                        // 互换
                    }
                }
            }
五 面向对象
三大特征:
        封装
            把属性和实现细节隐藏起来,不让外界直接访问,提供公共的方法访问方式  但private仅仅是封装的表现形式。
        继承
            只能单继承,不能多继承《接口除外》,也是多态的前提
        多态
            父类引用指向子类对象。

抽象类:
        1·有构造方法;
        2·可有非抽象函数,可有抽象函数,但是被abstract修饰,该类也被abstract修饰。
        3.抽象方法必须被子类重写。
        4.不可实例化。
接口:
        1·没有构造方法;
        2·该类中所有的函数都是抽象的。
        3·成员常量 默认被public static final 修饰
          成员方法 默认被public abstract 修饰

abstract 《修饰类和函数》这个关键字不可以和哪些关键字共存
        1.final:因为被final修饰的类不能被继承,被final修饰的方法不能被重写。
        2.private:因为被private修饰的方法不能重写,但是abstract方法要求重写。
        3.static:因为一个方法要是同时被static 和abstract修饰,那么这个方法就可以类名.方法名 调用.
                但是此方法是抽象的,调用也无意义,所以就导致static 和abstract不能共存.

final 修饰符  类,方法,成员常量
       1·被修饰的类不可被继承
       2·被修饰的方法不可被重写
       3·被修饰的常量不可改变

局部变量,成员变量,静态变量区别
       1·生命周期
       2·书写位置
       3·是否有默认初始化值
       4·内存位置
       5,调用方式

一个对象的创建经历7步:
       1:首先想要创建某个类的对象 必须先把类的class文件加载到方法区
       2:写一个引用
       3:遇到new就去堆内存中开辟空间
       4:默认初始化
       5:显示初始化(如果有显示初始化就进行)
       6:执行构造方法, 如果构造方法里面有赋值操作 就进行赋值
       7:把地址值赋值给 引用
六 String.StringBuffer.StringBuilder三者的区别:
 ①.String 引用数据类型,长度不可发生改变。
 ②.StringBuffer 引用数据类型,字符缓冲。长度可发生改变。线程安全,效率比较低。
 ③.StringBuilder 引用数据类类型,带字符的缓冲。是JDK1.5的新特性,拥有同StringBuffer相同的api,但是不同点是该类是线程不安全的
   效率高。
   其实StringBuffer默认重写了String的toString方法。
七 集合框架
 集合分为单列集合和双列集合
   两者最直接的区别:
                    单列集合:在set中,值是唯一的。
                    双列集合:集合对应的key是唯一的。根据key寻找value。
   单列集合--》   获取数据方式:增强for循环,迭代器,集合转数组。

            List <存取数据有序,数据可重复,有索引,可根据索引进行查询,也有特有的List迭代器>
                ArrayList  数组结构  -->查询较快,可直接根据索引直接查询,但是增删慢
                LinkedList 链表结构  -->查询较慢,但是增删快,
                Vector     数组结构  -->线程安全的,效率较低,已被ArrayList替代。
                    获取数据方式:普通for循环,增强for循环,迭代器,集合转数组。


            Set <存取数据无序,数据不可重复>
                HashSet  哈希算法  --> 为保证元素唯一,要重写hashCode方法以及equals方法,只有hashCode值相同才会判断equals,
                                       反之直接添加到集合中。如果equals返回true,则说明集合已存在相同的元素,不再添加.
                                       反之添加到集合中,这样做也是提高了效率。
                          LinkedHashSet 存取有序,数据不可重复。
                ThreeSet 二叉树算法 --> 元素唯一,但可以排序。① 实现Comparable接口,并重写CompareTo()
                                                              ② 使用TreeSet的有参构造方法创建TreeSet对象的时候,
                                                              传入一个比较器 Comparator 进去, TreeSet在添加元素的时候,
                                                              根据比较器的compare()方法的返回值来添加元素。
                     获取数据方式:增强for循环,迭代器,集合转数组。

            注意:List可以通过for循环的方式去遍历集合中的数据,因为它可以根据索引去查值。但是如果要进行增加或者删除的操作,
            不要在循环中进行这系列的操作,因为底层调用的是迭代器,所以在使用迭代器的过程中,不要使用集合增删的方式去改变集
            合,因为迭代器依旧在操作之前的集合,会报修改并发异常。如果非要进行增删操作的话,那么可以用Iterator 也可以用List-
            Iterator 因为他们里面都有remove()如果是添加:只能使用ListIterator 因为只有ListIterator里面有add()。

   双列集合--》
            Map -->  键是保证唯一性
                HashMap 哈希结构  通过哈希算法。 HashSet底层就是通过HashMap的键来完成的
                ThreeMap 二叉树结构  存入和取出的顺序相同,同时键也是通过哈希算法保证元素唯一性的、

               HashMap和Hashtable
                    1:HashMap线程不安全 效率高  1.2出现的
                       Hashtable线程安全的 效率低  1.0出现的
                    2:HashMap可以存null键和者null值
                       Hashtable不可以存储null键或null值
八 关于文件
创建文件 createNewFile()
创建文件夹 mkdir()
创建多级文件夹 mkdirs()
**无论是创建文件还是文件夹如果已经存在的话,就不在创建。返回值为false;
九 IO流 流对象原则:流对象要及时地释放,晚开早关。
  字节流:可以操作任何数据,因为在计算机中任何数据都是以字节的形式进行存储的
                InputStream:
                       FileInputStream:
                            方法:read()返回值类型为int,每次读取是一个字节,读取不到数据返回-1;
                                  为什么读取的是一个byte字节,而返回的是一个int类型的数据;因为二进
                                  制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到
                                  111111111那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不
                                  读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111
                                  会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了
                                  这样可以保证整个数据读完,而结束标记的-1就是int类型
                OutputStream:
                        FileOutputStream:
                                构造方法传入文件时,不存在就重新创建,如果存在了就清空之前的数据,重新写入。
                                如果想在之前的文件里面追加数据内容,那么就使用new FileOutputStream(String pathName,true)这个构造方法

                高效率的复制文件:
                        try {
                             FileInputStream fis = new FileInputStream("a.text");
                             FileOutputStream fos = new FileOutputStream("b.text");
                             int len = 0;
                             byte [] args = new byte [1024 * 8];
                             while ((len = fis.read(args))!= -1){
                                 fos.write(args,0,len); //0表示是从数组的0索引开始 len表示写入数组的0-len长度的数据
                             }
                             fis.close();
                             fos.close();
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        // 使用带缓冲的输入输出流进行数据传输
                        FileInputStream fis = new FileInputStream("a.text");
                        FileOutputStream fos = new FileOutputStream("b.text");
                        BufferedInputStream bis = new BufferedInputStream(fis); // 默认读取1024 * 8 个字节
                        BufferedOutputStream bos = new BufferedOutputStream(fos);
                        int b;
                        while ((b = bis.read())!= -1){
                              bos.write(b);
                        }
                        bis.close();
                        bos.close();

                close 和 flush 的区别:
                        close :关闭流,并且在关闭流之前在刷新一下缓冲区域,一旦关闭了流资源就不能使用流对象了。
                        flush :只刷新缓存区域,不刷新流,流对象还可以继续使用。

                try catch finally  return 执行顺序:
                        try花括号中存放可能会出现异常的代码,可以存放return 将对象返回。如果出现异常,则执行catch。
                        无论是出异常还是不出异常finally中的代码一定会执行。
                        如果try中没有出现问题,执行到return语句的时候不会直接结束该方法,而是先开辟一条返回路径
                        然后执行finally中的语句,执行完毕,按照之前return开辟的返回路径结束。

                标准的异常处理,必须要保证流对象要关闭
                    private void text3()  throws IOException{
                            FileInputStream fis = null;
                            FileOutputStream fos = null;
                            try {
                                fis = new FileInputStream("a.txt");
                                fos = new FileOutputStream("b.text");
                                int len;
                                byte [] args = new byte[1024 * 8];
                                while ((len = fis.read(args)) != -1) {
                                        fos.write(args,0,len);
                                }
                            } finally {
                               try{
                                   if (null != fis) {      //try finally的嵌套目的能关一个就关一个
                                       fis.close();
                                   }
                               }finally {
                                    if (null != fos) {
                                        fos.close();
                                    }
                               }
                            }
                    }

        字符流:只能操作纯字符数据
                Reader:
                Writer:
十线程
        JVM 是多线程  至少启动了垃圾回收线程和main 主方法。
        生命周期:新建--》就绪--》运行--》堵塞--》死亡

        实现方式:
                ① 继承Thread,重写run方法,在run方法中操作新线程要做的事,创建该对象,并调用start方法开启新线程。
                ② 实现Runnable接口,重写run方法,且在run方法中操作新线程要做的事。创建实现Runnable接口的类,创建
                    Thread类,将实现Runnable子类传入,调用start方法,开启线程。


        同步代码块 synchronized
              使用背景: 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
              何为同步代码块:使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块。
                              多个同步代码块如果使用相同的锁对象, 那么他们就是同步的。
                              synchronized(任意对象 但是必须是同一个){

                              }

        同步方法 被synchronized修饰的方法,成为同步方法,该方法中所有的代码都是同步的。
                锁对象:
                        ① 非静态同步函数,同步锁对象默认是当前对象this。
                        ② 静态同步函数,同步锁对象默认是当前类的字节码文件。

        线程通信 两个线程或两个线程以上 wait() && notifyAll()
                注意:
                    ① 这两个方法必须在同步代码块中执行,并且使用锁对象来调用。
                    ② 这两个方法定义在Object类中,因为锁对象是任意对象,而Object是所有对象的基类。
                    ③ sleep 和 wait 的区别
                            a. sleep在使用的时候必须传入时间,时间到了自动醒来。不释放锁
                               wait在使用的时候可以传可不传,传参的话时间到了自动醒来。释放锁.不传的话等待唤醒。
                            b.sleep 可以在同步函数或者同步块中使用,反之也可以。
                               wait 必须在同步函数中使用.
十一 单例设计模式
饿汉式
            ① 私有默认构造函数
            ② 创建本类对象,但外界不可访问,私有
            ③ 对外提供公共的获取方法 获取唯一的对象
                class Demo {
                     private Demo(){}
                     private static Demo demo = new Demo();
                     public static Demo getInstance(){
                        return demo;
                     }
                 }
 懒汉式
              class Demo {
                    private Demo(){}
                    private static Demo demo;
                    public static synchronized  Demo getInstance(){     // 可能会出现多线程并发,所以加同步,
                        if (demo == null) {                             // 但是效率低,所以加if判断。
                            demo = new Demo();
                        }
                        return demo;
                    }
              }

你可能感兴趣的:(java基础回顾)