JAVA零碎知识点
总结的JAVA零碎知识点
学习和工作中总会有一些零碎的知识点,可能不经常用到或者以前不熟知,在此记录一下。
一、有关Lamda表达式
Lamda表达式是1.8新增特性,所以使用前请确定项目JDK版本是否支持。
Lamda主要解决匿名内部类和函数的啰嗦语句问题,比如曾经的Jframe的Jbutton监听事件addActionListener
JButton jb = new JButton("click"); jb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("1"); } });
可以简化为jb.addActionListener(a -> System.out.println("1"));
1.Lamda语法:
(参数) ->单行语句;
例子:jb.addActionListener((a)-> System.out.println("1"));
(参数) ->{多行语句};注意多个语句的分号。
jb.addActionListener((a) -> { System.out.println("2"); System.out.println("1"); });
(参数) ->表达式;比如某接口返回int型
test((a)-> 5*9);
2.用法,当传入参数是接口,且需要自己实现时,可以用Lamda简化代码。
3.本人并不建议过多使用Lamda,因为会给阅读代码带来很大困扰。
三、JAVA语法糖
语法糖主要目的,为了方便开发和减少开发时、编译期、运行前以及语法错误。
语法糖就是通过二次封装,提供更加简单的操作,比如变长变量,不用程序员定义一个超长参数列表,或者为了不同个数参数定义多个方法。
但是运行时jvm并不认识这些,这些都在编译期进行了解语法糖,并且转成了jvm认识的东西。
比如说变长变量,用的数组,外层封装好之后,编译期通过增强for循环(话说回来,增强型for循环也是语法糖,内部是while遍历迭代器iterator)进行参数置入。
四、有关设计模式
模版模式:定义一个算法结构,而将一些步骤延迟到子类去实现
备忘录模式:在不破坏封装的前提下,保持对象的内部状态
抽象工厂:创建相关或依赖对象的家族,而无需指明具体类
组合模式:将对象组合成树形结构以表示部分和整体的层次结构
单例模式有懒汉(调用时实例化)、饿汉(定义时实例化)、双重锁(即懒汉模式加锁,并在锁内再次判断是否为空)、枚举。
五、有关访问权限
六、有关接口和类的问题
七、Java执行顺序
public class TestOne extends TestTwo { public static ThreeTest demo = new ThreeTest("子类"); public TestOne() { System.out.println("子类构造函数"); } { System.out.println("子类代码块"); } static { System.out.println("子类静态代码块"); } public static void main(String[] args) { new TestOne(); } } class TestTwo { public static ThreeTest demo = new ThreeTest("父类"); public TestTwo() { System.out.println("父类构造方法"); } static { System.out.println("父类静态代码块"); } { System.out.println("父类代码块"); } public static void find() { System.out.println("静态方法"); } } class ThreeTest { public ThreeTest(String flag) { System.out.println(flag + "静态变量构造函数"); } }
问:执行顺序是怎样的。首先Java执行顺序是:
1.有父类:父类静态变量初始化——>父类静态代码块——>子类静态变量初始化——>子类静态代码块——>父类代码块——>父类构造函数——>子类代码块——>子类构造函数
2.只有子类:子类静态变量初始化——>子类静态代码块——>子类代码块——>子类构造函数
八、面试题坑
题目:可以把任何一种数据类型的变量赋给Object类型的变量。判断对错。
答案:正确。虽然基础数据类型不是对象,但可以赋值给Object变量,震惊。
题目:下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试?
java.exe
javadoc.exe
jdb.exe
javaprof.exe
答案:jdb.exe。
解析:
java.exe是java虚拟机
javadoc.exe用来制作java文档
jdb.exe是java的调试器
javaprof.exe是剖析工具
九、有关算法时间复杂度的概念:
算法的时间复杂度是一个函数,它定性描述该算法的运行时间,用O(f(n))表示,即O()。在上学时一直有疑问,明明是O(2n^2+11),却要说时间复杂度是O(n^2),最高阶的常数项、加的常熟没有了。
是因为在比较时间复杂度时,其增长率主要受高阶的影响,如果最高阶存在且不是1,则去掉高阶的常数项及尾随的常数。如O(2n^5+5N+5)复杂度即为O(n^5)
十、牛客网题
今天刷到一个有关内存和引用很直观的题,mark!
以下代码结果是什么? public class foo { public static void main(String sgf[]) { StringBuffer a = new StringBuffer(“A”); StringBuffer b = new StringBuffer(“B”); operate(a, b); System.out.println(a +”.”+b); } static void operate(StringBuffer x, StringBuffer y) { x.append(y); y = x; } }
答案是AB.B。往方法中传参,传的仅仅只是地址,而不是实际内存,所以不要以为y=x程序的执行,是 b=a的执行。这两者是不相等的
十一、有关于Integer比较
Interger的范围时[-128,127],在这个范围内比较大小,相等为true,超过范围为false。
在JDK1.8中,如果用Integer.valueOf();也会判断是否是小于-128或大于127才会创建新的实例,否则直接用常量池的。但是要注意,只要new Integer那就一定创建了新的引用。
十二、有关try catch finally
在try语句块或catch语句块中执行System.exit(0)会直接退出而不执行finally块。
十三、有关URL类
执行URL url = new URL("www.aaa.com");时,不管www.aaa.com是否存在,url的值都是www.aaa.com。如果格式异常则会抛出MalformedURLException异常。
十四、语法总结
1.抽象类可以包括抽象方法和非抽象方法。
2.只要有抽象方法,则所属类必须是抽象类。
3.JAVA中整数相除,比如13/5,结果只取整,不四舍五入,即结果为2。
4.Object中的方法:hashCode、equals、toString、clone、notify、notifyall、wait、finalize、getClass。
5.Math.Floor(double d);向下取整方法会返回double数值。传入参数也可为int。
十五、零碎知识点
1.hashCode和equals关系:hashCode方法是返回hash码(散列码),equals是判断两个对象是否相等。重写了equals必须重写hashCode,因为equals相等的对象其hashCode也必须相等。而hashCode相等不代表equals相等,因为hashCode是可以冲突的。比如重写某类的equals方法可以复用String对象的equals,所以很有必要重写hashCode。