前言
学习JDK中提供的各种功能的Java类,API(Application Programming Interface)
正文
Object
hashCode
A: 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
B: 不同对象的hashCode()一般来说不会相同。
但是,同一个对象的hashCode()值肯定相同。
equal
==和equals()的区别?
A:==
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
B:equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。
但是,我们可以根据自己的需要重写该方法。
String类型 也需要用equals来比较
clone
创建并返回此对象的一个副本,这种克隆机制十分高效,而且二者之间完全隔离。
自定义类实现克隆步骤:
A:自定义类实现Cloneable接口,这是一个标记性接口,实现这个接口的类的对象可以实现自我克隆。
B:自定义类中重写Object类的clone()方法。
C:重写clone()方法时通过super.clone()调用Object类的clone()方法来得到该对象的副本,并返回该副本。
深复制与浅复制
Java的clone():深复制与浅复制
clone() 方法 基本数据类型 不会变,但是引用类型会随着克隆的对象改变而本身的属性改变,所以要注意到 clone()方法的正确使用
Scanner
问题
先nextInt()然后nextLine(),后nextLine()读取错误的问题
A:重新创建对象。
B:都以字符串形式接收,然后把字符串转成int类型。
Scanner in = new Scanner(System.in);
String x = in.nextLine();
String str = in.nextLine();
int xx = Integer.parseInt(x);
String
字符串的特点
A:字符串一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,而不是引用不能改变
。
B:字面值作为字符串对象和通过构造方法创建对象的不同
String s = new String(“hello”);和String s = “hello”的区别
前者申请了堆区的对象 和 方法区的字符串常量区的对象
后者只需要去创建 方法区的字符串常量区的对象
面试题
字符串如果是变量相加,先开空间,在拼接。
字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);// false,这里是变量相加
System.out.println(s3 == "hello" + "world");// true,常量相加
System.out.println(s3 == "hell" + "oworld"); //这个也是true
String的转换功能
byte[] getBytes():把字符串转换为字节数组。
char[] toCharArray():把字符串转换为字符数组。
static String valueOf(char[] chs):把字符数组转成字符串。
static String valueOf(object i):
注意:String类的valueOf方法可以把任意类型的数据转成字符串。
String toLowerCase():把字符串转成小写。
String toUpperCase():把字符串转成大写。
String concat(String str):把字符串拼接。
int compareTo(String str):看源码 先比较是否字符相同,然后比较长度
int compareToIgnoreCase(String str)
StringBuffer/StringBuilder
方法
public StringBuffer append(String str) //添加
public StringBuffer insert(int offset,String str) //插入
public StringBuffer deleteCharAt(int index) //删除
public StringBuffer delete(int start,int end) //删除
public StringBuffer replace(int start,int end,String str) //替换
public String substring(int start,int end) //截取
StringBuffer 和 String的相互转换
String -> StringBuffer
构造方法
StringBuffer -> String
toString()方法
Arrays
降序排序
class MyComparator implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}
class Main {
public static void main(String[] args) {
Integer[] arr = { 1, 2, 3, 4 };
// 第一种方法,直接用Collections的reverseOrder方法
// Arrays.sort(arr, Collections.reverseOrder());
// 第二种方法,自定义类重写Comparator接口的compare方法
Arrays.sort(arr, new MyComparator());
}
}
包装类
基本类型与包装类的对应
基本类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
String 和 int 的相互转换
A:String -- int
Integer.parseInt("100");
B:int -- String
int a = 100;
String str = "" + a; //第一种
String str = String.valueOf(a); //第二种
String str = Integer.toString(a); //第三种
进制转换
String -> int
Integer.parseInt("64", 16);
int -> String
Integer.toString(100,16)
数据缓冲池
-128到127之间的数据缓冲池问题
//byte以内的数据有常量池
Integer s1 = 122;
Integer s2 = 122;
System.out.println(s1 == s2); //返回true
System
方法
public static void gc():运行垃圾回收器。
public static void exit(int status):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
public static long currentTimeMillis():返回以毫秒为单位的当前时间
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
正则表达式
常见规则
Pattern类中有明确的规则,这里只选取用的比较多的
A:字符
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
C:预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
功能
// 判断
String类的`public boolean matches(String regex)`
// 分割
String类的`public String[] split(String regex)`
// 替换
String类的`public String replaceAll(String regex,String replacement)`
// 获取 详细看Pattern和Matcher
String s = "I do not love you, could you still love me?";
String reg = "\\b\\w{4}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
Date
方法
Date():根据当前的默认毫秒值创建日期对象
Date(long date):根据给定的毫秒值创建日期对象
转换
Date -- String(格式化)
public final String format(Date date)
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = sdf.format(d);
String -- Date(解析)
public Date parse(String source)
String str = "2008-08-08 12:12:12";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf2.parse(str);
Calendar
方法
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DATE);
//设置日历
public final void set(int year, int month, int date)
//修改某个字段的值
public abstract void add(int field, int amount);
后记
参考资料
next()和nextLine()的区别
java传参的注意事项
sort降序排列
sort降序排列
快捷键
Java编辑器 格式化 Ctrl+Shift+F
标记
2018.4.30 再次修改并复习