尚硅谷 | 您所在的位置:网站首页 › 尚硅谷测试 › 尚硅谷 |
一、基础题
1)用最有效的的方法算出2称以8等于几
答案:2 Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 八种基本数据类型只与自己的包装类之间进行装箱与拆箱。JDK1.5之后支持自动装箱与自动拆箱。 26)什么是基本数据的自动类型转换和强制类型转换?当把数据类型小的数据赋值给数据类型大的变量时,就会发生自动类型提升。 byte->short->int->long->float->double char-> 当byte、short、char三个类型在计算时,就会自动升级为int。当数据类型小的数据与数据类型大的数据混合计算时,数据类型小的数据会自动类型提升。 当把数据类型大的数据赋值给数据类型小的变量时,就要强制类型转换。 double->float->long->int->short->byte ->char 当希望某个数据类型小的数据按照某个大的类型计算时,也可以使用强制类型转换。 27)向上转型和向下转型?向上转型: 把子类对象赋值给父类的变量。 把实现类的对象赋值给父接口的变量。 向下转型: 把父类变量赋值给子类的变量。 可能发生ClassCastException,最好向下转型之前加instanceof判断 28)int,Integer,BigInteger的区别?int:基本数据类型 Integer:包装类 BigInteger:任意大小的整数 29)Java异常的处理过程?Java的异常处理过程如下: (1)当程序运行到某一句代码,如果发生了异常(可能是JVM判定的异常,也可能是遇到throw的),程序都会停下来,然后把异常信息封装到异常的对象中,并且“抛”出 (2)JVM会检测在这段程序代码的外围,是否有try...catch,如果有try...catch,就判断是否有catch可以捕获它,如果捕获了,程序就进入对应的catch块进行异常处理,处理后程序继续运行try..cath之后的代码。 (3)JVM会检测在这段程序代码的外围,根本就没有try...catch或者是有try...catch但是捕获不住,即类型对不上,JVM都会把这个异常对象抛出“上级,方法的调用者” (4)上级一旦接到异常对象,处理过程还是1,2,3 (5)如果一直抛,一路上都没有可以捕获它,程序就崩溃了。 30)阐述什么是线程安全问题?怎么解决?JavaSE阶段的答案: 当满足以下条件时,会出现线程安全问题: (1)有多个线程 (2)使用共享数据 (3)有多句代码操作共享数据 如何解决?同步,即加锁 31)String 类的常用方法都有那些?(1)常见String类的获取功能 length:获取字符串长度; charAt(int index):获取指定索引位置的字符; indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引; substring(int start):从指定位置开始截取字符串,默认到末尾; substring(int start,int end):从指定位置开始到指定位置结束截取字符串; (2)常见String类的判断功能 equals(Object obj): 比较字符串的内容是否相同,区分大小写; contains(String str): 判断字符串中是否包含传递进来的字符串; startsWith(String str): 判断字符串是否以传递进来的字符串开头; endsWith(String str): 判断字符串是否以传递进来的字符串结尾; isEmpty(): 判断字符串的内容是否为空串""; (3)常见String类的转换功能 byte[] getBytes(): 把字符串转换为字节数组; char[] toCharArray(): 把字符串转换为字符数组; String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串; toLowerCase(): 把字符串转成小写; toUpperCase(): 把字符串转成大写; concat(String str): 把字符串拼接; (4)常见String类的其他常用功能 replace(char old,char new) 将指定字符进行互换 replace(String old,String new) 将指定字符串进行互换 trim() 去除两端空格 int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。 32)Java的自增、自减运算符在自增变量前后有什么区别?首先, 自增运算符++,表示自增变量自增1, 自减运算符--,表示自增变量自减1。 其次,以自增为例 (1)如果自增表达式直接加;构成语句,自增运算符在自增变量前后没有区别 a++; 和 ++a; 没区别 (2)如果自增表达式 和其他运算符一起运算,或者自增表达式作为实参使用时,则有区别。 自增运算符在前:表示先自增,再取自增变量的值运算, 自增运算符在后:表示先取自增变量的值,然后自增变量再自增1,计算用的是自增之前取的值。 33)普通类和抽象类有哪些区别?抽象类不能被实例化; 抽象类可以有抽象方法,只需申明,无须实现; 有抽象方法的类一定是抽象类; 抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类; 抽象方法不能声明为静态、不能被static、final修饰。 四、简答题进阶 1)Java虚拟机中内存分为哪些区域?每个区域的作用?哪些区域是线程共享的?1、程序计数器(寄存器):当前线程所执行的字节码行号指示器 2、本地方法栈:同虚拟机栈,只不过本地方法栈为虚拟机使用到的native方法服务。 3、虚拟机栈:每个方法在执行的同时都会创建一个栈帧用来存放存储局部变量表、操作数表、动态连接、方法出口等信息,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 4、堆:所有线程共享的一块内存区域。Java虚拟机所管理的内存中最大的一块,因为该内存区域的唯一目的就是存放对象实例。几乎所有的对象实例度在这里分配内存,也就是通常我们说的new对象,同时堆也是垃圾收集器管理的主要区域。 5、方法区:和堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、和编译器即时编译后的代码等 2)请解释抽象类与接口的区别TCP:面向连接的可靠的基于字节流的传输控制协议 UDP:非面向连接的不可靠的基于用户数据报的协议 4)HashMap的底层实现及扩容机制?简单回答: HashMap在JDK1.8之前:底层实现是数组+链表,扩容机制是当table中元素的个数已经达到阈值(table.length*0.75)时并且新添加[index]桶已经是非空,那么table.length需要扩容为2倍。 HashMap在JDK1.8之后:底层实现是数组+链表/红黑树,扩容机制(1)是当table中元素的个数已经达到阈值(table.length*0.75)时,那么table需要扩容为2倍。(2)当添加到[index]下时,发现[index]下的链表结点个数已经达到8个,而table的长度未达到64,此时table.length也会扩容为2倍。 当table[index]下的结点个数达到8个但是table.length已经达到64时会树化,因为当table[index]下的结点个数超过8个后,查询效率就低下了,修改为红黑树的话,可以提高查询效率。 5)Hashtable和HashMap、TreeMap的底层结构Hashtable: 数组+链表 HashMap: JDK1.8之前:数组+链表 JDK1.8及之后:数组+链表/红黑树 TreeMap: 红黑树 6)哈希表要用链表或红黑树?为了解决hash和[index]冲突问题 (1)两个不相同的key的hashCode值本身可能相同 (2)两个不相同的key的hashCode值不同,但是经过hash()运算,结果相同 (3)两个hashCode不相同的key,经过hash()运算,结果也不相同,但是通过 hash & table.length-1运算得到的[index]可能相同 那么意味着table[index]下可能需要存储多个Entry的映射关系对象,所以需要链表或红黑树 7)运行时异常与编译时异常有何异同?请列举一些运行时异常和编译时异常的类型。运行时异常是非受检异常,是RuntimeException的子类,即编译器无法检测,因此也不会强制要求程序员处理。 编译时异常是受检异常,编译器检测到代码抛出编译时异常时,会要求程序员必须对该异常做处理(throws或try...catch)否则,编译不通过。 运行时异常: 数组下标越界异常:ArrayIndexOutOfBoundsException 类型转换异常:ClassCastException 算术异常:ArithmeticException 空指针异常:NullPointerException 编译时异常: IO操作异常:IOException 文件找不到异常:FileNotFoundException 已到达文件流末尾异常:EOFException 类找不到异常:ClassNotFoundException 没有对应的方法异常:NoSuchMethodException 8)Object类中有哪些常用的方法?(1)protected Object clone()--->创建并返回此对象的一个副本。 (2)boolean equals(Object obj)--->指示某个其他对象是否与此对象“相等”。 (3)protected void finalize()--->当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 (4)Class |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |