前言:
《java宝典》这本书陪伴我也有三年多了。最近觉得用处不大打算封存了,封存前再看最后一次整理点笔记。
1. jdk 和 jre 区别
简单而言:
JRE,Java Runtime Enviroment,java 运行时环境,面向程序本身,包括 jvm、核心类库,为了运行 .class 而生。
JDK,Java Development Kit,java 开发工具包,面向开发者,包含 jre、java 工具(编译等)、java 标准类库,为了开发程序而生。
2. 8 种基本数据类型
- 整型
byte 8bit(1字节) -128 ~ 127
short 2字节 -32768 ~ 32767
int 4字节 -2*31 ~ 2*31
long 8字节 -2*63 ~ 2*63
- 浮点类型
float 4字节 -3.4E38 ~ 3.4E38
double 8字节 -1.7E308 ~ 1.7E308
- 字符类型
char
- 逻辑类型
boolean
- 其它都是引用数据类型
string
...
3. 运算
+,-,*,/,%(加减乘除、取余)
++,--(自增自减)
+=
==,>=,<=,>,<,!=
逻辑与(&),逻辑或(|),逻辑非(!),条件与(&&),条件或(||)
位运算:&,|,~,^
移位运算:<<(左移,高位左移,右侧补0),>>(右移,正数高位补0,负数高位补1)
条件运算符:a? c:d;
- & 和 &&
&&,如果左边判断为 false,那么后面的就不会再判断,直接返回false,可以加快运算速度 - | 和 ||
||,如果左边判断为 true,那么后面的就不会再判断,直接返回true,可以加快运算速度
4. 流程
if(){}else{}
------------------------
if(){}else if(){}else{}
------------------------
switch():{
case 1:
...break;
default:
...
}
------------------------
while(){
...;
}
------------------------
do{
...
}while();
------------------------
for(;;){
...
}
------------------------
增强for循环
for(:){
...
}
------------------------
continue:跳出本次循环
break:退出当前循环
5. 数组
- 创建
int[] a = new int[num];
int[] a = {1,2,3};
Arrays 类属于 util 包,跟数组有强相关性
判断相等(相同顺序,相同元素):
Arrsys.equals(数组A,数组B)
-------------------------------------------------------
数据填充:
Arrays.fill(数组,元素) 数组全部填入元素值
Arrays.fill(数组,fromIndex,endIndex,元素) 元素值填入数组下标 fromIndex 到 endIndex(不包括)
--------------------------------------------------------
数组排序:
Arrays.sort(数组)
---------------------------------------------------------
数组复制:
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int legth)
src 源数组,srcPos 源数组起始下标,dest 目标数组,destPos 目标数组起始下标,legth 复制的数量
6. 字符串
- 创建
String s = "string";
-----------------------------------
String s = new String("hello");
-----------------------------------
char[] arry = {'a','b','c','d'};
String s = new String(arry); s = "abcd"
String s = new String(arry,1,3); s = "bcd"
- 方法
s.length(); 长度
------------------------------------------
s1.equals(s2); 值相等
s1 == s2; 字符串地址相等
s1.equalsIgnoreCase(s2); 忽略大小写
-------------------------------------------
s.charAt(i); 获取下标 i 的字符
-------------------------------------------
查不到返回 -1,查到返回下标
s.indexOf(String str)
s.indexOf(char c)
s.indexOf(int ch)ch是字符的阿拉伯对应
s.indexOf(T t, int fromIndex);
s.lastIndexOf(); 取值同上
---------------------------------------------
s.contains(); 包含
---------------------------------------------
s.startsWith();
s.endsWith()'
---------------------------------------------
s.substring(int begin); 从begin开始
s.substring(int begin,int end); 不包含end
---------------------------------------------
s.replace();
s.replaceAll();
---------------------------------------------
s.toUpperCase(); 转大写
s.toLowerCase(); 转小写
---------------------------------------------
s.trim(); 去首尾全部空格
char[] arr = s.toCharArray(); 转换成字符数组
String[] strArr = s.split(regx); 根据正则分割成字符串数组
----------------------------------------------
String s = String.valueOf(T t); 转换成字符串
- StringBuilder 和 StringBuffer
StringBuffer sb = new StringBuffer();
sb.charAt(i);
sb.append(T t);
sb.length(); 现有长度
sb.capacity(); 现有容量
sb.trimToSize(); 减少容量
sb.insert(int offset, T t);
sb.reverse();
sb.indexOf(T t),sb.lastIndexOf(T t);
sb.deleteCharAt(i);
sb.delete(int start,int end);
sb.toString();
StringBuilder 和 StringBuffer 区别就是 StringBuffer 线程安全,相关方法加 synchronized 保证安全;
速度:
StringBuilder > StringBuffer > String
- 字符串分析类 StringTokenizer
StringTokenizer st = new StringTokenizer("this is a news, are you?",",");
以“,”分割,不传默认以空格分割
int length = st.countTokens(); 返回分割的字符串数量
hasMoreTokens();
String s = st.nextToken(); 配合 hasMoreTokens() 循环取值
- 正则
使用样例:
String regx = "[0-9]+";
String str = "123456as1243";
boolean b = str.matches(regx);
Pattern p = Pattern.compile(regx);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println("q");
System.out.println(m.group());
}
7. 对象
- 类声明
访问控制符:
public
private 只能被该类本身访问,一般申明为内部类
friendly 该类本身或同包下类访问,默认不带访问控制符就是 friendly
protected 该类、同包下类、不同包下该类子类访问
-------------------------------------------------------------------
注意:除非内部类,一般类不能用 private 和 protected修饰
-------------------------------------------------------------------
关键字:
static
abstract 至少有一个abstract方法;不能被实例化
final 不能被继承
- 方法声明
访问控制符:
public
private 只能被该类本身访问
friendly 该类本身或同包下类访问,默认不带访问控制符就是 friendly
protected 该类、同包下类、不同包下该类子类访问
-------------------------------------------------------------------
关键字:
static 该类所有对象共享
abstract 声明方法,没有方法体
final 不能被重写或覆盖
- 抽象、继承、封装、多态
抽象:抽取事物共同特征,形成方法和属性对应到程序类。
继承:extends 关键字实现,单一继承
封装:隐藏类的数据,通过方法访问,例如 private 的属性
多态:不同的对象对同一消息做出响应不同,多态分为编译时多态和运行时多态。编译时多态主要指方法的重载,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
运行时多态举例:
class Manager extends Employer {
work();
}
Employer e = new Manager();
e.work();
另:向上转型(Manager转Employer)是安全的;向下转型需要强制(Manager m = (Manager ) e);
重载:方法名一样,传参不同结果不同。
- this 和 super 关键字
this 关键字可以引用成员变量
---------------------------------------
public Car getInstance(){
return this;
}
this 关键字引用当前对象
---------------------------------------
this(参数表);
eg,根据参数表调用类对应的构造方法
---------------------------------------
super(参数表) 调用父类构造方法
super.方法名(参数表) 调用父类方法
super.成员方法名 调用父类的成员变量
- static 关键字
参考 Java静态变量使用实例
- final 关键字
被 final 修饰的变量只能被初始化一次,不能被修改
被 final 修饰的方法不能被重写
被 final 修饰的类不能被继承
- abstract 抽象
抽象类不能实例化;
如果有抽象方法,类必须是抽象类(没有抽象方法,也可以是抽象类);
继承抽象类必须重写全部抽象方法,非抽象方法可以不重写;
抽象类定义的变量可以被重新赋值;
-------------------------------------------
[访问控制符] abstract class A{
int a = 12;
[访问控制符] abstract 返回类型 方法名(参数表);
}
- interface 接口
接口的方法只有声明没有方法体;
实现接口的类必须实现接口中所有的方法;
类可以实现多个接口(Java 单一继承的弥补);
-----------------------------------------
[访问控制符] interface A{}
interface A{
int a = 12;
void play();
int add();
}
-------------------------------------------
接口中数据成员全部是 public static final 类型
接口中方法默认全部是 public abstract 类型
-------------------------------------------
接口扩展
interface A extends B,C{}
B,C 均为接口
--------------------------------------------
实现接口
class M implements A{}
-
内部类、匿名内部类
使用较少,不介绍 -
克隆技术
关于克隆,有深浅拷贝的概念,可以参考Java 深浅拷贝和原型模式
8. 集合
- Set
Set 继承 Collection 接口,中间不能有重复数据
-----------------------------------------------
HashSet,无序,线程不安全
add()
clear()
contains()
isEmpty()
public Iterator iterator() 返回迭代器
public boolean remove(Object O)
size()
Object[] toArray()
------------------------------------------------
TreeSet,自然排序,线程不安全
public E first() 返回第一个,即最小的
public E last()
-----------------------------------------------
CopyOnWriteArraySet, 线程安全
- List
AllayList,线程不安全
boolean add()
boolean addAll(Collection<? extends E> C)
void clear()
contains(Object e)
get(int index)
boolean isEmpty()
public remove(int index)
public set(int index, E e)
int size()
Object[] toArray()
void trimToSize() 容量调整到当前最小
---------------------------------------------------------
Vector 实现了 AbstractList,线程安全,CopyOnWriteArrayList,线程安全
---------------------------------------------------------
Stack 实现了 Vector ,线程安全
pop() 删除栈顶元素
peek() 取得栈顶元素,不删除
boolean empty()
public int search(Object o) 返回 o 所处的栈位置
- Map
HashMap、HashTable(有些过时,不推荐使用),CurrentHashMap
HashMap:
public void clear() 删除映射关系
boolean containsKey(Object k)
boolean containsValue(Object v)
V get(Object k)
boolean isEmpty()
put(K k,V v)
int size()
remove(Object o)
------------------------------------------------
建议使用下面方式获取 key 和 value
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, String> entry : map.entrySet()) {
entry.getKey()
}
------------------------------------------------
HashMap 线程不安全;
HashTable 是把 HashMap 方法全部加 synchronized 实现线程安全的,不推荐使用;
CurrentHashMap,线程安全,分组加 synchronized 实现线程安全,推荐使用
想了解跟多可参考 从底层代码看HashMap、Hashtable、ConcurrentHashMap的区别
4.
5. Colletcitons 相关方法
public static void sort(list) 自然排序
public static void sort(List list, Comparato c) 按比较器排序
public static void reverse(List list)
9. 泛型和枚举
- 泛型
泛型的使用把原来在运行期间的类型检测提前到了编译期间进行,增强了代码的类型安全。
eg,
List<String> list = new ArrayList<String>();
-------------------------------------------------------------------
定义泛型类和方法举例:
public class Car<K> {
private K name;
private K color;
public Car(K carName, K carColor) {
this.color = carColor;
this.name = carName;
}
public void setName(K name) {
this.name = name;
}
public void setColor(K color) {
this.color = color;
}
public K getColor() {
return color;
}
public K getName() {
return name;
}
}
实例化:
Car<String> car = new Car<String >("", "");
- 枚举类
属于类,拥有类的一些特征,例如访问控制符,
eg,
public enum OrderEnum {
FROZEN(0, "冻结"),
ORDER(1, "订购"),
RECOVERY(2, "恢复");
private int id;
private String desc;
OrderEnum(int id, String desc) {
this.id = id;
this.desc = desc;
}
public int getId() {
return id;
}
public String getDesc() {
return desc;
}
}
使用:
int id = OrderEnum.ORDER.getId()
10. 异常和断言
- 异常
Throwable 类是所有错误和异常类的父类,子类有两个 Error 和 Exception
-----------------------------------------------------------------
几种常见的运行时异常
NullPointerException
IndexOutOfBoundsException
ClassCastException
ArithmeticException
- 异常处理方式
catch 可以多加几个捕获多种异常
try{...}catch(Exception e)){...}
try{...}catch(Exception e){...}finally{...}
------------------------------------------------------
尽量使用下面这种方式,方便释放资源
try(...){...}catch(Exception e)){...}
------------------------------------------------------
在方法声明后面抛出异常
throw new Exception
-------------------------------------------------------
- 断言
assert 会让系统产生一个AssertionError 的错误,断言失败错误不可恢复
eg,
assert 12 > 10;
11. 多线程
常规的概念和使用参考下述博客:
java 多线程实现的三种方式区别
java中join方法的理解和说明
java 的 synchronized 同步方法使用场景举例解读
java 中 wait 和 notify 线程通信举例说明
12.其它
上述的笔记整理是看到哪想到哪写到哪,有些在《Java宝典》里面没有,有些不涉及后端开发也没写。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16524.html