随心所遇随遇而安什么意思

Java数据类型 包装类型 为了让基本类型也具有对象的特征 ,就出现了包装类型(比如在使用集合类型Collection时就一定要使用包装类型而非基本类型) 因为容器都是装object的,这时就需要这些基本类型的包装类了。 区别: 1. 声明方式不同:包装类型需要使用new 关键字来在堆空间中分配存储空间

Java数据类型

            

包装类型

            为了让基本类型也具有对象的特征,就出现了包装类型(比如在使用集合类型Collection时就一定要使用包装类型而非基本类型)

     因为容器都是装object的,这时就需要这些基本类型的包装类了。

            

            区别:

                    1. 声明方式不同:包装类型需要使用new关键字来在堆空间中分配存储空间

                    2. 存储方式以及位置不同:基本类型是直接将变量存储在中,而包装类是将对象放在中,通过引用来使用;

                    3. 默认值不同,基本类型都有默认值,int是0 、boolean是false;包装类型的默认值是null

                    4. 使用方式不同:基本类型直接赋值使用;包装类型可当做对象来使用;  

short  s1=1 

            s1=s1+1  ×    由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再

                                  赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

            s1+=1     √     由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

a++和++a

                 

&和&&的区别

            &和&& 都可以用作逻辑“与”的运算符,当运算符两遍表达式的结果都没true时,整个运算结果才为true,否则为false;

            &&还具有短路的功能,对于if( d!=null && d.equals("11") ),当d为null时,后面的表达式不会执行,整个运算返回false;

                                               将&&改为& ,则会执行后面表达式,抛出NullPointerException异常;

            &还可以用作位运算符(“与”运算)↓↓

位运算符 &  、|  和 ^

                 按位与运算符   二进制位进行“与”运算 。

                                    规则:两位同时为“1”,结果才为“1”,否则为0;比如5 & 7=5

                                               

                 按为或运算符  |   :  按二进制位进行“或”运算 。

                                     规则:两位只要有一个为“1”,其值为“1”,否则为“0”

                                               3 | 5 即 011 | 101 = 111        3 | 5=7

                 按为异或运算符  ^  :  按二进制位进行“异或”运算。

                                     规则:两位不同时,为“1”,否则为 “0”

                                               5 ^ 7 即 101 | 111 = 010        5 ^ 7=2

 

 

        

switch选择结构可使用的数据类型的数据

                      

                 基本类型中,没有boolean浮点类型(double和float)和长类型long,.相应的包装类型也没有。

                 外加String和enum。

try{}里有return时,与finally执行顺序

            

==和equals

        1)对于 ==

              如果作用于基本数据类型得变量,比较的是其存储的“值“是否相等;

              如果作用于包装类型的变量,比较的是所指对象的内存空间地址;

        2)对于 equals

               equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象;

        如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

               String重写的equals方法:

                               

                            

 

String s = "hello"和String s = new String("hello"); 的区别

                    在JAVA虚拟机(JVM)中存在着一个字符串池(常量池),其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。

                    String s = new String("hello");     可能创建两个对象也可能创建一个对象。如果常量池中有hello字符串常量的话,则仅

                                                                        仅在堆中创建一个对象。如果常量池中没有hello对象,则堆上和常量池都需要创建。

                    String s = "hello"                         这样创建的对象,JVM会直接检查字符串常量池是否已有"hello"字符串对象,如没有,就

                                                                       分配一个内存存放"hello",如有了,则直接将字符串常量池中的地址返回给栈。

                    (没有new,没有堆的操作)

String s="a"+"b"+"c"+"d"

          

              所以,String s="a"+"b"+"c"+"d"创建一个对象

String、StringBuffer和StringBuilder区别

    1)可变与不可变

          String底层使用一个不可变的字符串数组 所以内容不可变;

          StringBuffer和StringBuilder都继承了AbstractStringBuilder底层的可变字符串数组 所以内容可变;

           

          

               首先栈中的"str1"变量指向堆中的“123”对象,栈中的"str2"变量指向堆中的“456”对象,当执行到str1=str1+str2时,系统重新

           在堆中new一个更大的数组出来,然后将"123"和"456"都复制进去,然后栈中的"str1"指向这个新new出来的数组;

                    所谓的不可变是指:它没有在原数组“123”上进行修改,而是新建了个更大数组进行扩展,也就是说,这时候堆里还是有“123”

           这个对象数组存在的,只不过这个时候"str1"变量不在指向"123"这个数组了,而是指向了新new出来的数组,这就是和StringBuffered

           的区别,后者是在原数组上进行修改,改变了原数组的值,StringBuffered不是通过新new一个数组去复制,而是在原数组基础上进行扩展。

    2)线程安全

           String线程安全;

           StringBuffer线程安全,效率较低,StringBuffer的大部分方法用synchronized修饰,具有同步锁,多个线程只能互斥地调用这些方法。

      StringBuilder线程不安全,效率较高;

           

          

集合

       List、Set

 

           

 

                 Queue接口与List、Set同一级别,都继承了Collection接口

                  

                  

                 

                 LinkedList既可以实现Queue接口,也可以实现List接口;

                 LinkedList实现了Queue接口,Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果

                 是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法)。

               ----List 有序,可重复(这里的有序指的是按照放入的顺序进行存储。如按照顺序把1,2,3存入List,

                                                           那么,从List中遍历出来的顺序也是1,2,3)

                             ·  ArrayList 点击详解(源自公众号:Java知音) -----查询快,增删慢,效率高,线程不安全。

                      ·   LinkedList 点击详解(源自公众号:Java知音) -----查询慢,增删快,效率高,线程不安全。

                                    ·   Vector  ----- 底层结构是数组,查询快,增删慢,线程安全(synchronized),效率低。

                             对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

                             对于新增和删除操作add和remove,LinkedList优于ArrayList,因为ArrayList要移动数据。

              ----Set  唯一,不一定无序

                            ·  HashSet(无序,唯一,可为null)    底层是采用HashMap实现的(HashMap是Java中用哈希表实现的一种Map),也就是说

                                                                        HashSet 底层数据结构其实是哈希表。

                                                                        保证唯一性:hashCode()和equals()

                            ·  LinkedHashSet (存储有序,唯一,可为null)    底层数据结构是链表和哈希表

                                                                                               链表保证元素有序;哈希表保证元素唯一

                            ·  TreeSet (有序,唯一,不可为)         底层数据结构是采用TreeMap(红黑树)实现的

                                                                           自然排序、比较器排序(点击查看:TreeSet的两种排序比较)

                                                                             

               

     List<String> arrayList = new ArrayList<String>();
        arrayList.add("1,");
        arrayList.add("2,");
        arrayList.add("3,");
        arrayList.add("4,");
        arrayList.add("5");
        System.out.println("ArrayList:==========================");
        for(String arrList : arrayList){
            System.out.print(arrList);
        }
        System.out.println("");
        List<String> linkedList = new LinkedList<String>();
        linkedList.add("1,");
        linkedList.add("2,");
        linkedList.add("3,");
        linkedList.add("4,");
        linkedList.add("5");
        System.out.println("LinkedList:===========================");
        for(String linkList : linkedList){
            System.out.print(linkList);
        }
        System.out.println("");
        Set<String> hashSet = new HashSet<String>();
        hashSet.add("1,");
        hashSet.add("2,");
        hashSet.add("3,");
        hashSet.add("4,");
        hashSet.add("5");
        System.out.println("HashSet:==============================");
        for(String hashst: hashSet){
            System.out.print(hashst);
        }
        System.out.println("");
        Set<String> linkedHashSet = new LinkedHashSet<String>();
        linkedHashSet.add("1,");
        linkedHashSet.add("2,");
        linkedHashSet.add("3,");
        linkedHashSet.add("4,");
        linkedHashSet.add("5");
        System.out.println("LinkedHashSet:=========================");
        for(String linkedst : linkedHashSet){
            System.out.print(linkedst);
        }
        System.out.println("");
        Set<String> treeSet = new TreeSet<String>();
        treeSet.add("1,");
        treeSet.add("2,");
        treeSet.add("3,");
        treeSet.add("4,");
        treeSet.add("5");
        System.out.println("TreeSet:==============================");
        for(String treest : treeSet){
            System.out.print(treest);
        }
知秋君
上一篇 2024-07-22 08:12
下一篇 2024-07-22 07:48

相关推荐