Java 基础知识

131 阅读3分钟

这是我参与更文挑战的第7天,活动详情查看:更文挑战

一、基础

java对象的几种创建方式(5种)

  1. new 关键字
  2. 反射:Class.newInstatnce()
    • 此种方式必须有public无参构造方法,否则会报错
  3. 反射:Constructor.newInstance()
    • (方法调用有参数(不再必须是无参)的和私有的构造函数(不再必须是public))
  4. clone
    • 调用 clone 方法,jvm会创建一个新的对象,将前面的对象内容全部拷贝进去
    • 调用 clone 方法创建的对象 不会调用任何的构造方法

Object类

  • 是Java中所有类的父类,方法包括:
    • toString() 返回当前对象本身的有关信息,按字符串对象返回
    • equals() 比较两个对象是否是同一个对象,是则返回true
    • hashCode() 返回该对象的哈希码值
    • getClass() 获取当前对象所属的类的信息,返回Class对象

关键字

static

  1. 修饰成员变量和成员方法:被static修饰的变量和方法属于类,不属于某一个对象,被类所有对象共享;被 static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区
  2. 修饰静态代码块:(初始化执行顺序:静态代码块 > 普通代码块 > 构造方法),静态代码块只执行一次。
  3. 修饰内部类:static 修饰类的话只能修饰内部类

final

  1. final 修饰的不能被继承
  2. final 修饰的方法不能被覆盖
  3. final 修饰的变量为常量
    • 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
    • 如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象。

this

  • this 关键字用于引用类的当前实例

super

  • super 关键字用于从子类访问父类的变量和方法

this和super注意点

  • this 调用本类其他构造方法时,需要放在第一行
  • super 访问父类的构造方法时,需要放在第一行
  • this、super 不能用在 static 方法中

二、接口和抽象类

三、集合

List

  • ArrayList :Object数组
  • LinkedList:双向链表
  • Vector:Object数组

Set

  • HashSet:(无序)基于 HashMap 实现的,底层采用 HashMap 来保存元素数据
  • TreeSet:(无序)红黑树(自平衡的排序二叉树)

Map

  • HashMap
    • JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)
    • JDK1.8 以后,红黑树 详见链接
  • LinkedHashMap:LinkedHashMap 继承自 HashMap,
  • HashTable:数组+链表组成,数组是HashTable主体,链表是为了解决哈希冲突存在
  • TreeMap:红黑树(自平衡的排序二叉树)

map 常见遍历方式

  1. Map.entrymap.entrySet()
    • 最常用方式
    Map<String, String> map = new HashMap<String, String>();
    map.put("a", "111");
    map.put("b", "222");
    map.put("c", "333");
    for (Map.Entry<String, String> entry : map.entrySet()) {
        String mapKey = entry.getKey();
        String mapValue = entry.getValue();
        System.out.println(mapKey + ":" + mapValue);
    }
  1. 循环遍历 key 或者 valuesmap.keySet() / map.values()
    • 适用于只需要key或者values
    Map<String, String> map = new HashMap<String, String>();
    map.put("a", "111");
    map.put("b", "222");
    map.put("c", "333");
    // 打印键集合
    for (String key : map.keySet()) {
        System.out.println(key);
    }
    // 打印值集合
    for (String value : map.values()) {
        System.out.println(value);
    }
  1. 迭代器 Iteratormap.entrySet().iterator()
    Map<String, String> map = new HashMap<String, String>();
    map.put("a", "111");
    map.put("b", "222");
    map.put("c", "333");
    Iterator<Entry<String, String>> entries = map.entrySet().iterator();
    while (entries.hasNext()) {
        Entry<String, String> entry = entries.next();
        String key = entry.getKey();
        String value = entry.getValue();
        System.out.println(key + ":" + value);
    }
  1. 通过键找值遍历
    • 这种方式的效率比较低,因为本身从键取值是耗时的操作
    Map<String, String> map = new HashMap<String, String>();
    map.put("a", "111");
    map.put("b", "222");
    map.put("c", "333");
    for(String key : map.keySet()){
        String value = map.get(key);
        System.out.println(key+":"+value);
    }

四、IO

IO模型

BIO

NIO

AIO

五、异常

六、反射

参考链接