基础
1、short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1; 有错吗?
大数据类型转小数据类型需要强制转换,小数据类型转大数据类型自动转换。s1+1中 s1是short类型,1是int类型,最终结果是int类型,不能赋值给s1;而s1 += 1 实际等同于 (short)(s1+1);是进行了强制转换的。
2、重载和重写的区别
方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性(同名方法不同入参),而重写实现的是运行时的多态性(同名,同参方法的不同实现)。
重载(Overload):发生在同一个类里,方法的名称相同,但需要参数的数量,类型,顺序至少其中一个不同,单纯的返回类型不同不是重载。
重写(Override):发生子父类继承关系中,子类重新实现父类方法,跟父类方法有相同的入参个数,顺序,类型;以及返回参数类型。重写方法不能比父类拥有更多的异常类型抛出。
3、数组实例化有几种方式?
三种:
①.静态初始化:
intArr = new int[]{1,2,3,4,5,9};
②.简化静态初始化
String[] strArr = {"张三","李四","王二麻"};
③.动态初始化
int[] price = new int[4];
注意:不要同时静态,动态初始化,即同时指定数组长度和数组内容。
4、Java中各种数据默认值
首先确定一下是java的8种基础数据类型在作为类成员变量(类中定义,非局部变量,局部变量通不过编译)时会被赋默认值。其中byte,short,int,long的默认值是0;float,double是0.0,char类型则是' '(空格字符),boolean是false。
5、Object 类常用方法有那些?
equals():比较对象是否相等,比较的是值和地址,自己写的类可重写以自定义(毕竟所有类都继承于Object)。
getClass():获取类的class对象。
hashCode:获取对象的hashCode值。
clone():克隆方法。
toString():如果没有重写,默认将打印对象的地址值。
notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
notifyall():解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
wait():导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
finalize():对象回收时调用。
6、java 中是值传递引用传递?
值传递:传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参,基础类型都是之传递。
引用传递:传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参,对象类型是引用传递。
7、形参与实参区别
形参是指方法定义的入参,形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
实参是指调用方实际传入的参数,可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
8、构造方法能不能重写?能不能重载?
不能重写,构造函数与类名相同,子父类不能重名。
可以重载,可以有不同入参的构造函数。
9、内部类与静态内部类的区别?
内部类:
1、内部类中的变量和方法不能声明为静态的。
2、内部类实例化:B是A的内部类,实例化B:A.B b = new A().new B()。
3、内部类可以引用外部类的静态或者非静态属性及方法。
静态内部类:
1、静态内部类属性和方法可以声明为静态的或者非静态的。
2、实例化静态内部类:B是A的静态内部类,A.B b = new A.B()。
3、静态内部类只能引用外部类的静态的属性及方法。
10、static 关键字有什么作用?
①.static 成员变量 例如
private static int nums;
静态成员变量是属于类的,也就是说,该成员变量并不属于某个对象,即使有多个该类的对象实例,静态成员变量也只有一个。只要静态成员变量所在的类被加载,这个静态成员变量就会被分配内存空间。因此在引用该静态成员变量时,通常不需要生成该类的对象,而是通过类名直接引用。
②.static 成员方法
public static String test() {
return null;
}
静态成员方法中不能使用 this、super 关键字,也不能调用非静态成员方法,同时不能引用非静态成员变量。
③.static 代码块
static {
Test.a= "test";
}
static 代码块又称为静态代码块,或静态初始化器。它是在类中独立于成员函数的代码块。static 代码块不需要程序主动调用,在JVM加载类时系统会执行 static 代码块,因此在static 代码块中可以做一些类成员变量的初始化工作。如果一个类中有多个 static 代码块,JVM将会按顺序依次执行。需要注意的是,所有的static 代码块只能在JVM加载类时被执行一次。
④.static 内部类
public class Test1{
private static String a;
// 静态内部类
static class test12{
xxxxxxxx.............
}
}
静态成员内部类的特点主要是它本身是类相关的内部类,所以它可以不依赖于外部类实例而被实例化。静态内部类不能访问其外部类的实例成员(包括普通的成员变量和方法),只能访问外部类的类成员(包括静态成员变量和静态方法)。即使是静态内部类的实例方法(非静态成员方法)也不能访问其外部类的实例成员。
11、final 在 java 中的作用,有哪些用法?
final修饰的变量会指向一块固定的内存, 这块内存中的值不能改变;其中引用类型变量所指向的对象之所以可以修改, 是因为引用变量不是直接指向对象的数据, 而是指向对象的引用的. 所以被final修饰的引用类型变量将永远指向一个固定的对象, 不能被修改; 对象的数据值可以被修改;而基础类型变量是直接指定值不能改变。
①.修饰类:表示该类不能被继承。
②.修饰方法:表示方法不能被重写。
③.修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
12、String str=”aaa”,与 String str=new String(“aaa”)一样吗?
不一样,其中String str=”aaa”,JVM会将”aaa“分配到常量池(1.6及之前在方法区;JDK1.7 在堆中;JDK1.8常量池和静态常量池存放在元空间)中,常量池有则直接使用,没有就新建并放到常量池中;而String str=new String(“aaa”),会直接分配到堆内存中,新建一个对象。
13、讲下 java 中的 math 类有那些常用方法?
Math.abs(a)取a的绝对值
Math.max(a,b)取a,b中最大值
Math.pow(a)取a的b平方
14、Char 类型能不能转成 int 类型?能不能转化成 string 类型,能不能转成 double 类型
char<int<long<float<double 所以char可以隐式转换为int或者double类型。但是string是引用类型,char是基础类型,无法转换
15、什么是拆装箱?
装箱是将基础类型转换为包装类型,拆箱是将包装类型转换为基础类型
显示装箱:new Integer(10)
隐式装箱Integer i=10
装箱在-128到127之间的数是有缓存,是返回缓存引用对象,其他的是返回新建对象
16、Java 中的包装类都是那些?
包装类:Integer Char Double Boolean Float Long
17、一个 java 类中包含那些内容?
属性,代码块,方法,构造方法,主函数
18、那针对浮点型 数据运算出现的误差的问题,你怎么解决?
使用Bigdecimal类
19、面向对象的特征有哪些方面?
抽象,继承,封装,多态
20、访问修饰符 public,private,protected,以及不写(默认) 时的区别?
default (默认):在同一包内可见
private:在同一类内可见
public:对所有类可见,使用对象有类,方法,属性,接口
protected:对同一包内和子类可见
21、接口有什么特点?
接口使用Interfac关键字修饰
接口中常量默认public static final(会省略)
接口中方法默认public abstract (会省略)
22、抽象类和接口的区别?
接口不能实例化,抽象类可以提供成员方法和方法实现,接口只能提供成员方法,需要实现类实现。
抽象类中的成员变量可以拥有多种类型,而接口只能有public static final。
接口中不能有静态代码块,以及静态方法,而抽象类可以。
一个类只能继承一个抽象类,但是可以实现多个接口
23、Hashcode 的作用
HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址。
24、普通类与抽象类有什么区别?
①抽象类使用abstract来修饰,而普通类没有,抽象类可以有抽象方法,强制要求继承的子类实现,普通类没有。
②抽象类不能被实例化,而普通类可以。
25、什么是接口?为什么需要接口?
接口是定义一系列方法的名称,参数,返回类型的结构。因为接口可以制定一个规范让实现的方法去实现,可以让java语言摆脱继承只能单继承的限制。
26、接口有什么特点?
接口使用Interface来修饰。
接口只是定义规范,不能实例化。
成员变量的修饰符只能是 public static final.
27、拷贝和浅拷贝的区别是什么?
拷贝是生成一个新的对象,新对象内拥有和被拷贝对象的相同属性;浅拷贝是将被拷贝对象的地址指向赋值给拷贝结果。
28、JDBC 操作的步骤
-
加载驱动程序:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
-
创建数据库连接,必须保证及时关闭 :Connection conn=DriverManager.getConnection("连接串","连接数据库的用户名称","对应的密码")
-
提交执行SQL语句:Statement stmt=conn.createStatement(); ResultSet res=stmt.executeQuery("select * from table_name");
-
接收并处理SQL的执行结果
-
关闭释放资源
29、什么时候用 assert
限定某段代码中某个变量的合理范围,一旦不符合就抛出错误,需要让程序员再修改代码。一般使用于开发环境和测试环境,正式环境一般不建议使用。
30、数组有没有 length()这个方法? String 有没有 length()这个方法
数组有length属性,而String才有length()方法。
31、用最有效率的方法算出 2 乘以 8 等于几?
位运算:2<<3; 表示 2向左移 3位。
00010
01000
32、String 和 StringBuilder、StringBuffer 的区别?
String:它值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间
StingBuilder:它是可变类,但是不是线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StingBuilder对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量
StringBuffer:是可变类,是线程安全的。
33、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?
接口可以继承接口 适应extends
抽象类可以实现接口,因为抽象类可以提供方法的具体实现
抽象类可以继承具体类,例如抽象类实际上也是继承了Object类;但是被继承的具体类必须有名曲的构造函数。
34、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致
35、Java 中的 final 关键字有哪些用法?
修饰类表示类不可继承
修饰属性表示属性不可更改
修饰方法表示方法不能被覆盖和重写
集合
1、ArrayList 和 linkedList 的区别
它们最本质的区别是ArrayList使用的是动态数组实现,而linkedList使用的双向链表实现。当获取一个数组中的元素时,ArrayList使用数组下标直接获取,linkedList则需要便利链表去获取。添加或删除时ArrayList可能需要移动数组下标,而linkedList直接改变需要插入节点的链表指向。
2、HashMap 排序题
3、Collection 包结构,与 Collections 的区别
Collection是集合类的上级接口,实现有 LinkedList、ArrayList
Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架。