面霸吕国栋之:整理的一些面试题
继承
1、继承的目的是扩展类的功能2、java中一个子类只能继承一个父类
3、java不允许多重继承,允许多层继承
4、父类中private方法不能在子类中被default覆写,如果子类中有重名的方法,那不叫覆写,而是重新
定义了一个方法。
5、父类和子类中定义同名的属性,子类会覆盖父类中的属性,super.getA()调用的是父类中的属性。
this.getA()调用的是子类的属性
重载和覆写的区别
1、单词:overloading overriding2、定义:方法名称相同,参数的类型或者个数不同 方法的名称参数的类型返回值的类型等都相同
对权限没有要求 被覆写的方法不能有子类方法更严格的权限
3、范围:发生在同一个类中 发生在继承类中
super关键字
表示的是从子类调用父类中的指定操作,例如:调用属性、方法、构造等。因为在子类的实例化过程中,会默认调用父类中的无参构造方法,如果现在希望调用有参构造,则必须在子类中指明要调用的有参构造方法。例如:super(name,age)this 和 super的区别
1、属性访问:this访问本类中的属性,如果本类中没有此属性,则从父类中继续查找 super是访问父类中的属性。2、访问方法:this访问本类中的方法,如果本类中没有此方法,则在父类中查找。 super是直接访问父类中的方法。
3、调用构造:this调用本类中的构造,必须放在构造方法的首行。 super调用父类构造,必须放在子类方法的首行。
4、this表示的当前对象。
5、this和super两个关键字在构造中不能同时出现。
math类的用法
1. Math.abs(int a):返回值的绝对值。参数可以的类型int 、float、double、long2. Math.acos(double a):返回角的反余弦。
3. Math.asin(double a):返回角的反正弦。
4. Math.atan(double a):返回角的反正切。
5. Math.atan2(double a):将矩形坐标(x,y)转换成极坐标(r,theta)。
6. Math.cbrt(double a):返回double 值的立方根。
7. Math.ceil(double a):返回最小的(最接近负无穷大)double值,该值大于或等于参数,并且等于某个整数。
8. Math.cos(double a):返回角的三角余弦。
9. Math.cosh(double x):返回double 值的双曲线余弦。
10. Math.exp(double a):返回欧拉数e 的double 次幂的值。
11. Math.floor(double a):返回最大的(最接近正无穷大)double 值,该值小于或等于参数,并且等于某个整数。
12. Math.max(int a,int b):返回两个值中较大的一个值。参数包含的类型 int、float、long、double。
13. Math.min(int a,int b):返回两个值中较小的一个值。参数包含的类型 int、float、long、double。
14. Math.random():返回带正号的double值。
15. Math.round(double a):返回最接近参数的long。
16. Math.round(float a):返回最接近参数的int。
int除法的问题
12/10=112f/10=1.2
12d/10=1.2
12/10f=1.2
12/10d=1.2
------------Double型----------
2.3/0.0 = Infinity
2.3/-0.0 = -Infinity
0.0/0.0 = NaN
0.0/-0.0 = NaN
0.0/0.1 = 0.0
0.0/-0.1 = -0.0
------------Float型----------
2.3/0.0 = Infinity
2.3/-0.0 = -Infinity
0.0/0.0 = NaN
0.0/-0.0 = NaN
0.0/-0.1 = -0.0
几个设计模式
1、工厂模式2、模板方法模式:模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 T模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1)模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。
2)在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。
3、单例模式
public class Singleton { private static final Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { synchronized (Singleton.class) { if (singleton== null) { singleton= new Singleton(); } } } return singleton; } }
第一个条件是说,如果实例创建了,那就不需要同步了,直接返回就好了。
不然,我们就开始同步线程。
第二个条件是说,如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用再创建了
static 用法
一般调用static属性的时候,采用“类名称.属性”的方式static方法不能调用非static属性,也不能调用非static方法, 因为static的属性和方法在对象没有实例化之前就已经初始化了。
其他的应用:可以统计一共产生了多少个对象。
java中的内存空间类型
栈内存:保存对象的名称,也就是访问堆内存的地址堆内存:保存每个对象的基本属性
全局数据区:保存static类型的属性
全局代码区:保存所有方法的定义
hashmap与hashtable区别
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
forward和redirect的区别
答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
js截取字符串
函数:split()功能:使用一个指定的分隔符把一个字符串分割存储到数组
例子:
str=”jpg|bmp|gif|ico|png”;
arr=theString.split(”|”);
//arr是一个包含字符值”jpg”、”bmp”、”gif”、”ico”和”png”的数组
函数:John()
功能:使用您选择的分隔符将一个数组合并为一个字符串
例子:
var delimitedString=myArray.join(delimiter);
var myList=new Array(”jpg”,”bmp”,”gif”,”ico”,”png”);
var portableList=myList.join(”|”);
//结果是jpg|bmp|gif|ico|png
函数:substring()
功能:字符串截取,比如想从”MinidxSearchEngine”中得到”Minidx”就要用到substring(0,6)
函数:indexOf()
功能:返回字符串中匹配子串的第一个字符的下标
var myString=”JavaScript”;
var w=myString.indexOf(”v”);w will be 2
var x=myString.indexOf(”S”);x will be 4
var y=myString.indexOf(”Script”);y will also be 4
var z=myString.indexOf(”key”);z will be -1
substr 方法
返回一个从指定位置开始的指定长度的子字符串。
stringvar.substr(start [, length ])
参数
stringvar
必选项。要提取子字符串的字符串文字或 String 对象。
start
必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。
length
可选项。在返回的子字符串中应包括的字符个数。
说明
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到
stringvar 的最后
function SubstrDemo(){
var s, ss; // 声明变量。
var s = "The rain in Spain falls mainly in the plain.";
ss = s.substr(12, 5); // 获取子字符串。
return(ss); // 返回 "Spain"。
}
java 特征
继承 封装 多态 抽象
java 取余 和取模 的区别
取余rem(3,2)=1
rem(-3,-2)=-1
rem(3,-2)=1
rem(-3,2)=-1
2.取模
mod(3,2)=1
mod(-3,-2)=-1
mod(3,-2)=-1
mod(-3,2)=1
由此可以看出,rem和mod是有符号区别的!
当除数与被除数的符号相同时,rem和mod的结果是完全相同的;当除数与被除数的符号不相同时,结
果不同。
具体说,rem结果的符号与被除数相同;mod结果的符号与除数相同。
sql 分页
--写法1,not in/top
select top 50 * from pagetest
where id not in (select top 9900 id from pagetest order by id)
order by id
--写法2,not exists
select top 50 * from pagetest
where not exists
(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)
order by id
--写法3,max/top
select top 50 * from pagetest
where id>(select max(id) from (select top 9900 id from pagetest order by id)a)
order by id
--写法4,row_number()
select top 50 * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900 and rownumber<9951
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber between 9901 and 9950
js 跨域
1、document.domain+iframe的设置对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决
2、动态创建script
虽然浏览器默认禁止了跨域访问,但并不禁止在页面中引用其他域的JS文件,并可以自由执行引入的JS文
件中的function(包括操作cookie、Dom等等)。根据这一点,可以方便地通过创建script节点的方法来
实现完全跨域的通信。具体的做法可以参考YUI的Get Utility
这里判断script节点加载完毕还是蛮有意思的:ie只能通过script的readystatechange属性,其它浏览器
是script的load事件。以下是部分判断script加载完毕的方法。
3、使用HTML5 postMessage
otherWindow.postMessage(message, targetOrigin);
otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;
window.open的返回值;通过name或下标从window.frames取到的值。
message: 所要发送的数据,string类型。
targetOrigin: 用于限制otherWindow,“*”表示不作限制
4、利用flash
5、window.name实现的跨域数据传输
iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。
以上先总结这么多,后面收集后再更新,同时也算是学习了。