烂笔头 (二)android 面试 mark

10string 转换成 integer的方式及原理

》Integer.parseInt(String str) 方法

public static int parseInt(String s) throws NumberFormatException

{

    return parseInt(s,10);

}

》Integer.parseInt(String s,int radix)

public static int parseInt(String s,int radix) throws NumberFormatException

{

            if(s == null)

                   throws new NumberFormatException("s==null");             

             

             if (radix < Character.MIN_RADIX) {
                    throw new NumberFormatException("radix " + radix +  " less than Character.MIN_RADIX");
             }

              if (radix > Character.MAX_RADIX) {
                     throw new NumberFormatException("radix " + radix +   " greater than Character.MAX_RADIX");
             }

             int result = 0;

             boolean negative = false;

             int i=0; len = s



原文:https://blog.csdn.net/itboy_libing/article/details/80393530 

}

Integer.parseInt(String str) 方法调用Integer内部的parseInt(string str,10)方法,默认基数为10,parseInt内部首先判断字符串是否包含符号(-或+),则对相应的negative和limit进行赋值,然后再循环字符串,对单个char进行数值计算Character.digit(char ch, int radix),在这个方法中,函数肯定进入到0-9

11、哪些情况下的对象会被垃圾回收机制处理掉? 

Java 的虚拟机,既然GC要回收这块内存,那总得有个方法让GC可以判断哪些对象时可以被回收而哪些是不能被回收的吧,这就引出常见的两种判断方法

》引用计数法

这种方法是在对象的头处维护一个计数器Counter,当有一个引用指向对象的时counter就加1,当不在引用此对象时就让counter减1,所以当counter等于0时虚拟机就认为此对象时可以被回收的,但是会存在一个致命的问题。如外部对象A有一个引用,对象A持有对象B,而对象B也持有一个对象C,对象C又持有对象A. 如果对于对象A的引用,按照引用计数方法,GC永远无法回收上面的三个对象,所以大多数虚拟机不采用此方法进行回收内存。

导致问题:循环引用的对象无法被识别出来并且被回收

》可达性分析算法

Java就是使用此方法作为判断对象是否可被回收。虚拟机会先将一些对象定义为GC Roots,从GC Roots出发一直沿着引用链向下寻找,如果某个对象不能通过GC Roots寻找到,那么虚拟机就认为该对象可以被回收。大概是如下几类对象:

虚拟机栈(栈桢中的本地变量表)中的引用的对象;方法区中的类静态属性引用的对象;方法区中的常量引用的对象;本地方法栈中JNI(native方法)的引用的对象。

但是这种情况会引发一个问题,就是内存会被分为一块一块的小碎片。为了解决这个问题,可以采用第二种方法,在之前的基础尚将存活的对象给整理下,是它们变成一个连续的内存,从而释放出连续的较大的内存空间。

》》》》》》》》》》》》》》》》

垃圾回收机制

java中对象实例都是堆上创建的。一些类信息、常量、静态变量等存储在方法区,堆和方法区都是在线程共享的。

GC机制都是由JVM提供,用来清理需要清除的对象,回收堆内存。

GC机制将java程序员从内存管理中解放了出来,可以更关注于业务逻辑。

在java中,GC是由一个被称为垃圾回收器的守护线程执行的。

在内存回收一个对象之前会调用对象的finalize方法。

作为一个java开发者不能强制JVM 执行GC,GC的触发由JVM依据堆内存的大小来决定。

System.gc 和Runtime.gc会向JVM发送执行GC的请求,但是JVM不保证一定会执行GC。

如果堆没有内存创建新的对象了,会抛出OutOfMemoryError

》》》》》》

引用分为四类:

强引用,不进行垃圾回收,如Object obj = new Object;

软引用,有用非必须对象,在内存溢出前进行回收,SoftReference;

弱引用,非必须对象,只能生存到下次垃圾收集时,WeakReference;

虚引用,无用对象,垃圾收集时会受到系统通知,PhantomReference。

 

http://www.importnew.com/21492.html

https://www.cnblogs.com/xiaoxi/p/6486852.html

 

12、静态代理和动态代理的区别,什么场景使用? 

jdk 的代理不让我们在不直接访问某些对象的情况下,通过代理机制也可以访问被代理对象的方法,这种技术可以应用在很多地方比如RPC框架,spring AOP机制,但是我们看到jdk的代理机制必须要求被代理类实现某个方法,这样在生成代理类的时候才能知道重写哪些方法,这样一个没有实现任何接口的类就无法通过jdk的代理机制进行代理,当然解决方法是使用cglib的代理机制进行代理。

动态代理类是public、final和非抽象类型;继承了java.lang.reflect.Proxy类;名称以‘$Proxy’开头;动态代理类实现getProxyClass和newProxyInstance方法中参数interfaces指定的所有接口。

 

14Java中实现多态的机制是什么? 

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这个就是多态性。

多态分为编译时多态和运行时多态,其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态,而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们说的多态性。

Java实现多态有三个必要条件:继承、重写、向上转型。继承:在多态中必须存在有继承关系的子类和父类;

重写:子类对父类中的某些方法进行重新定义,在调用这些方法时就会调用子类的方法;向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

java的多态实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

https://www.cnblogs.com/alternative/p/7501664.html

 

 

16、说说你对Java反射的理解 

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是class类中的方法,所以先要获取到每一个字节码文件对应的class类型的对象。

以上的总结就是什么是反射。反射就是把java类中的各种成分映射成一个个的java对象。

 

主要介绍一下几个方面内容:

   》理解class类;某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。class对象只能由系统建立对象,一个类在jvm中只会有一个class实例,每个类的实例都会记得自己是由哪个class实例所生成。

   》理解java类加载机制;

   》学会使用classloader进行类加载;

   》理解反射机制;

掌握constructor、method、field类的用法;

理解并掌握动态代理。

 

 

17、说说你对Java注解的理解 

它是对程序代码本身的描述-代码元数据,一种约定的规范,包括格式、意义、作用域等。

注解对象:注解可以被用在包、类、方法、变量、参数上;

注解不会直接影响被注解的代码,这只会向第三系统提供关于自己的信息以用于不同的需求;

注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻辑,当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中可用,在编译时不可用的注解。

利用被注解代码并根据注解信息产生不同行为;

内建注解,java自带了一系列的注解,

以下讨论到的注解中有一些被称之为Meta注解,它们的目的注解其他注解,并且包含关于其它注解的信息。

  • @Retention:这个注解注在其他注解上,并用来说明如何存储已被标记的注解。这是一种元注解,用来标记注解并提供注解的信息。可能的值是:
    • SOURCE:表明这个注解会被编译器忽略,并只会保留在源代码中。
    • CLASS:表明这个注解会通过编译驻留在CLASS文件,但会被JVM在运行时忽略,正因为如此,其在运行时不可见。
    • RUNTIME:表示这个注解会被JVM获取,并在运行时通过反射获取。
  • @Target:这个注解用于限制某个元素可以被注解的类型。例如:
      • ANNOTATION_TYPE 表示该注解可以应用到其他注解上
      • CONSTRUCTOR 表示可以使用到构造器上
      • FIELD 表示可以使用到域或属性上
      • LOCAL_VARIABLE表示可以使用到局部变量上。
      • METHOD可以使用到方法级别的注解上。
      • PACKAGE可以使用到包声明上。
      • PARAMETER可以使用到方法的参数上
      • TYPE可以使用到一个类的任何元素上。
      • @Documented:被注解的元素将会作为Javadoc产生的文档中的内容。注解都默认不会成为成为文档中的内容。这个注解可以对其它注解使用。
      • @Inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子类继承。这个注解可以对类使用。
      • @Deprecated:说明被标记的元素不应该再度使用。这个注解会让编译器产生警告消息。可以使用到方法,类和域上。相应的解释和原因,包括另一个可取代的方法应该同时和这个注解使用。
      • @SuppressWarnings:说明编译器不会针对指定的一个或多个原因产生警告。例如:如果我们不想因为存在尚未使用的私有方法而得到警告可以这样做:
      • 1

        2

        3

        4

        @SuppressWarnings( "unused")

        privateString myNotUsedMethod(){

         ...

        }

      • 通常,编译器会因为没调用该方而产生警告; 用了注解抑制了这种行为。该注解需要一个或多个参数来指定抑制的警告类型。

      • @Override:向编译器说明被注解元素是重写的父类的一个元素。在重写父类元素的时候此注解并非强制性的,不过可以在重写错误时帮助编译器产生错误以提醒我们。比如子类方法的参数和父类不匹配,或返回值类型不同。
      • @SafeVarargs:断言方法或者构造器的代码不会对参数进行不安全的操作。在Java的后续版本中,使用这个注解时将会令编译器产生一个错误在编译期间防止潜在的不安全操作。

https://blog.51cto.com/4247649/2109129

18JavaString的了解 

》什么是string:

string是定义在java.lang包下的一个类,它不是基本数据类型。

string是不可变的,jvm使用字符串池来存储所有的字符串对象。

》创建方式:

))和使用其他类一样通过new关键字来创建的:jvm创建字符串对象但不储存于字符串池,我们可以调用方法将该字符串对象存储在字符池,如果字符串池已经有了同样值得字符串,则返回引用。

))使用双引号直接创建:jvm去字符串池找有没有值相等的字符串,如果有,则返回找到的字符串引用,否则创建一个新的字符串对象并存储在字符串池。

 

19String为什么要设计成不可变的?

string是final类,它不能被继承,并且它的成员方法默认为final方法。string类其实是通过char数组来保存字符串的。一旦被创建就是固定不变的了,对string对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。

20Object类的equalhashCode方法重写,为什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值