equals

比较两个对象的内容是否相同

  1. public class Str {
  2. public static void main(String[] args) {
  3. // b重用a 所以二者相等
  4. String a = "aa"+"c";
  5. String b = "aa"+"c";
  6. System.out.println(a==b);
  7. // new string必定创建新的对象
  8. String s = new String("aa" + "c");
  9. String s1 = new String("aa" + "c");
  10. System.out.println(a==s);
  11. System.out.println(s1==s);
  12. // 字符串拼接
  13. /*
  14. *
  15. * 字符串String的拼接有:“+” 、 concat () 方式实现
  16. * 或者使用StringBuilder、StringBuffer类实现
  17. * 这几种方式性能的从低到高进行排序
  18. * 则顺序为:“+” < concat () < StringBuffer < StringBuilder
  19. * 使用"+"性能是最差的,应该避免使用!!!
  20. * +号的本质是 StringBuilder sb = new StringBuilder(a);
  21. * sb.append("3");
  22. * +号连接字符串字面量“a”+“b” 本质就是“ab”
  23. * StringBuffer是线程安全的,而StringBuilder不是
  24. *
  25. * getByte()可以把字符串转成流
  26. * new String()可以把流转成字符串
  27. * a.codePointAt() 可以把字符转换成unicode码
  28. * */
  29. }

字符串变成字符流

  1. public class strConcat {
  2. public static void main(String[] args) {
  3. long begin = System.currentTimeMillis();
  4. tran("宝");
  5. long after = System.currentTimeMillis();
  6. System.out.println(after-begin);
  7. }
  8. public static void tran(String a){
  9. byte[] bytes = a.getBytes();
  10. System.out.println(Arrays.toString(bytes));
  11. }

空指针异常的原因

null 调用方法就会产生空指针异常

字符串排序

  1. public static void main(String[] args) {
  2. String a = "wang";
  3. String b = "abcd";
  4. int i = a.compareTo(b);
  5. // 该方法用来比较字符串的内容,而不是地址
  6. boolean equals = a.equals(b);
  7. System.out.println(i);
  8. }
  9. 字符排序根据abcd...的顺序,
  10. a.compareTo(b)>0 a排序靠后 <0相反 =0二者相同

字符串的替换查找

  1. public static void main(String[] args) {
  2. String b = "add";
  3. String c = "d";
  4. // b.contains(c) 判断b中有没有c字符串 返回一个布尔值
  5. boolean contains = b.contains(b);
  6. // b.indexOf(c) 角标以0开始查找c字符串,如果没有匹配到内容,返回-1,如果找到,返回c字符串的位置
  7. int i = b.indexOf(c);
  8. System.out.println(i);
  9. // b.replace() 把指定的字符替换成所需的字符
  10. String replace = b.replace(c, "*");
  11. // b和c忽略大小写进行比较
  12. boolean b3 = b.equalsIgnoreCase(c);
  13. // 可以把任意数据类型转成字符串
  14. String a = String.valueOf("a");
  15. System.out.println(replace);
  16. System.out.println(contains);
  17. }

判断一个字符串在另一个字符串出现的次数

  1. public static int ccc(String str,String key){
  2. int count = 0;
  3. while (str.contains(key)){
  4. str = str.substring(str.indexOf(key) + key.length());
  5. count ++;
  6. }
  7. return count;
  8. }

数组

  1. 空数组的值
  2. 整形:0
  3. 浮点型:0.0
  4. char0对应的字符
  5. booleanfalse
  6. 引用类型为null

数组复制

  1. public static void main(String[] args) {
  2. int [] arr1 = {1,8,5,2,3};
  3. int [] arr2 = new int[arr1.length+1];
  4. System.arraycopy(arr1,0,arr2, 0, arr1.length);
  5. System.out.println(Arrays.toString(arr2));
  6. }
  7. system中的方法可以高效复制数组
  8. public static native void arraycopy(
  9. Object src, int srcPos, Object dest,
  10. int destPos, int length);
  11. @param src 源数组
  12. @param srcPos 在源数组中的起始位置
  13. @param dest 目标数组
  14. @param destPos 目标数据中的起始位置
  15. @param length 要复制的数组元素的数量
  16. arraycopy(老数组,老数组从哪里开始,新数组,新数组在哪里开始,复制的长度)

数组工具类

  1. 倒序排序
  2. Arrays.sort(arr, Comparator.reverseOrder());
  3. 判断两个数组中的内容是否相同
  4. Arrays.equals(arr, arr1)
  5. int[] arr = {1,8,6,8,2,7,9};
  6. int[] arr1 = {5,5,5};
  7. int[] add = ArrayUtils.insert(5, arr, 6,6,6);
  8. int[] remove = ArrayUtils.remove(arr, 3);
  9. ArrayUtils.reverse(arr);
  10. int[] ints = ArrayUtils.addAll(arr, 1,5,8,9,6);
  11. System.out.println(Arrays.toString(ints));
  12. int[] clone = ArrayUtils.clone(arr);
  13. System.out.println(Arrays.toString(clone));
  14. System.out.println("=================");
  15. int[] subarray = ArrayUtils.subarray(arr1, 1, 2);
  16. System.out.println(Arrays.toString(subarray));
  17. ArrayUtils.shuffle(arr);
  18. System.out.println(Arrays.toString(arr));
  19. System.out.println(ArrayUtils.contains(arr, 11));
  20. System.out.println("=================");
  21. String str1 = "bao";
  22. String intern = str1.intern();
  23. System.out.println(str1 == intern);
  24. }

构造方法

  1. 1.代码块中的内容会被默认添加到构造方法的第一行,进行初始化功能,会在构造方法之前执行
  2. ·代码块的执行在构造方法之前
  3. ·代码块不能使用 有可能未赋值 的属性
  4. ·若代码块中有复制语句,代码块就会对属性进行赋值,从而盖掉初始值
  5. ·若代码块在赋值语句的前面,那么赋值语句中的值会覆盖代码块中的值,进而被参数覆盖


面向对象

1.权限修饰符

image.png

2.static

image.png

3.类加载过程

虚拟机把字节码文件加载到内存,产生类对象

  1. 0.递归的加载父类
  2. 1.分配空间
  3. 2.加载静态属性,如果有赋值语句,加载赋值语句
  4. 3.加载静态代码块,并且加载代码块中的语句
  5. 4.如果有静态属性没有赋值,此时完成对静态属性的赋值,没有赋值就是默认值
  6. 5.把类中的静态方法 (压入内存)
  7. 6.父类静态属性,静态代码块,代码块,构造方法,子类静态属性,静态代码块,代码块,构造方法

4.final

修饰的类不可以被继承,修饰的方法不可以被重写,修饰的变量变成常量
······赋值用法
1.声明时赋值
2.代码块中赋值
3.构造方法
······静态final
1.声明时赋值
2.静态代码块赋值
image.png

5.对象构建

image.png

6.内部类

成员内部类,静态内部类,局部内部类,匿名内部类

  1. 成员内部类
  2. ICBCBank bank = new ICBCBank();
  3. ICBCBank atm = bank.new ATM();
  4. 静态内部类
  5. ICBCBank.ATM = new ICBCBank.ATM();

7.继承

abstract和final同时修饰类 不可以
因为abstract中定义的方法就是让子类来实现的,而加了final这个类就不可以被继承,也就没有子类了
abstract和static同时修饰类 可以

abstract和final同时修饰方法 不可以
final方法不能被重写
abstract和static同时修饰方法 不可以
静态方法不允许被重写

static和final可以同时修饰类和方法和属性

匿名内部类

  1. Atm atm = new Atm(){
  2. 重写方法---
  3. }

接口

接口与接口之间采用多继承,接口与类之间多实现
解耦合,提高扩展性,高聚合
里面的属性都是公开抽象方法
属性都是公开静态不可变的常量
接口中没有构造方法
内部类默认也是公开静态的

函数式接口,简化匿名内部类的书写
image.png
他只是创建了一个实现了接口的对象
image.png

数据处理函数

  1. int[] arr = {1,3,5,7,9}
  2. 1.聚合
  3. int applyAsInt(int left, int right);
  4. Arrays.stream(arr).reduce((sum, a) -> sum+=a)
  5. 2.映射
  6. int applyAsInt(int operand);把一个流通过某种方法映射到一个新的数据流
  7. Arrays.stream(arr).map(ss -> ss * 3).toArray()
  8. 3.过滤
  9. boolean test(int value);把一个流通过某种方法过滤成一个流
  10. Arrays.stream(arr).filter(s -> s>5).toArray()