1:面试题:
在Java中获取一个类的字节码文件对象的方式有几种?
有三种:
1)public final Class getClass():获取正在运行的类; (返回字节码文件对象)
2)在Java中任意类型的class属性 举例: Class c = 类名.class
3)Class类提供的一个静态方法
public static Class forName(String classPathName) :参数为当前类的全限定名称
2:Object类的toString()
public String toString():返回对象的字符串表示形式。
结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法(否则,打印出来的是地址值!)
public int hashCode():返回对象的哈希码值,不同的对象,它的哈希码值不同
(理解为 "地址值",它不是实际意义的地址值----通过哈希算法算出来的)
3:Object的克隆方法:创建并返回此对象的"副本"----前提是自定义的类型必须实现Cloneable接口,否则无法克隆!
protected Object clone() throws CloneNotSupportedException
如果一个接口没有成员变量,连成员方法都没有,将这类接口称为"标记接口"
Cloneable接口:某个类如果能够实现这个接口,那么这个类对象就可以克隆!
4:Object类的垃圾回收方法
protected void finalize()throws Throwable--跟gc垃圾回收器有关系
当jvm开启垃圾回收器的时候,就会回收堆内存中没有更多引用的对象(new 出来的东西)
当前垃圾回收器开始运行,会调用Object类的finalize()方法,来回收对象,子类重写了,会调用子类的finalize方法
5:String类:代表字符串,是一个常量,创建之后,其值不能更改!
举例:
String s = "abc" ; 格式 开发中定义字符串就这个格式!
字符串的底层就是一个字符数组组成!char[]--->String
构造方法:
public String():创建字符串对象
public String(String original):将指定的字符串传进去,构造一个字符串对象
public String(char[] value):将字符串数组---构造成String
public String(char[] value,int offset,int count):将一部分字符数组转换成String
public String(byte[] bytes)将字节数组---构造成String
public String(byte[] bytes, int offset,int length):将一部分字节数组---构造成String
如果存在类型转换问题:
已知char[]--->String public String(char[] value)
已知byte[]--->String public String(byte[] bytes)
如果仅仅表示定义一个String对象---推荐的格式
String 变量名 = "字符串常量" ;
6:考点:
==和equals的区别:
==:连接的是两个引用类型的数据,比较的是两个对象的地址是否相同
Object的equals():默认比较的是两个对象的地址值是否相同,子类重写了equals(),就比较两个对象的内容是否相同
字符串常量相加:
先相加,然后看结果,是否在常量池中,如果有,直接返回值地址;否则开空间
字符变量相加:
先在常量池开辟空间,然后在操作;
7:String类中常用的获取功能:
1)public char charAt(int index) 获取指定索引值对应的字符
2)public int length() :字符串特有功能:获取字符串长度
3)public String concat(String str):拼接功能 将指定的字符串拼接到该字符串末尾,获取新的字符串
4)public int indexOf(String str)返回指定字符串第一次出现索引值
public int lastIndexOf(String str):返回指定子字符串最后一次出现的索引值
5)public String[] split(String regex):字符串拆分功能
6)截取功能
public String substring(int beginIndex,int endIndex)
从指定位置开始,截取到endIndex-1处结束,包前不包后
public String substring(int beginIndex)
从指定位置开始默认截取到末尾!
8:String类的常用的转换功能
public byte[] getBytes(): 将字符串转换成字节数组 (编码过程:将能看懂的东西--->变成看不懂的!)
(使用平台默认字符集)
public char[] toCharArray() :将字符串转换成字符数组 (使用居多)
public static String valueOf(常见的基本类型int/long/double/float/boolean/Object):
String的万能方法:将上面的常用类型--转换成String
public String toUpperCase():将指定字符串转换成大写
public String toLowerCase():将指定字符串转换成小写
9:String类判断功能以及其他功能:
public boolean constains(String str):判断大串中是否包指定的子字符串
public boolean equals(Object anObject)):比较两个字符串内容是否相同
public boolean equalsIgnoreCase(String anotherString)):忽略大小写比较
public boolean startsWith(String prefix):字符串是否以指定的前缀开头
public boolean endsWith(String str):字符串是否以指定的后缀结尾
其他功能:
public String replace(char oldChar,char newChar)替换功能:使用指定的新的字符替换以前的字符
public String trim():删除前后两端空格
应用场景:trim(): 使用io(intput输入 Output输出)流进行 读写复制(文件内容在网络中传输)
文件内容前后有一些空字符出现,获取到文件内容之后,先去trim()去除两端空格
10:面试题:
String s1 = "hello" ;
String s2 = "hel" ;
这个两个字符串按照字典顺序比较结果是怎么计算的?
--->两个字符串--->底层是以字符数组存储-获取字符数组长度,获取长度的最小值
使用最小值作为 while循环条件, 如果没有取到最小值,一直循环,
循环逻辑:
通过获取两个字符数组的每一个字符,如果都相同,最终临界条件达到 ,两个字符数组长度相减
如果获取到字符,如果两个字符不相等,直接是两个字符---对应的ASCII码表的值相减---直接得到字典顺序的值!
11:面试题:
s1和s2有什么区别?
String s1 = "hello" ;
String s2 = new String("hello") ;
第一个格式:
创建一个对象,直接在常量池中创建;
第二个格式:
需要在堆内存开辟空间,而且指向常量池地址:内存创建了两个对象!
两个都是创建字符串实例,但是推荐第一种,从内存角度考虑,消耗内存资源不严重!
12:System类
java.lang.System:不能实例化:提供了静态字段(静态变量)
public static final PrintStream out :标准 打印输出流
public static final PrintStream err 标准错误输出流
public static final InputStream in 标准输入流
System类常用的成员方法:
public static long currentTimeMillis() 计算当前系统时间毫秒值 (很少单独用)
用来计算当前某个程序的时间复杂度(运行效率)
public static void gc() 收到开启垃圾回收器 ---会调用finalize(),回收没有更多引用的对象
public static void exit(int status): 参数为0:终止jvm
public static void arraycopy(
Object src, //原对象
int srcPos, //原对象中的某个位置
Object dest, //目标对象
int destPos, //目标对象的某个位置
int length) //指定的长度
13:BigDecimal这个类是对小数可以进行精确计算的!
构造方法:
public BigDecimal(String val):将String类型数据构造成BigDecimal
将double数据---使用"小数字符串"
成员方法:
public BigDecimal add(BigDecimal augend):求和
public BigDecimal subtract(BigDecimal subtrahend):相减
public BigDecimal divide(BigDecimal divisor):小数除法
public BigDecimal divide(BigDecimal divisor,int roundingMode):除法,第二个参数舍入模式
BigDecimal提供的模式 public static final int ROUND_HALF_UP:四舍五入
...
public BigDecimal divide(BigDecimal divisor,
int scale,//保留几位小数
int roundingMode) //舍入模式
public BigDecimal multiply(BigDecimal multiplicand):乘法
14:java.util.Random:伪随机数生成器 可以产生随机数 比Math.random()麻烦
两个构造方法:
public Random() :无参构造方法(推荐)
public Random(long seed):有参构造,创建一个指定long类型的变量的随机数生成器
两个成员方法:
public int nextInt(): 产生伪随机数在,取值是int类型 的范围内
public int nextInt(int n):产生0-n之间的随机数(推荐)
15:StringBuffer的添加/删除的功能
添加:
public StringBuffer append(任意java类型) 可以将任意类型的元素添加(在末尾追加)到字符串缓冲区中,返回值是字符串缓冲区本身
public StringBuffer insert(int offset,任意java类型):在指定位置处的序列前面插入新的序列
删除:
public StringBuffer deleteCharAt(int index):在指定位置处删除指定的字符,返回字符串缓冲区本身
public StringBuffer delete(int start,int end):从指定位置start处开始到end-1处的字符序列删除,返回值字符串缓冲区本身
开发中使用居多:追加功能以及删除 deletCharAt(int index)使用居多
StringBuffer的特有功能:
public StringBuffer reverse() :字符串缓冲区反转功能,将字符串缓冲区中所有的字符序列反转!
16:StringBuffer其他功能:
替换功能
public StringBuffer replace(int start,int end,String str)
使用指定的字符串str从指定位置开始到end-1处进行替换,返回该字符串缓冲区本身
public String substring(int start):从指定位置开始截取,默认截取到末尾,返回被截取后的字符串
public String substring(int start,int end):从指定位置开始截取到指定位置end-1处,返回被截取后的字符串
17:面试题:
String和StringBuffer的区别?
String特点:字符串是一个常量,一旦被创建,其值不能被更改
String作为形式参数,形参的改变不会影响实际参数;
而除过String这个引用类型之外,形式参数的改变直接影响实际参数!
StringBuffer特点:
字符串缓冲区支持可变的字符串,线程安全,执行效率低!
18:Iterator iterator():Collection专有迭代器(遍历集合) (过渡)
Iterator迭代器接口:
boolean hasNext(): 判断迭代器里面是否下一个可以遍历的元素
E next():获取迭代器的下一个元素 (和迭代器中的类型一致)
19:数组长度是固定的,如果这个需求在变化,又需要存储10个学生,这个时候数组不适合长度可变的需求
集合:
集合是一个容器,它可以存储不同数据类型的元素,但是这些元素必须为引用数据类型,集合长度可变!
集合和数组区别?
1)长度区别
数组:固定
集合:可变
2)存储数据类型的区别?
数组:可以存储基本数据类型,也可以存储引用数据类型
集合:只能存储引用类型 集合<泛型>
3)存储元素的区别?
数组:数组存储的元素的数据类型必须一致
集合:如果没有明确<泛型>,可以存储任意的引用类型(包含Object)
20:增强for:是在集合/数组中存储的引用类型中使用居多,代替集合迭代器的,简化书写代码
格式:
for(集合中存储的数据类型 变量名 : 集合对象){
使用这个变量名即可;
}
注意:
要使用增强for遍历集合,集合对象不能null;
防止空指针异常,在使用增强for之前,对集合进行非空判断!
21:List集合特点:
元素有序(存储和取出一致),而且元素可以重复!
22:Set集合:
元素唯一的,无序(存储和取出不一致)
23:List集合是Collection集合的子接口,它集合遍历方式:
1)Collection的Object[] toArray()
2)Collection的Iterator iterator() ;
3)使用size()+ 存储的数据类型 get(int index)通过角标获取元素内容 :普通for循环格式
4)ListIterator listIterator()List集合的专有遍历方式 :列表迭代器
5)增强for循环
24:使用List集合解决并发修改异常
解决方案:
1)集合遍历,集合添加
2)迭代器遍历,迭代器添加元素
List继承Collection--->Iterator是Collection的专有迭代器,没有提供添加功能,而
List集合专有遍历方式ListIterator:列表迭代器
25:Vector:底层数组,查询快,增删慢,线程安全的,执行效率低!
Vector集合的特有功能:
遍历方式:Collection的Object[] toArray()
Collection的Iterator iterator()
List接口提供的 size()+get(int index)
List接口提供的ListIterator listiterator()
特有遍历方式
public Enumeration elements()--->相当于集合的迭代器
Enumeration接口:枚举组件
boolean hasMoreElements()---->相当于boolean hasNext()
E nextElement() ---->相当于E next()
public E elementAt(int index)--->相当于List的get(int index)+size方法相结合
增强for
添加:
public void addElement(E obj)--->相当于List的add()
public E elementAt(int index)--->相当于List的get(int index)
26:Set接口特点:
无序(存储和取出不一致),不能保证迭代次序,但是可以唯一!
HashSet : 存储和取出,保证元素唯一!
---底层是HashMap实例(哈希表)
TreeSet : 存储和取出,同时需要进行排序的取出!
---底层是依赖TreeMap实例(红黑树结构)
HashSet集合依赖于HashMap---->间接与hash()---->依赖于hashCode(),put()方法--->equals方法
存储String类型,字符串重写过来equals和hashCode(),元素唯一!