java基础面试题

java基础面试题

1.==和equles的区别?
答:==是比较变量的值是否相等,变量又可以分为基本数据变量和引用类型变量,基本数据类型比较的是值是否相等,而引用数据变量则比较的是引用内存的首地址是否相等
equles:用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
2.String和StringBuffer,StringBuider的区别?
答:String内容是不可以改变的,因为String的底层是一个不可以改变的数组,被final修饰的(final char[])
StringBuffer和StringBuider内容是可以改变的,因为StringBuffer和StringBuider的底层是一个可以改变的数组
StringBuffer是线程不安全的,效率较高,StringBuider是线程安全,因为使用了锁,所以效率较低。
3.讲述一下java中的集合?
答:java中的集合分为value,key-value两种(Conllection Map)
value集合分为:list,set
list: 是有序的,可以重复的
set:是无序的,不可以重复的,根据equals和hashCode来判断是否重复的,也就是说如果一个对象要存储在set中,
必须要重写equals和HashCode
4.ArrayList和LinkedList的区别?
List集合分为ArrayList和LinkedList,ArrayList底层为数组,LinkedList底层为链表。
ArrayList的查询效率高,删除和修改效率低。因为ArrayList的数组在内存中是一块连续的内存,删除和修改需要移动内
存。
LinkedList的查询效率低,删除和修改的效率高。因为LinkedList不要求内存地址是连续的,当前元素会指定上
一个或者下一个元素的地址,当查询的时候就会从头开始一个一个找,所以查询的效率低,插入的时候不需要移动内
存,只需要
改变引用指向即可。
5.HashMap和HashTable的区别?HashTable和CurrentHashMap?
相同点:HashMap和HashTable都是以key,value进行存储的
不同点:HashMap是线程不安全的,效率高,允许空值和空键
HashTable是线程安全的,效率低,不允许空值和空键
如果想要效率高,又想线程是安全的,可以使用CurrentHashMap
CurrentHashMap是将Map分解为N个segment,类似于(HashTable),可以提供相同的线程安全,效率提升N倍,默认的
是16倍
6.实现一个拷贝文件的工具类是字符流还是字节流?
我们要拷贝的文件不确定是只有字符流,像图片,录音,是视频等就是字节流,所以为了通用,使用字节流。
7.讲述一下线程的几种启动方式?
1.线程的实现方式有几种?
1.1 通过继承Thread类实现一个线程
1.2 通过实现Runable的接口去实现一个线程
通过继承Thread类这种方式,不容易扩展,因为java只支持单继承
2.如何启动?
1.1 Thread thread=new Thread(继承了/或者实现了一个Runable对象)
1.2 启动线程使用的是start方法,而启动之后执行的方法是run方法
3.如何区分线程?
通过Thread.setName(“线程名称”);去设置一个线程的名称
8.讲述一下什么是设计模式?常用的设计模式有哪些?
设计模式就是在设计过程中可以反复利用的,可以解决待定问题的设计方法。
1.1什么是单例模式?
单例模式属于创建形模式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被
创建

         **1.2.常用的设计模式有哪些?
           单例模式:
              1.懒汉式(用到的时候在创建对象)
                  ```
                    public class Person(){
                    private Person(){
                      }
                    private static Person  instance=new Person();
                    public static Person getInstance(){
                             return instance;
                          }
                          public static void main(Stirng args[]){
                          Person.getInstance.toString();
                     }
                       ```
                   2.双重加锁的懒汉式
              
                                ```
                             public static Person(){
                             private Person(){
                              }
                             private volatile static Person instace;
                             public static synchronized Person getInstace(){
                               if(instace==null){
                                synchronized (Person.class){
             
                                    if(instace==null){
                                       instace=new Person();
                                     }
                                  }
                               }
                                return instance;  
                            }
                           
                          }

volatile关键字是一种类型修饰符,变量具有 synchronized 的可见性特性,但是不具备原子性。这就是说线程能够自动发现
volatile 变量的最新值,其他线程可以看到 3.饿汉式(页面加载时就会创建对象)
public static Person(){
private Person(){
}
private static Person Instance=null;
public synchronized static Person getInstance(){
if(Instance!=null){
Instance=new Person();
}
return Instance;
}

                      }
                              ```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值