Java中有几种基本数据类型?
序号 | 数据类型 | 位数 | 默认值 | 取值范围 | 举例说明 |
---|---|---|---|---|---|
1 | byte(位) | 8 | 0 | -2^7 - 2^7-1 | byte b = 10; |
2 | short(短整数) | 16 | 0 | -2^15 - 2^15-1 | short s = 10; |
3 | int(整数) | 32 | 0 | -2^31 - 2^31-1 | int i = 10; |
4 | long(长整数) | 64 | 0 | -2^63 - 2^63-1 | long l = 10l; |
5 | float(单精度) | 32 | 0.0 | -2^31 - 2^31-1 | float f = 10.0f; |
6 | double(双精度) | 64 | 0.0 | -2^63 - 2^63-1 | double d = 10.0d; |
7 | char(字符) | 16 | 空 | 0 - 2^16-1 | char c = 'c'; |
8 | boolean(布尔值) | 8 | false | true、false | boolean b = true; |
面向对象的特征有哪些方面
有四大基本特征:封装,抽象,继承,多态
在Java中提供三个类String ,String Buillder,StringBuffer
String 是不可变字符的
因为String 底层是所有final 修饰的char 字符数组
StringBuillder 和StringBuffer 没有使用final 修饰所以是可变的
StringBuillder 是线程不安全的,效率较高
StringBuffer 是线程安全的 效率较低
Java中的集合
- Java中的集合分为value ,key-value(Conllection ,Map)两种
- 储存值有分为List和Set
2.1 List是有序的,可以重复的.
2.2 Set是无序的,不可以重复的 根据equals和Hashcode判断,也就是如果一个对象要储存在Set中,必须要重写equals和Hashcode方法
ArrayList 和LinkedList 的区别
- List 常用的ArrayList和LinkedList,区别和使用场景
1.1 ArrayList底层使用是数组,LinkedList使用的是链表
1.1 数组查询具有索引查询特定元素比较快,而插入和删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)
1.2 链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址,查询时需要从头部开始,一个一个的找,所以查询效率低,插入时不要需要移动内存只需要改变引用指向,所以插入或者删除的效率高
1.3 ArrayList使用在查询比较多,但是插入和删除比较少的情况
1.4 LinkedList使用在查询比较少而插入和删除比较多的情况
HashMap 和HashTable 的区别?HashTable 和ConcurrentHashMap 的区别?
相同点:
- HashMap 和 HashTable 都可以使用来存储Key-Value 的数据
区别 : - HashMap 是可以吧null 作为Key 或者value 的,而HashTable 是不可以的
- HashMap 是线程不安全的,效率较高,而HashTable是线程安全的,效率较低
我想线程安全但是我又想效率高?
通过把整个Map分成为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍
实现一个拷贝文件的工具类使用字节流还是字符流?
1.1 我们拷贝的文件不确定是只包含字符流,有可能有子节流(图片,声音,图像),为考虑到通用性,要使用字节流
讲一下线程的几种实现方式? 怎么启动? 怎么区分?
- 实现方式
1.1 通过继承Thread类实现一个线程
1.1.1 继承扩展性不强,Java 总只支持单继承 ,如果一个类继承Thread就不能继承其他类了
1.2 通过实现Runnable 接口实现一个线程 - 怎么启动
2.1 Thread thread =new Thread(继承了Thread的对象/实现了Runnable的对象)
thread.start()
启动线程使用start 方法,而启动了以后执行的是run方法. - 怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是那个线程打印的怎么办?
3.1 thread.setName("设置一个线程名称");这是一种规范,在创建线程完成后,都需要设置名称
有没有使用过线程并发库?
答:简单了解过
- Java通过Executors 提供四个静态方法创建四种线程池,分别为:
- newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空线程池,若无可回收,则新建线程
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,UFO,'优先级)执行
- 线程池的作用?
6.1 限定线程的个数,不会导致由于线程过多导致系统缓慢或者崩溃
什么是设计模式?常用的设计模式有哪些?
-
设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的,可以解决特定问题的设计方法
-
单例
2.1 构造方法私有化,让出了自己类中能创建外其他地方都不能创建,
2.2 在自己的类中创建一个单实例
2.3 提供一个方法获取该实例对象(创建时需要进行方法同步)
2.4 饱汉模式(一出来就创建单实例)
2.5 饥汉模式(需要的时候才创建) -
工厂模式
3.1 spring IOC 就是使用的工厂模式
3.2 对象的创建交给一个工厂去创建 -
代理模式
4.1 Spring AOP 就是使用的动态代理 -
包装模式
进一下http get和Post 请求的区别?
- GET和POST 请求都是HTTP的请求方式
- GET一般用于获取/查询 资源信息,而POST一般用于更新,资源信息
- GET 请求提交的数据会在地址栏显示出来,而POST 请求不会在地址栏显示出来
- GET 请求由于浏览器对地址长度的限制而导致传输的数据有有限制,而POST请求不会因为地址长度限制而导致传输数据限制
- POST 的安全性比GET的安全姓高,由于数据是会在地址中呈现所以可以通过历史记录找到密码等关键信息
说一下你对servlet的理解?或者servlet是什么?
- servlet是用Java编写的服务器端程序,而这些Sevlet 都要实现servlet这个接口
- HttpServlet 重写doGet 和doPost 方法或者你也可以重写service 方法完成对get和post请求的响应