Synchronized:JAVA语言的关键字,可以用来给对象和方法或者代码块加锁,当它锁定一个方法或者代码块的时候,同一时刻最多只有一个线程执行这个段代码。当两个并发线程访问同一个对象中的这个加锁同步代码快时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问对象的一个加锁代码块时,另一个线程仍然可以访问该对象中的非加锁代码块。
Transient:JAVA语言关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
Volatile:是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会 。
Strictfp:即精确浮点,可以 用于类、接口或方法。使用strictfp关键字声明一个方法时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是IEEE 754算法对操作数预期的结果,以单精度和双精度格式表示
Native:标识符native可以与所有其它的java标识符连用,但是abstract除外。一个native method方法可以返回任何java类型,包括非基本类型,而且童谣可以进行异常控制。这些方法的实现体可以自制一个异常并且将其抛出。
二.深入了解int和Integer
int 是基本数据类型
Integer是其包装类,注意是一个类。
为什么要提供包装类呢???
一是为了在各种类型间转化,通过各种方法的调用。否则 你无法直接通过变量转化。
比如,现在int要转为String
int a=0;
String result=Integer.toString(a);
在java中包装类,比较多的用途是用在于各种数据类型的转化中。
我写几个demo
//通过包装类来实现转化的
int num=Integer.valueOf("12");
int num2=Integer.parseInt("12");
doublenum3=Double.valueOf("12.2");
doublenum4=Double.parseDouble("12.2");
//其他的类似。通过基本数据类型的包装来的valueOf和parseXX来实现String转为XX
Stringa=String.valueOf("1234");//这里括号中几乎可以是任何类型
String b=String.valueOf(true);
String c=new Integer(12).toString();//通过包装类的toString()也可以
String d=new Double(2.3).toString();
再举例下。比如我现在要用泛型
List<Integer> nums;
这里<>需要类。如果你用int。它会报错的
三.编写一个快速排序的程序
public class QuickSort {
public static void main(String[] args) {
int[] nums = { 27, 8, 57, 9, 23, 41, 65, 19, 0, 1, 2, 4, 5 };
quickSort(nums, 0, nums.length - 1);
for (int i = 0; i < nums.length; ++i) {
System.out.print(nums[i] + ",");
}
System.out.println("");
}
public static void quickSort(int[] a, int lo0, int hi0) {
int lo = lo0;
int hi = hi0;
if (lo >= hi)
return;
boolean transfer = true;
while (lo != hi) {
if (a[lo] > a[hi]) {
int temp = a[lo];
a[lo] = a[hi];
a[hi] = temp;
transfer = (transfer == true) ? false : true;
}
if (transfer)
hi--;
else
lo++;
}
lo--;
hi++;
quickSort(a, lo0, lo);
quickSort(a, hi, hi0);
}
}