基础
(byte,short,char——(int—long—float—double
简单数据类型之间的转换又可以分为:
1、低级到高级的自动类型转换
2、高级到低级的强制类型转换
3、包装类过渡类型能够转换
switch语句能否作用在byte上,能否作用long上
因为switch(exp)中只能表达一个整数表达式或者枚举常量,int和Integer是可以的,由于byte,char等都可以隐式地转换为int,而long和String明显不行。
使用接口的好处?接口和抽象类的区别
接口主要实现规范和多态
规范:比如要组装一台电脑,我的内存的插口上只能插内存,但是只要是这个规格的内存,什么牌子的我不在乎,他们的功能一样活着相似。而多态的话,就可以较好的提升程序的拓展性,比如猫和狗都有吃的功能,现在我只要都实现继承动物的吃的功能就好了,不管是调用猫还是狗的吃的功能我都不用再改写程序了,所以对拓展性较好。
集合有什么好处?什么时候用数组什么时候用集合?
集合的功能较多,可以用来存放数据,而数组很简单就是只是用来存放数据,占用内存比较少,运行效率高一些。
遍历集合的时候一般用迭代器iterator,效率会高一点,for的话什么都可以用。
Char能储存汉字,占用两个字节。
当用final修饰的时候,引用的变量不能变,而引用变量的内容还是可以改变的
Final StringBuffer a=new StringBuffer("immutable");
a=new StringBuffer(""); 这句话是错的
但是a.append("broken!");是正确的
==和equals
==是比较值是否相同,而equals比较的是对象里的内容
不可以从静态方法内部调用一个非static方法
Integer是int的封装内,int的默认值是0,而Integer的默认值是null。而且Integer里面有更多的方法。
Overload和Override
一个是重载,一个是重写
Overload表示一个类中可以有多个名字相同的方法,只是参数或者参数的顺序不同。
Override一般是覆盖之前的方法,是一个全新的方法
接口和抽象类的区别
接口可以实现多个,但是抽象类只可能有一个
抽象类,使部分抽象,它是可以带有一些有方法体的方法的
接口,的所有方法都是抽象的
抽象类是模板,接口是规范
列出几个不同的地方:
抽象类可以有构造方法,接口中没有
抽象类中有成员变量,而接口中没有
1质量高,可重用性高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
2效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。比如叫网管买电脑这个例子
3易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
关于序列化接口的id
hashCode
hashCode一般和equals方法一起用,主要是判断两个是否完全相同,在hashMap和set集合中,里面就用到了,因为这两个集合中是不允许完全相同的。
Aop是什么?
面向方面的编程,贯穿到系统的各个模块中的系统一个功能就是一个模块,比如记录日志,统一异常处理,事物处理等都是。
就是把系统的一个方面的功能封装成对象的形式来进行处理。
面向对象的四个特征:封装,继承,抽象(是指将相似的给抽取出来),多态
不能继承的类是带有fianal 的,比如String ,StringBuffer都不行
String和StringBuffer的区别
一个是可以更改内容的,还有一个是不能更改内容的
StringBuilder是线程不安全,但是运行效率高,StringBuffer是线程安全但是运行效率低
当有在try中有return,finally中也有return的时候,先执行try中的return,但是并不直接执行,而是等finally中return执行后再返回结果。
RuntimeException和Exception
前者是表示虚拟机的通常操作可能遇到的异常,是一种常见的运行错误。Java中一定要声明发生的非运行时异常,单是运行时异常不一定要声明
Error和exception的区别
Error是不能挽回的错误,比如内存溢出,exception是设计或者实现的问题。
关于java的异常:
所有的异常的根类为java.lang.Trowable
下面又分为Error和Exception
Error是程序本身无法解决的问题,包括内存溢出和线程死锁的问题等系统问题
,Excetion又分为系统异常和普通异常,系统异常有数组脚本越界ArrayIndexOutOfBoundsException
空指针,类转化异常等等,而且这几个都是RuntimeException
而普通异常时用户能够克服的问题,比如网络断线,硬盘空间不够等等
关于java实现线程的方法
主要有两种:继承Thread类和实现Runnable接口,使用synchronized关键字修饰同步方法。
Sleep()和wait()的区别
Sleep是thread方法,保持监控状态,但是会把执行权交给其他线程,到时候会自动恢复,调用sleep方法不会释放对象锁,wait是Object的方法,调用的话就会放弃本线程的对象锁,进入等待释放锁的队列,只有针对此对象而且只有针对此对象发出notify或者notifyall的方法的时候才会进入准备获得锁的状态。
ArrayList和Vector的区别
都是有序的集合,并且允许重复
1,同步性问题,ArrayList是不同步的,Vector是同步的,
2,数据的增长,空间不够用时,Vector增长原来1倍,ArrayList增长原来的0.5倍,
HashMap和HashTable的区别
1,同步性,HashMap是线程不安全的
2,HashMap可以将null作为entry的key或者value,而HashTable不可以。
List和Set是继承Collection的,而Map不是。
Map是无序的,key是不能有重复的
注意,这里还真不知道,set的add方法有返回一个Boolean的值,因为不可重复,所以不一定能插入成功。
Collections是一系列的静态方法集合的搜索,排序,线程安全化等操作
字符流是字节流的包装,底层都是用的字节流
要将java对象存储到硬盘或者传送给网络上的其他计算机,一种我们本身可以自己使用outputStream的writeObject来做,或者我们可以实现序列化接口,这样javac编译时就会进行特殊处理,编译的类才会被writeObject()方法操作。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。
Heap堆
Stack栈
当一个方法进入内存时,内部的局部变量时是放在栈内存中的,方法结束时就释放,而用new 创建的一般是放在堆内存中的,但是方法中的局部变量用final修饰之后就是放在堆内存中的
GC,一旦程序员创建了一个对象之后,GC就开始监控这个对象,是一个守护线程,当他认为这个对象已经死亡或者长时间没有使用的时候就会对其进行清除和回收。
当程序员创建了一个对象,虽然不再使用该对象,但这个对象却一直被引用,那么无法被GC回收,就会出现内存泄露,比如缓存系统,我们加载了一个对象在缓存中(全局map),却一直不使用它。
下一篇:框架