目录
- 前言
- 三十二、如何实现对象克隆
- 三十三、抽象方法、静态方法、本地方法
- 三十四、静态方法内部是否可以对非静态的方法的调用
- 三十五、GC的概念、作用与算法
- 三十六、Java中final关键字的用法
- 三十七、String s = new String("xyz");创建了几个对象
- 三十八、接口与抽象类的继承
- 三十九、一个.Java文件是否可以包含多个类(不是内部类)吗
- 四十、匿名内部类是否可以继承其他类?实现接口?
- 四十一、内部类可以引用他的包含类的成员吗?
- 四十二、数据类型之间的转换
- 四十三、如何实现字符串的反转与替换
- 四十四、如何将GB231编码的字符串转换为ISO-8859-1编码的字符串
- 四十五、获取日期和时间
- 四十六、断言(assert)
- 四十七、try{ }catch{ } finally{ }
- 四十八、Java语言如何进行异常处理
- 四十九、运行时异常与受检异常有何不同
- 五十、我们常见的异常
- 五十一、final、finally、finalize的区别
- 五十二、List、Set、Map是否继承Collection接口
- 五十三、阐述ArrayList、Vector、LinkedList
前言
三十二、如何实现对象克隆
1.实现Cloneable接口并重写Object类中的clone()方法
2.实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
三十三、抽象方法、静态方法、本地方法
1.抽象方法需要子类重写
2.静态的方法是无法被重写的
3.本地方法是由本地代码实现的方法
4.synchronized和方法的实现细节有关
三十四、静态方法内部是否可以对非静态的方法的调用
不可以调用,静态方法只能访问静态成员变量,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
三十五、GC的概念、作用与算法
1.概念
GC–垃圾处理器
2.作用
1.自动检测对象是否超过作用域从而达到自动回收的目的。
2.垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。
3.回收机制
分代复制垃圾回收、标记垃圾回收、增量垃圾回收
4.垃圾收集分区
伊甸园、幸存者乐园、终身颐养园
5.垃圾回收的调用
1.System.gc()
2.Runtime.getRuntime().gc()
6.关于GC的方法
1.引用计数
2.可达性分析
三十六、Java中final关键字的用法
1.修饰类:表示该类不能被继承;
2.修饰方法:表示方法不能被重写;
3.修饰变量:表示变量只能一次赋值以后值不能被修改(常量);
三十七、String s = new String(“xyz”);创建了几个对象
两个对象,一个是静态区的“xyz”,一个是用new创建在堆上的对象。
三十八、接口与抽象类的继承
1.接口可以继承接口,而且支持多重继承。
2.抽象类可以实现接口,抽象类可以继承具体类也可以继承抽象类。
三十九、一个.Java文件是否可以包含多个类(不是内部类)吗
可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。
四十、匿名内部类是否可以继承其他类?实现接口?
可以继承其他类或实现其他接口,在Swing和Android开发中,常用此方式来实现事件的监听和回调。
四十一、内部类可以引用他的包含类的成员吗?
一个内部类对象可以访问创建它的外部类成员,包括私有成员。
四十二、数据类型之间的转换
1.如何将字符串转换为基本数据类型
调用基本数据类型对应的封装类中的方法 parseXXX(String)或Value(String)即可返回相应基本类型
2.如何将基本数据类型转换为字符串
1.将基本数据类型与空字符串(“ ”)连接(+)即可获得所对应的字符串
2.调用String类中的valueOf()方法,返回相应字符串。
四十三、如何实现字符串的反转与替换
1.字符串反转
//1.StringBuilder
public static String reverse1(String str) {
return new StringBuilder(str).reverse().toString();
}
//2. toCharArray
public static String reverse2(String str) {
char[] chars = str.toCharArray();
String reverse = "";
for (int i = chars.length - 1; i >= 0; i--) {
reverse += chars[i];
}
return reverse;
}
//3.CharAt
public static String reverse3(String str) {
String reverse = "";
int length = str.length();
for (int i = 0; i < length; i++) {
reverse = str.charAt(i) + reverse;
}
return reverse;
}
public static void main(String[] args) {
String s = "abc123";
System.out.println("----------------");
for (int i = s.length() - 1; i >= 0; i--) {
System.out.print(s.charAt(i));
}
System.out.println("----------------");
System.out.println("变换前: " + s);
System.out.println("变换后: " + reverse1(s));
System.out.println("变换后: " + reverse2(s));
System.out.println("变换后: " + reverse3(s));
}
2.字符串替换
public static void main(String[] args)
{
String article="这是一个测试.";
System.out.println(article);
//把. 换成。
article=article.replace('.','。');
System.out.println(article);
article=article.replace("一个","两个");
System.out.println(article);
article=article.replaceFirst("两个","一个");
System.out.println(article);
}
输出结果:
这是一个测试.
这是一个测试。
这是两个测试。
这是一个测试。
四十四、如何将GB231编码的字符串转换为ISO-8859-1编码的字符串
String s1 = "你好";
String s2 = new String(s1.getBytes("GB231"),"ISO-8859-1");
四十五、获取日期和时间
public static void main(String[] args) {
//获取当前的年、月、日、时、分、秒、毫秒、纳秒
//年
System.out.println(Calendar.getInstance().get(Calendar.YEAR));
//JDK 1.8 java.time 包
System.out.println(Year.now());
System.out.println(LocalDate.now().getYear());
//月
System.out.println(Calendar.getInstance().get(Calendar.MONTH)+1);
//JDK 1.8 java.time 包
System.out.println(MonthDay.now().getMonthValue());
System.out.println(LocalDate.now().getMonthValue());
//日
System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
//JDK 1.8 java.time 包
System.out.println(MonthDay.now().getDayOfMonth());
System.out.println(LocalDate.now().getDayOfMonth());
//时
System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));
//JDK 1.8 java.time 包
System.out.println(LocalTime.now().getHour());
//分
System.out.println(Calendar.getInstance().get(Calendar.MINUTE));
//JDK 1.8 java.time 包
System.out.println(LocalTime.now().getMinute());
//秒
System.out.println(Calendar.getInstance().get(Calendar.SECOND));
//JDK 1.8 java.time 包
System.out.println(LocalTime.now().getSecond());
//毫秒
System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));
//纳秒
System.out.println(LocalTime.now().getNano());
//当前时间毫秒数
System.out.println(System.currentTimeMillis());
System.out.println(Calendar.getInstance().getTimeInMillis());
//某月最后一天
//2018-05月最后一天,6月1号往前一天
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2018);
c.set(Calendar.MONTH, 5);
c.add(Calendar.DAY_OF_MONTH, -1);
System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH)+1) + "-" + c.get(Calendar.DAY_OF_MONTH));
//JDK 1.8 java.time 包
LocalDate date = LocalDate.of(2019, 6, 1).minusDays(1);
System.out.println(date.getYear() + "-" + date.getMonthValue() + "-" + date.getDayOfMonth());
//格式化日期
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(0)));
//JDK 1.8 java.time 包
System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
输出结果:2020
2020
2020
3
3
3
21
21
21
12
12
37
37
48
48
664
664000000
1584765468664
1584765468664
2018-6-20
2019-5-31
1970-01-01 08:00:00
2020-03-21 12:37:48
//获取昨天的时间(前一天 today.minusDays(1),以此类推)
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
LocalDateTime yesterday = today.minusDays(1);
System.out.println(yesterday);
}
输出结果:2020-03-20T12:43:12.372
四十六、断言(assert)
断言是软件开发中一种常用的调试方式,很多开发语言都支持这种机制。断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试开启。为了保证程序的执行效率,在软件发布后,断言通常是关闭的;断言是一个包含Boolean表达式的语句,在执行这个语句时,假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError。
assert (a > 0); //throws an AssertionError if a <=0
1
1
断言可以有两种形式:
assert Expression1;
assert Expression1;Expression2;
Expression1 应该总是产生一个布尔值;
Expression2 可以得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串。
四十七、try{ }catch{ } finally{ }
try{}里的return语句,会被执行,载方法返回调用者前执行。
四十八、Java语言如何进行异常处理
关键字:throws、throw、try、catch、finally
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Trowable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获这个异常并可以对其进行处理。
Java的异常处理是通过五个关键字来实现的:throws、throw、try、catch、finally
一般情况下用try来执行一段程序,如果系统抛出(throw)一个异常对象,可以通过他的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理。
throw:明确地抛出一个异常
throws:用来声明一个方法可能抛出的各种异常(声明异常允许无病呻吟)
try:用来指定一块预防所有异常的程序;
catch:紧跟try后,用来指定你想要捕获的异常类型;
finally:确保一段代码无论发生什么异常的时候都要被执行
try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入到异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。
四十九、运行时异常与受检异常有何不同
运行时异常:虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
受检异常:与程序运行的上下文环境有关,即使程序设计无误,仍然可能因为使用的问题而引发。
Java编译器要求方法必须声明抛出可能发生的受检异常,但不要求必须声明抛出未被捕获的运行时异常。
五十、我们常见的异常
异常 | 解释 |
---|---|
NullPointerException | 空指针异常类 |
ClassCastException | 类型强制转换异常 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
SecturityException | 安全异常 |
FileNotFoundException | 文件未找到异常 |
Runtime Exception | 运行时异常 |
ArithmeticExecption | 算数异常类 |
IllegalArgumentException | 非法参数异常 |
五十一、final、finally、finalize的区别
1.final:之前有过叙述,这里就不多赘述了
2.finally:放在try…catch…后,构造总是执行代码块,意味着无论程序正常执行还是发生异常,这里的代码只要JVM不关闭就能执行,可以将释放外部资源的代码写在finally中
3.finalize:Object类中的定义的方法,Java中允许使用finalize()方法在GC将对象从内存中清除出去之前做必要的清理工作。这个方法是由GC在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
五十二、List、Set、Map是否继承Collection接口
1.List、Set是继承Collection接口;
2.Map是键值对映射容器;
3.与List、Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。