zoukankan      html  css  js  c++  java
  • 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()方法就会生成一个不同的散列码”。
  • 相关阅读:
    elementui form 清除某个验证样式
    elementui autocomplete
    vue computed 深度监听data为对象的数据
    限制input type 为number 时 maxlength 无效
    svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法
    软件设计架构
    HelpPage
    An exception has occurred while using the formatter ‘JsonMediaTypeFormatter’ to generate sample
    浅谈SQL SERVER中事务的ACID
    redis相关资料
  • 原文地址:https://www.cnblogs.com/yiyibinbin/p/8416192.html
Copyright © 2011-2022 走看看