一、面向对象的四大基本特征
继承
子类可以继承父类的所有属性和方法,例如,儿子继承父亲的财产。
封装
将零散的属性封装成一个对象,将对象归纳为一个类
多态
每个种群有不同的表现形式,比如People people = new Student()/new Teacher();多态的实现也依赖于重写重载。
抽象
不能实例化的类,但可以用子类表达 比如People ,人类。
二、谈谈包装类、基本数据类型、拆箱装箱
包装类
基本数据类型不具有对象的特征,在实际开发中,经常需要把基本数据类型转为对象操作,因此有了包装类。
基本数据类型
基本数据类型的变量,存储的就是数据本身的值,而引用类型的变量,存储的则是数据的地址,这个地址指向了数据的值。
拆箱装箱
装箱是值类型转成object引用类型,拆箱是已被装箱的引用类型转成原来的值类型。
Integer i=1 自动装箱; int j=i 自动拆箱
三、“==”和“equals”的区别
一般情况下,用==比较值(基本数据类型直接存值,因此比较值。引用对象存的是内存地址,也是一种值比较)是否相同。字符串用equals比较值是否相同。
在object类中,”equals” 和 “==”的功能是一样的,都是比较内存地址,只不过大多数类都重写了equals方法。
四、String、StringBuilder、StringBuffer有什么区别
Sting是final类型的,每次赋值,都会在内存中开辟新的空间存储,不适合多次赋值使用。
StingBuilder和StringBuffer可以多次使用,但StringBuilder的append方法添加了同步锁,因此线程更安全,但效率更低。
五、讲一下java中的集合
集合可以大致分为两个接口 collection 和map接口,他们的存储方式分别是 value 和key-value
1、其中collection下又分为 list 和set,两者的区别是,list允许有重复的元素,而set不允许,这是依赖于set集合重写hashcode和equals方法。
①list接口下又分ArrayList和Linkedlist,底层分别是使用数组和链表。
ArrayList 查询快,增删慢,因为在内存中使用的是连续的内存地址,如果增删会改变其他元素内存地址。
LinkedList 查询慢,增删快,因为在内存中使用的是非连续的内存地址,由某个元素指向上下元素的内存地址,查询由头部开始。增删不会改变其他元素的内存地址。
②hashset 、Linkedhashset不能有重复元素, 其他大体等同List。此外hashset是无序集合,Linkedhashset是有序集合
2、map接口下有Hashmap 和Hashtable
Hashmap键值可以为null,线程不安全,但更高效
Hashtable键值不可为null,线程安全,但低效
ConcurrentHashmap涉及到线程并发库,将既高效又安全。 HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。而ConcurrentHashmap将数据分段存储,每一段加一把锁。
六、拷贝文件用什么流
字节流
七、谈谈线程的实现方式
1、①通过继承Thread类
这种方式的可扩展性不强,因为java只允许对象有一个父类。
②通过实现Runable接口
这种方式比较通用
2、怎么启动
Thread thread =new Thread(继承了Thread类或实现了Runable接口的类)
thread.star();
注意:启动线程使用start();而执行的方法是实现类中的run()方法
八、谈谈你对线程并发库(线程池)的理解
Executor类提供了四种静态方法用于创建线程池。
一般采用newFixedThreadPool (创建一个固定大小的线程池)
使用线程池的优点:1、不用每次都创建或销毁,节约了资源。提高了效率。
2、限定了线程的个数,不会因为线程过多而导致系统崩溃,提高了稳定性。
九、谈谈常见的设计模式
设计模式就是指可以反复使用由无数前人总结的解决特定问题的一种代码结构模式。
常见的有单例模式工厂模式代理模式·和包装模式。
其中单例模式就是将构造私有化,然后在本类中创建一个实例,并提供一个暴露出去的方法获取该实例。
单例模式又分饱汉模式、饿汉模式和双重锁模式。
1、饱汉模式在申明实例的时候会直接创建对象。这种模式更占用资源,但效率更高,支持多线程。
2、饿汉模式只会在需要的时候创建它。这种模式节省资源,但需要上同步锁,因此不支持多线,程效率更低。
3、双重锁模式,只在第一次实例化时使用同步锁,因此只有初始化加载的时候比较慢,其余时候很快,支持多线程。