java 基础知识
1. 常见关键字总结:static、final、this、super
1.1 final关键字
final关键字,用来修饰类,方法,变量
- final修饰的类不能被继承,final修饰类的所有的成员方法都会被隐式的指定为final方法。
- final修饰的方法不能被重写
- final修饰的变量是常量。如果是基本类型的变量,则其数值在出事化后不能被更改;如果是引用类型的变量,则其初始化后不能再指向另外的对象。
1.2 static关键字
- 修饰成员变量和成员方法:
被static修饰的成员被类中所有的对象共享,可以通过类名调用。 被static声明的成员变量属于静态成员变量,静态变量存放在java内存区域的方法区。 - 静态代码块:
静态代码块定义在类中方法外。静态代码块在非静态代码块之前执行(静态代码块 ->非静态代码块 ->构造方法)。该类不管创建多少对象,静态代码块只执行一次。 - 静态内部类(static修饰类只能修饰内部类):
静态内部类与非静态内部类之间存在一个最大的区别:非静态内部类在编译完成之后会隐含的保存着一个引用,该引用是创建它的外围类。
静态内部类实现单例模式
public class Singleton {
//声明为 private 避免调用默认构造方法创建对象
private Singleton() {
}
// 声明为 private 表明静态内部该类只能在该 Singleton 类中被访问
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getUniqueInstance() {
return SingletonHolder.INSTANCE;
}
}
1.3 this 关键字
this关键字用于引用类的当前实例。
class Manager {
Employees[] employees;
void manageEmployees() {
int totalEmp = this.employees.length;
System.out.println("Total employees: " + totalEmp);
this.report();
}
void report() { }
}
this关键字用于两个地方:
- this.employees.length:访问Manager类的当前实例的变量。
- this.report():调用manager类的当前实例的方法。
1.4 super关键字
super关键字用于从子类访问父类的变量和方法。
public class Super {
protected int number;
protected showNumber() {
System.out.println("number = " + number);
}
}
public class Sub extends Super {
void bar() {
super.number = 10;
super.showNumber();
}
}
Sub类访问父类成员变量number并调用其父类Super的showNumber()方法。
注意:
- 在构造器中使用 super()调用父类中的其他构造方法时,该语句必须处于构造器的首行。(this调用本类中的其他构造方法时也是要放置在首行)
- this、super 不能再static方法中使用。
this代表对本类对象的引用,指向本类对象;而super代表对父类对象的引用,指向父类对象。
2.其他重要知识点
2.1String、StringBuffer、StringBuilder
总结如下:
- 操作少量的数据时:适用String
- 单线程操作字符串缓冲区下大量数据:适用StringBuilder。
- 多线程操作字符创缓冲区下大量数据:适用StringBuffer(线程安全)
2.2 Object类的常见方法总结
2.3 == 与 equals
== :它的作用是判断两个对象的地址是不是相等。(判断两个对象是不是同一个对象,对于基本数据类型 " == "判断的是值。而引用数据类型比较的是内存地址)
**equals():**它的作用也是判断两个对象是否相等。
- 情况1:类没有覆盖equals()方法。比较时则等价于 == 比较。
- 情况2: 类覆盖了equals()方法。这时是比较两个对象的内容是否相等 。
2.4 hashCode()
hashCode()的作用是获取哈希码,也称为散列码。哈希码的作用是确定对象在哈希表中的索引的位置。
2.5java序列化
对于不想进行序列化的变量,使用transient关键字修饰。transient关键字只能修饰变量,不能修饰类和方法
3.集合
3.1Collections
Collections工具类常用的方法:
- 排序
- 查找、替换操作
- 同步控制(需要线程安全的集合类型时考虑使用JUC包下的)
排序操作
void reverse(List list) //反转
void shuffle(List list) //随机排序
void sort(List list) //按自然排序的升序排序
void sort(List list,Comparator c) //定制排序,由Comparator控制排序逻辑
void swap(List list,int i ,int j) //交换两个索引位置的元素
void rotate(List list,int distance) //旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。
定制排序的用法
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("zhangsan", 80));
list.add(new User("lisi", 88));
list.add(new User("wangwu", 60));
Collections.sort(list, new Comparator<User>() {
public int compare(User user1, User user2) {
/**
* 升序排的话就是第一个参数.compareTo(第二个参数);
* 降序排的话就是第二个参数.compareTo(第一个参数);
*/
return user1.getScore().compareTo(user2.getScore());//升序
}
});
System.out.println(list);
}
查找,替换操作
int binarySearch(List list,Object key) //对List进行二分查找,返回索引,List必须是有序的
int max(Collection coll) //根据元素的自然顺序,返回最大的元素
int max(Collection coll , Comparator c) //根据定制排序,返回最大元素。(int min类比上面)
void fill(List list, Object obj) //用指定的元素代替指定list中的所有元素
int frequency(Collection c,Object o) // 统计元素出现次数
int indexOfSubList(List list,List target) // 统计target在list中第一次出现的索引,找不到则返回-1。
boolean replaceAll(List list ,Object oldVal ,Object newVal) //用新的元素替换旧的元素。
3.2 Arrays类的常见操作
- 排序:sort()
sort(int[] a) //按照数字顺序排列指定的数组
sort(int[] a ,int fromIndex,int toIndex) //按升序排列数组的指定范围
parallelSort(int[] a) //按照数字顺序排列指定的数组(并行的)
- 查找:binarySearch()
//二分查找需要先排序后再进行查找,不然查找不到
char[] e = {'a','f','b','c','g','h','i'};
Arrays.sort(e);
System.out.printlin(Arrays.toString(e));//输出排序后的数组
int s = Arrays.binarySearch(e,'i') //查找出 i 在数组中的位置
- 比较:equals()
// *************比较 equals****************
char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
char[] f = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
/*
* 元素数量相同,并且相同位置的元素相同。 另外,如果两个数组引用都是null,则它们被认为是相等的 。
*/
// 输出true
- 填充:fill()
int[] g = { 1, 2, 3, 3, 3, 3, 6, 6, 6 };
// 数组中所有元素重新分配值
Arrays.fill(g, 3);
//输出的结果为:333333333
int[] h = { 1, 2, 3, 3, 3, 3, 6, 6, 6, };
// 数组中指定范围元素重新分配值
Arrays.fill(h, 0, 2, 9);
System.out.println("Arrays.fill(h, 0, 2, 9);:");
// 输出结果:993333666
- 转列表 asList()
List<String> stooges = Arrays.asList("moe","jucky","joker");
System.out.println(stooges);
- 转字符串 toString()
- 复制 copyOf()
// copyOf 方法实现数组复制,h为数组,6为复制的长度
int[] h = { 1, 2, 3, 3, 3, 3, 6, 6, 6, };
int i[] = Arrays.copyOf(h, 6);
System.out.println("Arrays.copyOf(h, 6);:");
// 输出结果:123333
// copyOfRange将指定数组的指定范围复制到新数组中
int j[] = Arrays.copyOfRange(h, 6, 11);
System.out.println("Arrays.copyOfRange(h, 6, 11):");
// 输出结果66600(h数组只有9个元素这里是从索引6到索引11复制所以不足的就为0)
3.异常
3.1异常的介绍
java异常类层次结构图
在java中,所有的异常都有一个共同的祖先 java.lang包中的Throwable类。Throwable:有两个重要的子类Exception(异常) 和 Error(错误)。
Error(错误):是程序无法处理的错误
Exception(异常):是程序本身可以处理的异常 Exception类中有一个重要的子类RuntimeException,该异常是java虚拟机抛出的。
NullPointException(要访问的变量没有引用任何对象时,抛出该异常)等等异常。
3.2Therowable类的常用方法
public String getMessage() //返回异常发生时的简要描述
public String toString() // 返回异常发生时的详细信息
public String getLocalizedMessage() //返回异常对象的本地信息。
public void printStackTrace() // 在控制台打印Throwable对象封装的异常信息。
3.3 使用try-with-resource 来代替 try-catch-fianlly
面对必须要关闭的资源,我们总是应该优先使用 try-with-resources 而不是try-finally。随之产生的代码更简短,更清晰,产生的异常对我们也更有用。try-with-resources语句让我们更容易编写必须要关闭的资源的代码,若采用try-finally则几乎做不到这点
当然多个资源需要关闭的时候,使用try-with-resources实现起来也非常的简单。
try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}
}
catch (IOException e) {
e.printStackTrace();
}
未完待续…
《声明:本博客参考github的Guide哥的开源项目而记录,仅供参考和学习!》