这是我参与更文挑战的第7天,活动详情查看:更文挑战
一、基础
java对象的几种创建方式(5种)
new关键字- 反射:
Class.newInstatnce()- (此种方式必须有public无参构造方法,否则会报错)
- 反射:
Constructor.newInstance()- (方法调用有参数(不再必须是无参)的和私有的构造函数(不再必须是public))
- clone
- 调用
clone方法,jvm会创建一个新的对象,将前面的对象内容全部拷贝进去 - 调用
clone方法创建的对象 不会调用任何的构造方法
- 调用
Object类
- 是Java中所有类的父类,方法包括:
- toString() 返回当前对象本身的有关信息,按字符串对象返回
- equals() 比较两个对象是否是同一个对象,是则返回true
- hashCode() 返回该对象的哈希码值
- getClass() 获取当前对象所属的类的信息,返回Class对象
关键字
static
- 修饰成员变量和成员方法:被static修饰的变量和方法属于类,不属于某一个对象,被类所有对象共享;被 static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区
- 修饰静态代码块:(初始化执行顺序:静态代码块 > 普通代码块 > 构造方法),静态代码块只执行一次。
- 修饰内部类:static 修饰类的话只能修饰内部类
final
final修饰的类不能被继承final修饰的方法不能被覆盖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 常见遍历方式
Map.entry(map.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);
}
- 循环遍历
key或者values(map.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);
}
- 迭代器
Iterator(map.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);
}
- 通过键找值遍历
- 这种方式的效率比较低,因为本身从键取值是耗时的操作。
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);
}