1.你每天必上的五个网站是什么?
开源中国 微博 36氪 虎嗅网
2.移动硬盘标注的是500G,但是实际容量只有400G?
硬盘厂商的换算是1000MB = 1G, 而操作系统的换算单位是1024MB = 1 G
3.==和equals()区别?
== 比较基本类型,比较的是值是否相等;比较引用类型,比较的是内存地址是否相等.
equals方法是Object类中的方法,该方法,内部默认的比较对象也是 == 比较内存地址是否相等,Object子类可以重写equals方法自定义比较规则比较值是否相等,例如,String就是重写equals方法,比较的是字符串值是否相等。
4.静态变量和实例变量的区别?
静态变量对于每个类,都是一份,而且变量值也是相同的,而实例变量对于每个实例类来说,都拥有自己的一份,每个对象都可以有不同的实例变量。
5.Integer 和 int的区别?
int是八种基本类型的一种,而Integer是包装类的一种,是int的封装类,主要用于int类型和String的转化。
6.重写和重载的区别?
重写是出现在继承中,子类可以根据自己的需要重写父类的方法,如果父类的方法有private和final修饰,不能被重写,重写后,子类对象调用的该方法时就会执行子类中重写的方法,而不再调用父类的方法。重载是指在一个类中,,方法名相同,但是方法参数雷彪不同,参数列表不同是指参数数量不同,类型不同,数量不同。
把多个共性的东西提取到一个类中,这种是继承的做法。但是呢,这些共性的东西有的时候,方法声明一样,但是方法体,也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样,所有我们定义这些共性方法的时候,就不能给出具体的方法,而没有具体方法的方法是抽象方法,一个中有抽象方法,那么这个类是是抽象类。
7. 什么是抽象类?
抽象类是指用abstract 关键字修饰的类,这种类不能被实例化,并且这种类中可以有普通方法和抽象方法,抽象方法是指没有方法体的方法,这种方法的内容在子类中得到体现,抽象类,主要用于被继承,所以抽象类不能用final来修饰,一个类继承抽象类,必须要实现抽象类的抽象方法,除非该类是抽象类。
8. 接口是什么?
接口中不能有普通方法和实例变量,接口中定义的都是抽象法方法和常量,所以接口比抽象类更抽象,接口中定义的方法,主要用于被类实现,一个类可以实现多个接口,实现接口后,必须要实现接口中的所有方法,除非是抽象方法,接口可以继承接口,并且可以多继承。
9. 谈谈hashCode()和equals()?
这两个都是Object中定义的方法,所有java中的对象都拥有这两个方法,如果两个对象的哈希值返回相同,但是equals返回值不一定true,但是如果两个对象的equals返回值是true,那么这两个对象的hashCode值一定相同。HashSet类就是使用该机制保证没有重复元素。
10.String类和Integer类是否可以继承?
不能被继承。 因为两个类都是用final修饰的,final修饰类,该类不能被继承,final修饰方法,该方法不能被重写,final修饰变量是常量。
11.String StringBuffer StringBuffered 区别?
String类在java中表示字符串,并且是引用数据类型。StringBuffer和Stringbuffered主要是解决String类型多次累加造成性能的低下,而出现的,StringBuffer线程安全的类,StringBuffered是线程不安全的类。
12. 如何把字符串转成数组?
使用String类中的split方法。例如: str.split(" ,");
13.final 和 finally区别?
使用final修饰的类,该类不能被继承,使用final修饰的方法,该方法不能被重写。使用final修饰的变量是常量。 finally关键字是用于异常处理,无论异常是否出现,都会执行finally代码块。
14. error 和 exception区别?
ava 中Throwable类中有两个子类,分别是error和exception,Erro一般指的是jvm的错误,程序中无法处理。Exception 的子类分为运行异常和非运行异常,RuntimeExceptionl类以及其子类,是运行异常,其他是编译异常,即异常不处理程序编译不通过。
15. 写出常见的异常?
java.lang.NullPointerception、java.lang.IndexOutofBountsException
16.实现多线程有那些方式? 如何启动一个线程?
在java中实现多线程有两种方式,第一种是让类继承Thread类并且重写run方法,这种方式定义的子线程通过start方法来启动。第二种是让类实现Runnable接口,并且实现run方法,这种方式启动要借用Thread类中的start方法。
多线程: 多线程Demo.
17.如何引起一个线程安全?
多线程环境下同时访问同一个对象的实例变量,会引起线程安全问题。
18.Collection 和 Collections 区别?
Collection 是单例集合List,Set 的父接口,Collectins是集合的工具类,包含查询等方法.
19. List 和 Set区别?
- List 有序,可重复
- ArrayList
- 底层数据结构是数组,查询快,增删慢。
- 线程不安全,效率高
- Vector
- 底层数据结构是数组,查询快,增删慢。
- 线程安全,效率低
- LinkedList
- 底层数据结构是链表,查询慢,增删快。
- 线程不安全效率高。
- ArrayList
- Set 无序,唯一
- HashSet
- 底层数据结构是哈希表。保证唯一依赖连个方法:hashCode()和equals()
- LinkHashSet
- 底层数据结构是链表和哈希表。链表保证有序,哈希表保证元素唯一
- TreeSet
- 底层数据结构是红黑树。
- 排序: 自然排序、比较器排序
- HashSet
ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
HashMap 和 HashTable的区别?
HashTable是线程安全的 HashMap线程不安全,HashTable 不允许Null键和Null值 HashMap允许Null键和Null值
遍历方式
Map map = new HashMap();
map.put("tom", 12);
map.put("jack", 21);
System.out.println("方式一");
// 方式一
Set set = map.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry me = (Map.Entry) iterator.next();
Object key = me.getKey();
Object value = me.getValue();
System.out.println("key: " + key + " value: " + value);
}
System.out.println("方式二");
// 方式二
for (String key : map.keySet()) {
System.out.println("key: " + key + " value: " + map.get(key));
}
System.out.println("方式三");
// 方式三
for (Map.Entry entry : map.entrySet()) {
System.out.println("enty " + entry + " key: " + entry.getKey() + " value: " + entry.getValue());
}
20. 谈谈java中的序列化?
将java对象写入流的工程中成为序列化,将对象从流中读取出来称为反序列化。参与序列化的对象必须要实现java.lang.Seralizable接口,并生成一个序列化Id
21. 基本类型有哪些? 对应的包装类?封装类的作用?
数字类型: 分为整数类型int short byte long 浮点型: float double 字符型 char 布尔型: boolean,对应的包装类有Integer,Short,Byte,Long,Float,Character, Boolean; 封装类主要用于对应的基本类型转换成String类型
22. 写出线程的生命周期?
准备 就绪 运行 死亡; 准备 就绪 运行 阻塞 就绪 运行 死亡
23. 如何处理线程安全问题?
- 在方法声明中添加Synchronized关键字; 第二种使用Synchronized代码块
24.java所在类的根类?这些类的常用方法是?
java中所有的跟类是Object,例如 toString()方法用于返回一个对象描述的字符串,equals()用于比较两个对象。
25. 什么是面向接口编程?
面向接口编程可以让类耦合性降低。使用接口作为方法参数,代表可以传入这个接口的所有实现类对象; 使用接口作为方法的返回值,代表可以返回接口的所有实现类对象。
26. Java异常是如何分类的?
异常可以分为运行异常和非运行异常,运行异常是RuntimeException及其子类,除此之外,都是非运行异常,当程序抛出异常时,可以选择性捕获,但是非运行异常,则必须要捕获或者向上抛出,否则无法编译。
27. 什么是守护线程,如何实现?
守护线程指随着主线程死亡而死亡的子线程。在子线程调用之前,调用setDaemo(true)方法,即可将限制设置为守护线程。
28 什么是Join线程.如何实现?
join 线程可以让其他线程先进入阻塞到自己执行完成。调用线程的join方法即可。
29. 面向对象的特征?
封装 继承 多态 封装:隐藏实现细节,提供公共的访问方式。 提供代码复用性,提高代码安全性。继承: 把多个相同的成员提取到一个类中,这种做法是继承 多态: a:方法的重载:在一个类中,允许多个方法使用同意方法名,但方法的参数列表不同 b:父类指向子类对象,接口可以指向实现类对象。 好处是降低类的耦合性。例如: 采用接口作为方法的参数,可以传入该接口的实现类
30. 什么是jdk jre jvm ?
jdk 是java的开发工具包 jre是java的编译环境 jvm 是java的虚拟机
32.Android 底层的操作系统是?
Linux App开发是用的java
33.int类型中如何保存10进制和16进制?
8进制的值已0开头;16进制是以0x开头
34. char类型如何保存一个汉字?
可以存储,因为char类型存储的是unicode字符。
35. boolean类型有哪些值?
ture 和 false。java中不能使用0和1代替。
36. Switch等值判断和if多重判断的区别?
if除了等着判断还可以区间判断。
37. break关键字的作用?
在for循环中跳出循环;在switch中,可以作为case的条件结束。
38. 如何引起java.lang.ArrayIndexOutBonudsEception异常?
在使用数组和集合的时候,下标大于最大下标,或者下标为负下标的时候。
39. 什么是IDE?
IDE是集成开发的缩写,这类开发工具一般包含开发、测试、运行等功能
40.访问修饰符有那些? 用途?
41.如何引起java.lang.NullPointerExceptoion?
一个引用数据类型为null,调用这个对象的属性或者方法时,会引起异常。
42. 构造方法什作用如何调用?
构造方法是通过创建对象是调用。构造方法通过new关键字来调用。
43. 继承有什么作用? 如何调用?
在继承中,被继承的类是父类,集成的类是子类。继承主要用途是解决代码的复用性,当子类继承父类时,可以拥有父类的的属性和方法。
44. 如何在子类调用父类的方法?
使用super关键字,例如 super.method();
45. 如何在子类调用父类的构造方法?
通过super关键字来调用;例如 super( )
46. 如何在一个类中调用构造方法?
通过使用this关键字例如this(name)
47. 什么是多态?
多态在java中最主要的体现是父类指向子类对象,接口可以指向实现类对象。这样做的好处就是降低类的耦合性。例如 方法采用父类类型作为参数,那么可以传入父类的的子类对象;采用接口作为方法的参数,者可以传入方法的所有实现类。
48. 静态方法如何调用?
类名.方法;也可以使用对象调用
49. 静态方法是否可以调用普通方法?
静态方法不能调用普通方法,但是普通方法可以调用静态方法。
50. 什么是静态代码块? 作用?
static{}为静态代码块,静态代码块在第一次使用前执行而且执行一次
51. 泛型集合有什么用途?
限制集合类型,方便遍历。
52. Throwable 有什么用途?
53. 如何自定义异常?
自定义异常就是继承Exception或者是它的子类
53. 如何抛出一个异常?
通过throw关键字抛出异常。在方法声明中可以通过throws关键字标注这个方法抛出那些异常。
54. ArrayList的内部实现?
本质是就是一个数组,ArrayList就是动态的为数组扩容,其add()、get()、remove()其实就是对数组的操作.
55. 线程的实现?
在java中实现线程有两种方式第一种让类继承Thread类并且重新run()方法。这种方式定义的通过子线程start()方法启动。
第二种 实现Runnable接口,并且重写run方法,这种方式启动要借用Thread类中的start方法
public class MyThreadDemo extends Thread {
public MyThreadDemo(){}
public MyThreadDemo(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
System.out.println(getName());
}
}
}
/**
* 获取线程名称
*public final String getName();
*/
class Test{
public static void main(String[] args) {
MyThreadDemo myThreadDemo1 = new MyThreadDemo();
myThreadDemo1.setName("tom");
myThreadDemo1.run();
}
}
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
// 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
}
/*
* 方式2:实现Runnable接口
* 步骤:
* A:自定义类MyRunnable实现Runnable接口
* B:重写run()方法
* C:创建MyRunnable类的对象
* D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
*/
class MyRunnableDemo {
public static void main(String[] args) {
// 创建MyRunnable类的对象
MyRunnable my = new MyRunnable();
Thread t1 = new Thread(my, "林青霞");
Thread t2 = new Thread(my, "刘意");
t1.start();
t2.start();
}
}
56.同步方式有几种
两种: 同步代码块 同步方法
synchronized(对象) 对象可以随意(使用上帝就行)
{
需要被同步的代码(哪些代码在操作共享数据)
}
public static synchronized Singleton getInstance(){
....
}
57. 启动一个线程是用run()还是start()?
start() run()方法封装了被执行的代码,直接调用仅仅是普通方法的调用 start():启动线程并有jvm自动调用run()方法
58. sleep() 和 wait()方法的区别?
sleep()必须指定时间,不释放锁。wait() 可以指定时间和不指定时间,释放锁
59. 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。
而Object代码任意的对象,所以,定义在这里面。
60.线程的生命周期图
新建-->就绪-->运行-->死亡; 新建-->就绪-->运行-->阻塞-->运行-->死亡
61. 什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递 。
62.死锁?
两个或者两个以上的线程争抢资源的时候,发生的一种互相等待的现象
63.说说:sleep、yield、join、wait方法的区别
sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。
作用于线程
- Thread.sleep()方法用来暂停线程的执行,将CPU放给线程调度器。
- Thread.sleep()方法是一个静态方法,它暂停的是当前执行的线程。
- Java有两种sleep方法,一个只有一个毫秒参数,另一个有毫秒和纳秒两个参数。
- 与wait方法不同,sleep方法不会释放锁
- 如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。
- 休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
- 有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。
join(): 当前线程等待调用此方法的线程执行结束再继续执行。如:在main方法中调用t.join(),那main方法在此时进入阻塞状态,一直等t线程执行完,main方法再恢复到就绪状态,准备继续执行。
join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。作用于线程
原理
yield(): 它仅仅释放线程所占有的CPU资源,从而让其他线程有机会运行,但是并不能保证某个特定的线程能够获得CPU资源。谁能获得CPU完全取决于调度器,在有些情况下调用yield方法的线程甚至会再次得到CPU资源。所以,依赖于yield方法是不可靠的,它只能尽力而为。作用于线程
wait():
- wait只能在同步(synchronize)环境中被调用,而sleep不需要。
- 进入wait状态的线程能够被notify和notifyAll线程唤醒,但是进入sleeping状态的线程不能被notify方法唤醒。
- wait通常有条件地执行,线程会一直处于wait状态,直到某个条件变为真。但是sleep仅仅让你的线程进入睡眠状态。
- wait方法在进入wait状态的时候会释放对象的锁,但是sleep方法不会。
wait方法是针对一个被同步代码块加锁的对象
64,说说你对 Java 中反射的理解
va 中 的 反 射 首 先 是 能 够 获 取 到 Java 中 要 反 射 类 的 字 节 码 , 获 取 字 节 码 有 三 种 方 法 ,
1.Class.forName(className) 2.类名.class 3.this.getClass()。然后将字节码中的方法,变量,构造函数等映射成
相应的 Method、 Filed、 Constructor 等类,这些类提供了丰富的方法可以被我们所使用。
编程题
1. 编写一个单例模式?
public class Singleton {
/* private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton GetInstance() {
return instance;
}*/
private Singleton(){}
private static Singleton instance = null;
private static synchronized Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
2. c盘 1.png 复制到D: 盘
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(""));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(""));
int len = -1;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
bos.flush();
bos.close();
bis.close();
3. 将www.abc.com/xx.png 复制到D:盘,使用网络编程?
4. 判断一个身份证号,是否符合要求? 长度 18 位
5. 将字符串23,52,24,67,74转换数组使用冒泡排序?
6. 第一人10岁,第二个人比第一个人大2两岁.以此类推.第八个人多少岁?
public static void main(String[] args) throws IOException {
age(8);
}
private static int age(int i) {
if (i == 1){
return 10;
}
return age(i -1)+2;
}
排序
public class TestDemo {
public static void main(String[] args) {
String str = "13,43,21,53,36,76,98";
String[] strArray = str.split(",");
int[] digitArry = new int[strArray.length];
for (int i = 0; i < strArray.length; i++){
digitArry[i] = Integer.parseInt(strArray[i]);
}
// dubboleSort(digitArry);
selectSort(digitArry);
}
private static void selectSort(int[] digitArry) {
for (int x = 1; x < digitArry.length; x++){
for (int y = x; y < digitArry.length; y++){
if (digitArry[y] > digitArry[y -1]){
int temp = digitArry[y];
digitArry[y] = digitArry[y-1];
digitArry[y - 1] = temp;
}
}
}
console(digitArry);
}
private static void dubboleSort(int[] digitArry) {
for (int x = 0; x < digitArry.length -1; x ++){
for (int y = 0; y < digitArry.length -1-x; y ++){
if (digitArry[y] > digitArry[y+1]){
int temp = digitArry[y];
digitArry[y] = digitArry[y+1];
digitArry[y+1] = temp;
}
}
}
console(digitArry);
}
private static void console(int[] digitArry) {
for (int digit : digitArry){
System.out.println(digit);
}
}
}