1、存在成员变量(全局变量)的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的。
2、在调用wait方法时,都是用while判断条件的,而不是if,在wait方法说明中,也推荐使用while,因为在某些特定的情况下,线程有可能被假唤醒,使用while会循环检测更稳妥。
wait和notify方法必须工作于synchronized内部,且这两个方法只能由锁对象来调用。
3、var colors=new Array();
var count=colors.push("red","blue","black"); //加三个元素 count=3
count=colors.push("green"); //加入一个元素 count=4 数组结构为"red","blue",,"black","green"
var item=colors.pop(); //取出最后一个元素 item="green" 数组结构为"red","blue","black"
item=colors.shift(); //取出第一项 item="red" 数组结构为"blue","black"
count=colors.unshift("orange","pink"); //在数组前端添加两个元素 count=4 数组结构为"orange","pink","blue","black"
4、var values={0,1,5,10,15};
values.sort(); //0,1,10,15,5
function compare(v1,v2){
if(v1 < v2){
return -1;
}else if(v1 > v2){
return 1;
}else {
return 0;
}
}
//-1 表示第一个值位于第二个值之前 1表示第一个值位于第二个值之后
values.sort(compare); //0,1,5,10,15
5、var colors={"red","yellow"};
var colors1=colors.concat("blue",{"green","brown"});
alert(colors); //red,yellow
alert(colors1); //red,yellow,blue,green,brown
6、var colors=["red","yellow","green","brown","blue"];
var colors1=colors.slice(1); //从索引1到最后
var colors2=colors.slice(1,4);//左闭右开 包括索引1位置,不包括索引4位置
alert(colors1); //yellow,green,brown,blue
alert(colors2); //yellow,green,brown
7、var colors={"red","green","blue"};
var removed=colors.splice(0,1); //从第一个位置开始,删除一项
alert(colors); //green,blue
alert(removed); //red
removed=colors.splice(1,0,"yellow","orange"); //从第二个位置开始插入两项
alert(colors); //green,yellow,orange,blue
alert(removed); //空数组
removed=colors.splice(1,1,"red","purple"); //从第二个位置开始,删除一项,添加两项
alert(colors); //green,red,purple,orange,blue
alert(removed); //yellow
8、js迭代方法
every():对数组中的每一项运行给定函数,如果该函数对于每一项都返回true,则返回true
var numbers=[1,2,3,4,3,2,1];
var everyResult=numbers.every(function(item,index,array){
return (item > 2);
});
alert(everyResult); //false
some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true
var numbers=[1,2,3,4,3,2,1];
var someResult=numbers.some(function(item,index,array){
return (item > 2);
});
alert(someResult); //true
filter():对数组中的每一项运行给定函数,返回该函数会返回true的项的数组
var numbers=[1,2,3,4,3,2,1];
var filterResult=numbers.filter(function(item,index,array){
return (item > 2);
});
alert(filterResult); //{3,4,3}
map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
var numbers=[1,2,3,4,3,2,1];
var mapResult=numbers.map(function(item,index,array){
return item * 2;
});
alert(mapResult); //{2,4,6,8,6,4,2}
forEach():对数组中的每一项运行给定函数,这个方法没有返回值
var numbers={1,2,3,4,3,2,1};
numbers.forEach(function(item,index,array){
//执行某些操作
});
9、reduce()
var values={1,2,3,4,5};
var sum=values.reduce(function(prev,cur,index,array){
return prev + cur;
});
alert(sum); //15
第一次执行 prev=1 cur=2
第二次执行 prev=1+2=3 cur=3
第三次执行 prev=3+3=6 cur=4
reduceRight()
var values={1,2,3,4,5};
var sum=values.reduceRight(function(prev,cur,index,array){
return prev + cur;
});
alert(sum); //15
第一次执行 prev=5 cur=4
第二次执行 prev=5+4=9 cur=3
第三次执行 prev=9+3=12 cur=2
10、根据属性排序
function createComparison(propertyName){
return function(object1,object2){
var value1=object1[propertyName];
var value2=object2[propertyName];
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else {
return 0;
}
};
}
var data=[{name:"zhangsan",age:25},{name:"lisi",age:28}];
data.sort(createComparison("name"));
alert(data[0].name); //lisi
data.sort(createComparison("age"));
alert(data[0].name); //zhangsan
11、Boolean类型问题
布尔表达式中的所有对象都会转化为true
var falseObject=new Boolean(false);
var result=falseObject && true; //这是对falseObject对象而不是它的值(false)进行求值
alert(result); //true
var falseValue=false;
result=falseValue && true;
alert(result); //false
12、Math.ceil() 执行向上舍入,即它总是将数值向上舍入为最接近的整数
Math.floor() 执行向下舍入,即它总是将数值向下舍入为最接近的整数
Math.round() 四舍五入
13、SELECT COUNT(DISTINCT 列名) AS 展示名 FROM 表名
展示此列不同对象的数目。
14、closest
HTML代码
<ul>
<li><b>Click me!</b></li>
<li>You can also <b>Click me!</b></li>
</ul>
jQuery代码
$(document).bind("click", function (e) {
$(e.target).closest("li").toggleClass("hilight");
});
15、Java的内存分配
Java程序运行时的内存结构分成:方法区、栈内存、堆内存、本地方法栈几种。
方法区存放装载的类数据信息,包括:
·基本信息:每个类的全限定名、每个类的直接超类的全限定名、该类是类还是接口、该类型的访问修饰符、直接超接口的全限定名的有序列表。
·每个已装载类的详细信息:运行时常量池、字段信息、方法信息、静态变量、到类classloader的引用、到类class的引用。
栈内存:
Java栈内存由局部变量区、操作数栈、帧数据区组成,以帧的形式存放本地方法的调用状态(包括方法调用的参数、局部变量、中间结果……)。
堆内存:
堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
本地方法栈内存:
Java通过Java本地接口JNI(Java Native Interface)来调用其它语言编写的程序,在Java里面用native修饰符来描述一个方法是本地方法。
String的内存分配
String是一个特殊的包装类数据,由于String类的值不可变性,当String变量需要经常变换其值时,应该考虑使用StringBuffer或StringBuilder类,以提高程序效率。
16、var startTime = +new Date(); //+new Date()相当于new Date().valueOf(),返回当前时间的毫秒数
isFinite()函数用于检查其参数是否是无穷大,如果 number 是有限数字(或可转换为有限数字),那么返回 true。
否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。
17、./ 当前目录
../ 父级目录
/ 根目录
18、volatile的作用
通常情况下我们可以通过Synchronized关键字来解决可见性、有序性及原子性问题,不过Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,
所以避免使用Synchronized来解决问题。而volatile关键字就是Java中提供的另一种解决可见性和有序性问题的方案。
对于原子性,对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。
19、一个注解的生命周期有三个阶段:java源文件是一个阶段,class文件是一个阶段,内存中的字节码是一个阶段
RetentionPolicy.SOURCE阶段(java源文件阶段),RetentionPolicy.CLASS阶段(class文件阶段),RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段)
Retention注解决定所定义注解的生命周期,如@Retention(RetentionPolicy.SOURCE)表示该自定义注解只保留在java源文件中,在javac编译成.class文件时会去除这个自定义注解。
20、 a+=b --> a=(a.Type)(a+b); //返回的是a类型(效率较高)
a=a+b --> a=a+b; //返回类型是a类型与b类型中的最高类型
21、引用类型和基本类型有着巨大的区别,当声明一个int i=0时,系统会马上给这个i分配一个内存空间(在栈内存里面分配一小块区域用来装数字0),里面装着一个值为0,以后使用i这个名字马上就可以访问这个内存空间里面的值,这就是基本数据类型,所以基础类型就只占一块内存。基础类型之外的类型全都叫引用类型,我们定义一个Mouse m,这个m就是一个引用类型的数据。引用类型有什么重要的特征——引用类型占2块内存。我们定义好这个类之后,需要使用new关键字把这个类的对象实例化出来,也就是真真正正造出一个对象出来才能使用这个对象。
22、对象创建的过程:
(1)首次创建对象时,类中的静态方法/静态字段首次被访问时,java解释器必须先查找类路径,以定位.class文件;
(2)然后载入.class(这将创建一个class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次;
(3)当用new XX()创建对象时,首先在堆上为对象分配足够的存储空间;
(4)这块存储空间会被清0,这就自动地将对象中的所有基本类型数据都设置成了缺省值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null;
(5)执行所有出现于字段定义处的初始化动作(非静态对象的初始化);
(6)执行构造器。
23、Alt+Shift+O 给相同变量加上灰色背景色。
24、对数组进行排序可以自定义,需要重写compare方法
public static void main(String[] args) { Integer array[] = { 1, 1, 2, 3, 5, 4, 6 }; Arrays.sort(array, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { if (a < b) { return -1; } else if (a > b) { return 1; } else { return 0; } } }); for (Integer integer : array) { System.out.print(integer+" ");//1 1 2 3 4 5 6 } }
25、找出数组中元素出现的次数最多的那个元素及其出现的次数
public static void main(String[] args) {
int arr[] = { 1, 1, 2, 3, 4, 4, 5, 4, 6, 2, 1, 4 };
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < arr.length; i++) {
if (map.containsKey(arr[i])) {
int temp = map.get(arr[i]);
map.put(arr[i], temp + 1);
} else {
map.put(arr[i], 1);
}
}
Collection<Integer> values = map.values();
Integer max = Collections.max(values);
Set<Entry<Integer, Integer>> entrySet = map.entrySet();
for (Entry<Integer, Integer> entry : entrySet) {
if (entry.getValue() == max) {
// 4出现的次数最多,共4次
System.out.println(entry.getKey() + "出现的次数最多,共" + entry.getValue() + "次");
}
}
}
26、基本数据类型
byte 1个字节 8位 2^8
short 2个字节 16位 2^16
int 4个字节 32位 2^32
long 8个字节 64位 2^64
char 2个字节 16位 2^16
float 4个字节 32位 2^32
double 8个字节 64位 2^64
27、使用dropins安装插件
从Eclipse3.5开始,安装目录下就多了一个dropins目录。只要将插件解压后拖到该目录即可安装插件。
比如安装svn插件subclipse-1.8.16.zip,只需要如下的三步即可:
1、使用winrar等压缩软件将压缩包解压至某一文件夹,比如subclipse-1.8.16
2、将此目录移动/复制至Eclipse安装目录下的dropins目录