美文网首页
13、零散知识点

13、零散知识点

作者: 浮生若梦OvO | 来源:发表于2019-06-21 10:22 被阅读0次
    • 在byte、short、char做运算时,要先转换成int类型在进行计算。
    • 整数相除结果是整数,如果想要小数,则在参与运算的数据必须要有一个浮点类型的参数。
    • 一般情况下,大括号与分号是不能共存的。
    • 在计算机的底层运算中,采用的是补码的形式。
    • +号与字符串类型的数据一起使用,表示连接符。
    • 无限循环的两种形式:for(;;){}、while(ture){}。
    • 方法区中的常量池
      关于Integer类型的数据的计算,如果数值在byte类型范围之内时,不会再创建对象,而是调用在常量池中熟知的地址值。
    • 注意:
      数组:使用的是数组的 .lenght 属性
      字符串:使用的是字符串的 .length()方法
    • byte常量池(关于Integer)
      也就是说byte范围内的值,直接赋值给Integer时,是从常量池中获取的,并没有重新开辟空间
    • JDK1.5后的新特性
      a: 自动装箱: 也就是把基本类型直接赋值给引用类型。
      Integer i=100;
      等价于: Integer ii= new Integer (100);
      b:自动拆箱: 也就是把引用类型直接拆成基本类型
      Integer i = 10; //装箱
      int t = i; //拆箱,实际上执行了 int t = i.intValue();
    • java中的开发原则
      只要是对象,就做不为null的判断操作
      如:Arrays类的toString()方法的底层代码。
    • 把字符串中的数字字符排序
      需求:
      现在有一个字符串“23 98 71 54 60”,请把这个字符串变成如下字符串“23 54 60 71 98”.
      思路:
      a:把字符串变成字符数组;
      b:把字符数组转变成int数组;
      c:对转变后的int[]数组排序
      d:把排序后的int[]数组转成String.
    • int和String之间的转换
      a: int转换成String
      int num=100;
      方式1: string s=100+"";
      方式2:String s=String.valueOf(num);
      方式3:Integer i=new Integer(num); String s=i.toString();
      方式4:String s=Integer.toString(num);//静态调用
      b: String转int
      String s=“123”;
      方式1:Integer i=new Integer(s);int number=i.intValue();
      方式2:int number=Integer.parseInt(String s);//静态调用
    • 字符流和字节流的区别:
      字符流处理的是2个字节,可以处理字符,字符串,字符数组;
      字节流操作的是一个字节,可以处理字节和字节数组,字符流需要刷新才能使用数据而字节流不需要,说明字符流使用缓冲。
    • 多线程有Thread为什么还要Runnnable借口呢?
      避免类单继承的局限性
      是数据与操作分离
      低耦合高内聚
    • 关于==做比较的问题
      基本类型的比较:比较的是具体的值
      引用类型的比较:比较的是对象的地址值
    • 实现对象的成员变量数据的比较
      compare方法的三步改进代码
      A :
    public boolean compare(int age1,int age2)
    {
         return age1 == age2;
    }
    //在main方法中的调用方式
    boolean b1 = s1.compare( s1.getAge() , s2.getAge() );
    

    B:

    public boolean compare ( Student s1, Student s2)
    {
         return s1.age == s2.age;
    }
    //在main函数中的调用方式
    boolean bl = s1.compare( s1 , s2 );
    

    C:

    public boolean compare ( Student s)
    {
         return this.age == s.age;
    }
    //在main函数中的调用方式
    boolean bl = s1.compare( s2 );
    
    • Object类的equals方法_理解

      • 在比较两个对象时为什么要重写 equals 方法?
        因为该方法底层默认比较的还是地址值,而同一个类中的不同对象,地址值肯定不同
        所以Object类中的equals 方法没有意义,所以我们需要重写它,比较的是对象当中的属性.
        Student s=(Student)obj;
        重写equals一般就是为了比较某个类的多个对象的所有成员变量值是否相同;
        如果成员变量是基本类型,就用==比较;
        如果成员变量是引用类型,就用该变量对应的引用类型的equals()方法;
        return this.age==s.age&&this.name.equals(s.name);
    • String类的equals()方法详细解析
      理解:其实字符串在底层是一个字符数组的形式存在的
      String类的equals的方法的思路:
      1、判断是否为同一个对象;
      2、判断对象是否属于String类;
      3、判断字符数组的长度是否相同;
      4、比较字符串中的值是否对应相同;

    示例:

         String类的equals方法:
         public boolean equals(Object anObject) {
          
            if (this == anObject) {//判断地址值是否相等
                return true;
            }
           
            
            if (anObject instanceof String) {//判断anObject是否是String类的对象
               
                String anotherString = (String) anObject;//将anObject类向下转型为String
               
                //value在String中的定义
                //private final char[] value
                //字符串 -- 底层字符数组。
                int n = value.length;  //s1长度5
                //value.length -- this.value.length -- s1.toCharArray().length
                //把s1字符串转变成了一个字符数组
                //char[] value = s1.toCharArray();
                //char[] value = {'h','e','l','l','o'};
             
               //把字符串s2也转变成了字符数组,然后获取长度,和n进行比较
               //如果长度相等就进去。
               //char[] value2 = {'h','e','l','l','o'};
                if (n == anotherString.value.length) {
                    //如果长度相同,就进来继续比较。
               
                    char v1[] = value; //{'h','e','l','l','o'};
                    char v2[] = anotherString.value; //{'h','e','l','l','o'};
                    int i = 0;
                   
                    //n=5;是字符串的长度
                   
                    while (n-- != 0) {
                         //n=4,
                         //依次按索引位置比较每一个字符是否相同,如果不同,就返回false.
                         //如果每个索引对应的值都相同,那么整个字符串是相同的。
                        if (v1[i] != v2[i])
                                return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    

    面试题

              byte b1 = 3;
              byte b2 = 4;
              byte b3 = b1 + b2;
              byte b4 = 3 + 4;
    
                  a = a + 20;
                  a += 20;
                  结果是等价的,理解不是等价的。
                 因为+=这种运算符,内含了强制类型转换功能。
                 比如:
                        short s = 2;
    
                        s+=3;
                        等价于
                        s = (short)
    

    3.2*8最有效的方式
    4.10和20 交换的方式
    5.在Java中,下列(B)语句不能通过编译。D
    A. String s = "join"+ "was"+ "here";
    B. String s = "join"+3;
    C. int a = 3+5;
    D. float f = 5+5.5;
    6、Scanner的注意问题

    1、Scanner键盘录入的时候需要注意的问题及解决方法
    如何会出现问题:先输入一个int类型再输入一个String类型会出问题,会默认把换行字符当作一个字符串给string类型。

          解决方法①:再去创建一个Scanner对象(方法1常用)
          解决方法②:数据都用String类型接收,再把字符串转换为int类型。
    

    7、String常见面试题

    1、如何理解字符串一旦初始化就不可以被改变。
    String s = "hello";
    s += "world";
    System.out.println(s);

    不可以被改变说的是常量池中的值,并不是引用s(s是可以重新被赋值的)

    2、
    String s1 = new String("abc");
    String s2 = "abc";
    s1、s2有区别吗?
    第一种方式:第一种方式在内存中存在两个"abc"字符串,一个是在常量池中,一个是在堆内存当中.
    第二种方式:在内存中只存在一个"abc"在常量池中.
    String
    1.字符串方法调用问题

    public static void main(String[] args)
    {
         String s = "abc";
         change(s);
         System.out.println(s);//结果:abc
    }
    
    public static void change(String s)
    {
         s += "hello";
    }
    

    //发现:变量被change方法调用会不会改变取决于?取决于你这个变量指向的是哪个位置?
    如果指向的是方法区中的常量池这个位置的话,不会改变
    如果指向的是堆内存中的数据,会改变
    基本类型:形式参数的改变不会影响实际参数。
    引用类型:形式参数的改变会直接影响实际参数,但字符串是一个特殊的引用类型。
    2.字符串拼接问题

    public static void main(String[] args) {
         String s1 = "a";
         String s2 = "b";
         String s3 = "ab";
         System.out.println(s3 == s1 + s2);//false
         System.out.println(s3 == "a" + "b");//true
    }
    Interger
    Integer i1 = new Integer(127);
    Integer i2 = new Integer(127);
    System.out.println(i1 == i2);//false
    System.out.println(i1.equals(i2));true
    
    System.out.println("--------");
    
    Integer i3 = new Integer(128);
    Integer i4 = new Integer(128);
    System.out.println(i3 == i4);//false
    System.out.println(i3.equals(i4));//true
    Integer i5 = 128;
    Integer i6 = 128;
    System.out.println(i5 == i6);//false
    System.out.println(i5.equals(i6));//true
    
    System.out.println("--------");
    
    Integer i7 = 127;
    Integer i8 = 127;
    System.out.println(i7 == i8);//true
    System.out.println(i7.equals(i8)); //true
    

    常量相加会直接累加,然后在常量池里面找有没有,如果有就直接使用常量池中的值,而变量相加会重新开辟空间。

    • 面试题:sleep和wait()的区别?
    • wait():是Object类的方法,可以不用传递参数。释放锁对象。
    • sleep():是Thread类的静态方法,需要传递参数。不释放锁对象。

    8、Collection和Collections的区别?

    A:Collection是Collection体系的顶层接口,里面定义了这个体系中的共性方法.
    B:Collections是针对Collection集合操作的工具类 里面一定了一些对集合操作的方法
    比如 排序,查找,反转,最值,置换

    9、异常面试题:

    1、请问final,finally,finalize的区别。
    final
    是个关键字
    它修饰的类不能被继承
    它修饰的方法不能不重写
    它修饰的变量就变成了常量

    finally
    是一个关键字,是异常处理的一部分
    一般用在捕获异常时,它里面的代码永远会被执行
    (特殊情况在执行到finall之前就退出了虚拟机)

    finalize()
    是Object类中垃圾回收的方法

    2 假如在catch里面有return语句,请问finally里面的代码还会执行吗?如果执行,是在return前,还是return后?
    会执行。在return前执行。
    准确答案:在return之间执行。

    相关文章

      网友评论

          本文标题:13、零散知识点

          本文链接:https://www.haomeiwen.com/subject/cpnjqctx.html