Java基础总结1

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目录

  3、重启Eclipse。
28、equals 与 hashCode
  (1)在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。
  (2)如果两个对象根据equals方法比较是相等的,那么调用两个对象的hashCode方法必须返回相同的整数结果。
  (3)如果两个对象根据equals方法比较是不等的,则hashCode方法不一定得返回不同的整数。
  “设计hashCode()时最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,
  而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,
  因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码”。
原文地址:https://www.cnblogs.com/yiyibinbin/p/8416192.html