1. String字符使用加号拼接,实际上是新建一个StringBuffer对象,调用apped方法,最后再转为String方法。
  2. StringBuff的append方法添加数据并返回对象本身(链式编程)
  3. ArrayList<>在指定位置添加元素不会替换,指定元素之后的所有元素后移
  4. 继承:变量先看方法内部有没有,没有到本类成员变量去找,再没有到父类成员变量去找,不考虑父亲的父亲。
  5. this代表本类对象的引用,super表示父类对象引用(二者都可以访问构造方法)
  6. 子类可能需要用到父类,所以子类初始化,父类也初始化 ,子类第一句默认super()
  7. 视频super内存图
  8. 方法重写(注解Override)可以用super.调用父类方法,私有方法不能重写,子类方法访问权限不能更低(public>默认>私有)
  9. Java只支持单继承,不支持多继承,还支持多层继承
  10. final修饰基本数据类型,基本数据类型不能改变,修饰引用类型,引用变量的地址值不能改变。
  11. static表示共享,静态,被static修饰的成员变量建议使用类名来访问。
  12. 多态:同一个对象在不同时刻表现出来不同的不同形态,例如:猫 cat = new 猫();动物 animal = new 猫();多态的前提和体现:1.有继承/实现关系,2.有方法重写,3.有父类引用指向子类引用。
  13. 多态的成员变量编译和运行都看左边,成员方法的编译看左边,运行看右边。
  14. 多态传形参传父类,实参为子类,父类有的方法才能调用,不能调用子类特有的方法,规则参考上一条。
  15. 多态转型向上转型:父类引用指向子类对象Animal a = new Cat(),向下转型:父类引用转为子类对象,Cat c = new (Cat)a;
  16. 有抽象方法必须是抽象类,抽象类不一定需要抽象方法
  17. 抽象子类要么是抽象子类要么重写抽象类中的所有方法。
  18. 多态的形式:具体类多态,抽象类多态,接口类多态
  19. 接口类的实现类要么重写接口中的所有抽象方法,要么是抽象类。
  20. 接口成员变量只能是常量,默认修饰符:public static final,成员方法只能是抽象方法,默认修饰符public abstract。
  21. 类实现关系可以单实现也可以多实现,还可以继承一个类的同时实现多个接口
  22. 接口和接口是继承关系,可以单继承,也可以多继承。
  23. 抽象类成员变量有常量,变量,构造方法,抽象方法,非抽象方法。接口只有常量和抽象方法。
  24. 设计理念,抽象类对 对象抽象包括属性和行为,接口对行为抽象主要是行为。
  25. 抽象类是对事物的抽象,接口是对行为的抽象。
  26. 抽象类名作为形参和返回值需要的是该抽象类的子类对象。
  27. 接口名作为形参和返回值需要的是该接口的实现类对象。
  28. 内部类(在类中定义一个类)可以直接访问外部类的成员,包括私有,外部类访问内部类的成员必须创建对象
  29. 成员内部类public修饰,创建对象例子:Outer.Inter oi = new Outer().new Inter(),private修饰需要在外部类使用方法调用。
  30. 局部内部类,在方法内部中定义的类,要在方法内部定义使用。
  31. 匿名内部类本质是继承子类或接口的实现类
  32. 接口名作为形参时可以不创建实现类对象,而是使用匿名内部类
  33. 没有构造方法看方法是不是static修饰的,如果是可以用类名修饰。
  34. 所有类建议重写tostring方法。
  35. 工具类(例:Math,System)构造方法用private修饰,方法类用public static修饰,方便使用类名调用。
  36. 装箱:将基本数据类型转换成对应的包装类型。拆箱:将包装类类型准换成对应的基本数据类型。
  37. 只要是对象(包装类对象)在使用前就要判是否为null。
  38. 使用包装类有更多方法操作该对象,更多使用是基本数据类型和字符串之间的转换。
  39. int转string:valueof
  40. string转int:parseInt
  41. try-catch在try中异常时创建一个异常对象,去catch中匹配处理。
  42. 编译时异常用try-catch或throws,用throws处理需要谁调用谁处理,运行时异常可以不处理。
  43. throws跟在方法名后,后跟异常类名;throw放在方法体中,后跟异常对象名。
  44. 在这里插入图片描述
  45. 集合的遍历用迭代器
  46. 迭代器遍历过程中,通过集合对象修改了集合中的元素,造成迭代器获取元素中判断预期修改值和实际修改值不一样。
  47. 列表迭代器(ListIterator)有add方法(迭代器没有),不会产生并发修改异常
  48. 在这里插入图片描述
  49. set集合没有索引,不能用普通for遍历。
  50. 默认情况下(Objiect中的hasCode)不同对象的哈希值是不同的,但通过方法重写可以使不同对象的哈希值相同。
  51. java中哈希表的实现是数组加链表。
  52. hashSet存储类对象要重写equals和hashcode方法(可自动生成)。
  53. LinkedHashSet(继承HashSet)元素有序且唯一。
  54. Set集合之TreeSet集合.
  55. 泛型可用在类,方法和接口中,被称为泛型类,泛型方法和泛型接口
  56. 泛型类在类名后加,用到变量类型时用<代替>
  57. 泛型方法:public void demo(T t){}
  58. 泛型创建时类似ArrayList
  59. 泛型接口在接口名后加 ,实现类在实现类名后加 接口名后加
  60. 接口方法不要加任何修饰符
  61. 可变参数例子:**public static int sum(int… a){}**。在数据类型后加…
  62. 可变参数是一个数组,包含可变参数,可变参数要放到后边。
  63. map获取所有key: Set keySet()
  64. map获取所有值的集合: Collection values()
  65. File就是文件和目录路径名的抽象表示
  66. 字节输出流做了三件事:1. 调用系统功能创建了对象。2. 创建了字节输出流对象。 3. 字节输出流对象指向文件
  67. 字节输出流write()方法写的是字节,可使用getBytes()获得字符串对应的字节码。
  68. windows中”\r\n”表示换行
  69. 字节缓冲输入/输出流只是提供一个缓冲区。
  70. 汉字gbk编码2个字节,utf-8编码三个字节,而字节流输入输出只能输出一个字节,所以要字符流输入输出。
  71. 汉字存储的时候编码是负数。
  72. 字符流=字节流+编码表(类似字节缓冲区,都需要传参字节流对象)
  73. GBK中文编码,utf-8万国码,用什么规则编码就要用什么规则解码
  74. 字符流有flush()刷新流方法,字符流中close()方法先刷新再关闭。
  75. 字符缓冲流BufferedWriter和BufferedReader两个方法,newLine()和readLine(),后一个方法已经到结尾则为null,且不包含终止符号
  76. 字节打印流printStream继承父亲的write()方法会转码,而自己的write()方法会原样输出。
  77. 对象序列化流序列化对象,对象需要实现serializable接口,serializable接口是个标记接口,不需要重写任何方法。
  78. properties不能写泛型,和io流结合的方法load和store
  79. 线程优先级范围1-10。
  80. 继承Thread类有getName()方法,实现Runnable接口没有getName()方法,这也是实现多线程的两种方法。
  81. 非静态同步方法锁对象是this,静态同步方法的锁对象是类名.calss
  82. StringBuffer线程安全对应StringBuider不线程安全,Vector线程安全,ArrayList不线程安全,HashTable线程安全HashMap不线程安全。三个线程安全的类也不多用,常用Collections类中的方法来返回安全对象。
  83. lock和unlock方法常结合try—finally方法使用
  84. 使用wait要在synchronized方法中使用,记得使用notifyAll方法。
  85. lambda方法使用()->{ },小括号里可以有参数,用逗号隔开,有且仅有一个参数,小括号可以省略;有且仅有一条代码,大括号和分号可以省略;如果有return且包含return只有一条代码块,return要省略;实现的是接口中的方法,不用再去写一个实现类。
  86. lambda方法使用条件有一个接口,且只有一个抽象方法,使用在方法参数的地方。
  87. 匿名内部类会生成字节码(class)文件,而lambda不会生成字节码文件。
  88. 接口的组成:常量(public static final),抽象方法(public abstract);java8新增默认方法和静态方法,java9新增私有方法。
  89. lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后边的参数全部传递给该方法做参数。
  90. 函数式接口Consum注意andThen()方法,Predicate有and和or方法。
  91. Collections集合默认方法生成流,Map间接方法生成流,数组使用静态方法Stream.of()生成流。.
  92. 向下转型使用强制转型,后边跟个父类对象:例:Cat c = (Cat)animal,且只能转同类型,猫转猫,狗转狗
  93. 没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
  94. Java中的接口更多的体现在对行为的抽象
  95. 接口与接口继承关系,可以单继承,也可以多继承内部类可以直接访问外部类的成员,包括私有
  96. 工具类设计思想:1.构造方法用 private 修饰2.成员用 public static 修饰
  97. Calendar的set方法年需要手动减一,月份需要手动加一.
  98. 修改迭代器中的元素会发生异常,使用for
  99. 列表有专用的迭代器,ListIterator
  100. 增强for不能用于迭代器.
  101. Set没有索引、只能通过迭代器或增强for循环遍历
  102. 重写equal方法还要重写hashCode方法,否则equal无效,hashSet表内容相同的对象哈希值不103. 同会存到不同的位置,达不到元素不重复的目的.
  103. 重写Comparable接口的compareTo方法this在前从小到大,this在后从大到小
  104. 对象反序列化流ObjectInputStream要抛出IOException ,ClassNotFoundException异常.
  105. private final static long serialVersionUID = 42L修改了对象所属的类文件,读取数据会不会出问题呢
  106. transient关键字修饰,该关键字标记的成员变量不参与序列化过程
  107. Properties的store方法备注没有写null.
  108. Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值,这个值在andthen方法时才有用.
  109. Stream的count()方法返回值是long.
  110. transient 只能修饰变量,不能修饰类和方法
  111. static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化
  112. 静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问
  113. 非静态代码块与构造函数的区别是: 非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。
  114. File的mkdirs方法只能创建文件夹,即使你的后缀是文件格式.
  115. Deque 还提供有 push() 和 pop() 等其他方法,可用于模拟栈
  116. 在这里插入图片描述
  117. ArrayDeque 是基于可变长的数组和双指针来实现
  118. ArrayDeque 不支持存储 NULL 数据,但 LinkedList 支持
  119. PriorityQueue 是非线程安全的,且不支持存储 NULL 和 non-comparable 的对象
  120. PriorityQueue 默认是小顶堆
  121. HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个
  122. String拼接两个字符串对象会在堆上创建一个新对象.
  123. String s1 = new String(“abc”)创建了两个对象.
  124. 两种浮点数类型没有浮点数技术.
  125. sleep不释放锁,wait释放锁