Java复习,Java知识点以及Java面试题(三)
Object
类层次结构的跟类,每个类都使用Object作为超类,每个类都直接或者间接继承于Object
构造方法 public Object()
成员方法 :
public int hashCode():返回该对象的哈希码值,哈希值是根据哈希算法计算出来,于地址值有关
public final Class getClass(): 返回此Object类的运行时类
toString() 返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示。 这个表示其实是没有意义的,一般子类都会重写该方法。 可以自动生成
equals()比较两个对象是否相同。默认情况下,比较的是地址值是否相同。
而比较地址值是没有意义的,所以,一般子类也会重写该方法。可以自动生成。
finalize() 用于垃圾回收,在不确定的时间
clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。
直接输出一个对象名称,其实默认调用了该对象的toString()方法。
面试题
==和equals()的区别?
A:==
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
B:equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。
但是,我们可以根据自己的需要重写该方法。
String
构造方法:public String()
public String(byte[] bytes)
public String(byte[] bytes,int offset,int length)
public String(char[] value)
public String(char[] value,int offset,int count)
public String(String original)
面试题:
字面值作为字符串对象和通过构造方法创建对象的不同
String s = new String("hello");和String s = "hello"的区别?
前者创建两个对象后者创建一个对象
1 /* 2 * 看程序写结果 3 */ 4 public class StringDemo3 { 5 public static void main(String[] args) { 6 String s1 = new String("hello"); 7 String s2 = new String("hello"); 8 System.out.println(s1 == s2);// false 9 System.out.println(s1.equals(s2));// true 10 11 String s3 = new String("hello"); 12 String s4 = "hello"; 13 System.out.println(s3 == s4);// false 14 System.out.println(s3.equals(s4));// true 15 16 String s5 = "hello"; 17 String s6 = "hello"; 18 System.out.println(s5 == s6);// true 19 System.out.println(s5.equals(s6));// true 20 } 21 }
1 /* 2 * 看程序写结果 3 * 字符串如果是变量相加,先开空间,在拼接。 4 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。 5 */ 6 public class StringDemo4 { 7 public static void main(String[] args) { 8 String s1 = "hello"; 9 String s2 = "world"; 10 String s3 = "helloworld"; 11 System.out.println(s3 == s1 + s2);// false 字符串拼接是先开了一个空间(X002)然后在进行拼接而不是直接指向s3所指向的那个位置(X001)(方法区的常量池中).所以地址值不一样,false。 12 System.out.println(s3.equals((s1 + s2)));// true 13 14 System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true 15 System.out.println(s3.equals("hello" + "world"));// true 16 17 // 通过反编译看源码,我们知道这里已经做好了处理。 18 // System.out.println(s3 == "helloworld"); 19 // System.out.println(s3.equals("helloworld")); 20 } 21 }
与判断功能相关的方法
boolean equals(object obj):
boolean equalsIgnoreCase(String str):
boolean contains(String str):
boolean startwith(String str):
boolean endswith(String str):
boolean isEmpty();
与获取相关的方法
int length();获取字符串的长度。
char charAt(int index):获取指定索引位置的字符
int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
int indexOf(int ch, int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
int indexOf(String str, int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
String substring(int start):从指定位置开始截取字符串,默认到末尾。
String substring(int start, int end):从指定位置开始到指定位置结束截取字符串。
字符串的遍历:
1. charAt()获取每个字符,length()用来循环
2. toCharArray() 转换成字符数组,在对数组进行遍历
与转换相关的方法
byte[] getBytes():把字符串转换为字节数组。
char[] toCharArray():把字符串转换为字符数组。
static String valueOf(char[] chs):把字符数组转成字符串。
static String valueOf(int i):把int类型的数据转成字符串。
String toLowerCase():把字符串转成小写。
String toUpperCase():把字符串转成大写。
String concat(String str):把字符串拼接。
其他常用方法
String replace(char old, char new)
String replace(String old, String new)
String trim()
int compateTo(String str)
int compareToIgnoreCase(String str)
StringBuffer
线程安全的可变字符串
StringBuffer和String的区别? 前者长度和内容可变,后者不可变。如果使用前者做字符串的拼接,不会浪费太多的资源。
构造方法:StringBuffer的构造方法:
public StringBuffer():
public StringBuffer(int capacity):
public StringBuffer(String str):
StringBuffer的方法:
public int capacity():
public int length():
添加: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 StringBuffer reverse()
截取:public String substring(int start):
public String substring(int start, int end):
String和StringBuffer相互转换:
StringBuffer的构造方法 public StringBuffer(String str):
StringBuffer的append方法;
String的构造方法 public String(StringBuffer buffer):
StringBuffer的toString方法;
StringBuilder
线程不安全的可变字符串
面试题:
String, StringBuffer, StringBuilder的区别?
String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的
StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
StringBuffer和数组的区别?
两者都可以看出是一个容器,装其他的数据
但是StringBuffer的数据最终是一个字符串数据
而数组可以放置多种数据,但是必须是同一种数据类型
1 /* 形式参数问题 2 * String作为参数传递 3 * StringBuffer作为参数传递 4 * 5 * 形式参数: 6 * 基本类型:形式参数的改变不影响实际参数 7 * 引用类型:形式参数的改变直接影响实际参数 8 * 9 * 注意: 10 * String作为参数传递,虽然String是引用类型但是效果和基本类型作为参数传递是一样的。 11 * SreingBuffer运用赋值符号时形式参数的改变不影响实际参数。运用append()方法时,形式参数的改变直接影响实际参数 12 */ 13 public class StringBufferDemo { 14 public static void main(String[] args) { 15 String s1 = "hello"; 16 String s2 = "world"; 17 System.out.println(s1 + "---" + s2);// hello---world 18 change(s1, s2); 19 System.out.println(s1 + "---" + s2);// hello---world 20 21 StringBuffer sb1 = new StringBuffer("hello"); 22 StringBuffer sb2 = new StringBuffer("world"); 23 System.out.println(sb1 + "---" + sb2);// hello---world 24 change(sb1, sb2); 25 System.out.println(sb1 + "---" + sb2);// hello---worldworld 26 27 } 28 29 public static void change(StringBuffer sb1, StringBuffer sb2) { 30 sb1 = sb2; 31 sb2.append(sb1); 32 } 33 34 public static void change(String s1, String s2) { 35 s1 = s2; 36 s2 = s1 + s2; 37 } 38 }
Arrays
针对数组进行操作的工具类
public static String toString(int[] a):
public static void sort(int[] a): 底层快排实现
public static int binarySearch(int[] a, int key):
基本类型包装类
Integer
构造方法:public Integer (int value)
public Integer (String s)
1 /* 2 * int类型和String类型的相互转换 3 * 4 * int -- String 5 * String.valueOf(number) 6 * 7 * String -- int 8 * Integer.parseInt(s) 9 */ 10 public class IntegerDemo { 11 public static void main(String[] args) { 12 // int -- String 13 int number = 100; 14 // 方式1 15 String s1 = "" + number; 16 System.out.println("s1:" + s1); 17 // 方式2 18 String s2 = String.valueOf(number); 19 System.out.println("s2:" + s2); 20 // 方式3 21 // int -- Integer -- String 22 Integer i = new Integer(number); 23 String s3 = i.toString(); 24 System.out.println("s3:" + s3); 25 // 方式4 26 // public static String toString(int i) 27 String s4 = Integer.toString(number); 28 System.out.println("s4:" + s4); 29 System.out.println("-----------------"); 30 31 // String -- int 32 String s = "100"; 33 // 方式1 34 // String -- Integer -- int 35 Integer ii = new Integer(s); 36 // public int intValue() 37 int x = ii.intValue(); 38 System.out.println("x:" + x); 39 //方式2 40 //public static int parseInt(String s) 41 int y = Integer.parseInt(s); 42 System.out.println("y:"+y); 43 } 44 }
面试题
1 /* 2 * 看程序写结果 3 * 4 * 注意:Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据,否则就创建一个新的空间 5 */ 6 public class IntegerDemo { 7 public static void main(String[] args) { 8 Integer i1 = new Integer(127); 9 Integer i2 = new Integer(127); 10 System.out.println(i1 == i2); 11 System.out.println(i1.equals(i2)); 12 System.out.println("-----------"); 13 14 Integer i3 = new Integer(128); 15 Integer i4 = new Integer(128); 16 System.out.println(i3 == i4); 17 System.out.println(i3.equals(i4)); 18 System.out.println("-----------"); 19 20 Integer i5 = 128; 21 Integer i6 = 128; 22 System.out.println(i5 == i6); //false 23 System.out.println(i5.equals(i6)); //true 24 System.out.println("-----------"); 25 26 Integer i7 = 127; 27 Integer i8 = 127; 28 System.out.println(i7 == i8); //true 29 System.out.println(i7.equals(i8)); //true 30 31 // 通过查看源码,我们就知道了,针对-128到127之间的数据,做了一个数据缓冲池,如果数据是该范围内的,每次并不创建新的空间 32 // Integer ii = Integer.valueOf(127); 33 }
Byte
Short
Long
Float
Double
Character
构造方法:public Character(char value)
public static boolean isUpperCase(char ch):判断给定的字符是否是大写字符
public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符
public static boolean isDigit(char ch):判断给定的字符是否是数字字符
public static char toUpperCase(char ch):把给定的字符转换为大写字符
public static char toLowerCase(char ch):把给定的字符转换为小写字符
Boolean
正则表达式:
Pattern类:正则表达式的编译表示形式
正则表达式规则:
A:字符 x 字符 x。举例:'a'表示字符a \\ 反斜线字符("\")。 \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') B:字符类 [abc] a、b 或 c (3者选其一)(简单类) [^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 单词边界 就是不是单词字符([a-zA-Z_0-9])的地方。 举例:hello world?haha;xixi 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的使用
Math
成员变量:
public static final double PI
public static final double E
成员方法
public static int abs(int a):绝对值
public static double ceil(double a ):向上取整
public static double floor(double a):向下取整
public static int max(int a, int b):返回最大值
public static double pow(double a, double b):平方根
public static double random():产生0到1随机数
public static int round(float a):四舍五入
public static double sqrt(double a):正平方根
Random
构造方法:public Random(): 没有给种子,用的是默认种子,是当前时间的毫秒值
public Random(long seed): 给出指定的种子 给定种子后随机出来的数是固定的
成员方法:public int nextInt():
public int nextInt(int n):
System
无构造方法,不能被实例化
成员方法:public static void gc(): 运行垃圾回收器
public static void exit(int status): 终止当前正在运行的java虚拟机,参数用作状态码;根据惯例,非 0 的状态码表示异常终止。即表示0状态码表示正常终止。
public static long currentTimeMillis():返回以毫秒为单位的当前时间[可以用来计算程序运行的时间]
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length): 用于将一个数组的元素快速拷贝到另一个数组
BigInteger
构造方法:BigInteger(String val)
成员方法:
public BigInteger add(BigInteger val):加
public BigInteger subtract(BigInteger val):减
public BigInteger multiply(BigInteger val):乘
public BigInteger divide(BigInteger val):除
public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
BigDecimal
由于在运算的时候,float类型和double很容易丢失精度,为了能精确的表示、计算浮点数,Java提供了BigDecimal。BigDecimal类:不可变的、任意精度的有符号十进制数,可以解决数据丢失问题。
构造方法:public BigDecimal(String val)
成员方法:public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor)
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):商,几位小数,如何舍取
Date
构造方法:Date():根据当前的默认毫秒值创建日期对象
Date(long date):根据给定的毫秒值创建日期对象
成员方法:public long getTime(): 获取时间,以毫秒为单位
public void setTime(long time):设置时间
DateFormat
Date -- String(格式化)
public final String format(Date date)
String -- Date(解析)
public Date parse(String source)
DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体子类SimpleDateFormat。
SimpleDateFormat的构造方法:
SimpleDateFormat():默认模式
SimpleDateFormat(String pattern):给定的模式(该模式为:年 y月 M 日 d时 H分 m秒 s)
Calendar
抽象类,使用Calender.getInstance()获取子类对象
public int get (int field): 返回给定日历字段的值,日历类中的每个日历字段都是静态的成员变量,并且是int类型。
public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
public final void set(int year,int month,int date):设置当前日历的年月日