java初级面试(一)

1.简单讲一下java的跨平台原理
   由于各操作系统支持的指令集,不是完全一致的,就会让我们的程序咋不同的操作系统上要执行不同程序代码,Java开发了适用于不同操作系统及位数的java虚拟机来屏蔽各个
   操作系统之间的差异,提供统一的接口,对于我们jaba开发者而言,你只需要在不同的系统上安装对应的不同java虚拟机,这时你的java程序只要遵循java规范,就可以在所有
   的操作系统上面运行java程序了。

   java通过不同的系统、不同版本、不同位数的java虚拟机来屏蔽不同的系统指令集差异而对外提供统一的接口,对于我们普通的java开发者而言,只需要按照接口开发即可,如
   果我系统需要部署到不同的环境时,只需要在系统上面安装对应版本的虚拟机即可。

2.搭建一个java开发环境的步骤
    java开发环境需要些什么?
   1、适用于我们开发环境的jdk。
   2、对应开发环境的eclipse
   3、还需要web服务器(tomcat)

   下载对应组件
    安装
    jdk,安装正常流程安装即可,配置我们的java_home,因为后面的eclipse和tmocat会依赖于这个变量。
    eclipse正常解压就ok,设置workspace的默认编码
    tmocat正常解压就ok,把tomcat集成到eclipse中,安装插件就ok。
    ......
    Svn/git
3、java中有几种基本类型,各占几个字节?
     8种,分别是byte,short,int,long,float,double,boolean,char。其中byte占1个字节,short占2个字节,int占4个字节,long占8个字节,float占4个字节,double
     占8个字节,boolean占1个字节,char占2个字节。
4、面向对象的特征有哪些方面?
      有四大基本特征:封装、继承、多态、抽象
      面向对象的封装性,就是把对象的属性和行为(方法)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
      面向对象的继承性,是从已有的类中派生出新的类,我们把它称之为子类,子类继承父类的属性和行为,并能根据自己的需求扩展出新的属性和行为,用extends关键字来修饰
      面向对象的多态性,是指允许不同的对象对同一消息做出响应,即同一个消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)
      面向对象的抽象性,从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
5、装箱和拆箱
      有了基本数据类型,为什么还需要包装类型?
      基本数据类型,java中提供了8种基本的数据类型:byte、short、int、long、float、double、boolean、char。每一个基本数据类型都会一一对应一个包装类型
      byte--Byte short--Short int--Integer long--Long float--Float double--Double boolean--Boolean char--character
      装箱:把基本的数据类型转换成包装类型。自动装箱(Integer i=1),底层在编译时会调用valueof方法来进行装箱。
      拆箱:把包装类型转换为基本的数据类型。Integer i=1;int j=i//自动拆箱 int j=i.intValue();实际上会在编译时调用intValue
      java是一个面向对象的语言,而基本的数据类型,不具备面向对象的特性。
      null Integer-->null int-->0 用Integer和int分别表示Person这个类的ID,Integer只需要判断一次就够了,而int需要判断null和0
      缓存值:对象缓存,Integer i=1;Integer j=1;i=j Float和Double没有缓存
6、==和equals的区别?
      ==是比较两个变量的值,变量分为基本数据类型变量以及引用类型变量。如果是基本数据类型的变量,直接比较值。而引用类型则比较的是对应的引用的内存的首地址。
      equals用来比较两个对象是否相等,需要重写equals方法。因为object类下的equals本质上还是值比较。
7、讲一下String和StringBuilder的区别(final)?StringBuilder和StringBuffer的区别?
      在java中提供了三个类:String、StringBuilder、StringBuffer来表示和操作字符串。
      String 是内容不可变的。String底层使用了一个不可变的字符数组(final char[])
      误区:String str="123" str="456" System.out.println(str)//结果是456;String的值明明发生了改变,为什么说String的内容是可变的
      解释:str只是一个对象的引用,并不能真正指代对象。以上的代码是,将str引用指向了一个新生成的String对象456,而原来的123还在内存中存在,并没有发生改变。
      StringBuilder和StringBuffer是内容可以改变的字符串。StringBuilder和StringBuffer底层使用的可变字符数组(没有用final修饰)
      拼接字符串不能使用String进行拼接,要使用StringBuilder或者StringBuffer,原因在于String拼接的时候要创建很多中间对象,而StringBuilder和StringBuffer不用
      StringBuilder是线程不安全的,效率较高,而StringBuffer是线程安全的,效率较低。
8、讲一下java中的集合?
      java中的集合分为存值的集合(value)和存键值对(key-value)的集合。说白了就是两个接口Collection和Map
     存储值又分为List和Set
     List是有序的,可以重复的。
     Set是无序的,不可以重复的。根据equals和hashcode判断,也就是如果一个对象需存储在Set中,必须重写equals和hashCode方法。
      存储键值对的为map
      为什么重写equals时,一定要重写hashcode?
      根据hashcode的规则,两个对象相等,哈希值一定相等。所以为了保证一致性,重写equals时,一定要重写hashcode。例如:
      Student s1=new Student("小明",19); Student s2=new Student("小明",19); 重写了equals方法,比较得出结论这两个对象相等,然,若不重写hashcode,那么
       hashcode的值便是根据内存地址进行计算的,这两个对象的hashcode就不相等。这样就违背了两个对象相等,哈希值相等的准则。
9、ArrayList和LinkedList的区别?使用场景?
      List常用的ArrayList和LinkedList。
     ArrayList底层是数组,查询效率高,增删慢。使用在查询比较多的情况下。
     LinkedList底层是链表,查询效率低,增删快。使用在增删比较多的情况下。
10、hashmap和hashtable的区别?
       hashmap和hashtable都可以使用来存储kay-value的数据。
       hashmap是可以把null作为key或者value的,而hashtable是不可以的。
       hashmap是线程不安全的,效率较高。hashtable是线程安全的,效率较低。
       如果我们既想线程安全,有想效率高,该怎么做?
       ConcurrentHashMap    jdk1.5以后推出
       通过把整个Map分为N个片段(类似hashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
11、实现一个拷贝文件的工具类使用字节流还是字符流?
        字节流传递的是字节(二进制)
        字符流传递的是字符
        使用字节流传递的文件,不一定能使用字符流传输。使用字符流传输的文件都可以转换为字节流再进行传输。
        我们拷贝的文件不确定只包含字符流,有可能含字节流(图片、视频、音乐)。考虑到通用性,所以要使用字节流。
12、讲一下线程的几种实现方式?怎么启动?怎么区分?线程池?线程并发库?
        第一种:继承Thread类实现一个线程。
        第二种:通过实现Runnable接口实现一个线程
        第三种:实现Callable接口重写call方法通过FutureTask包装器来创建Thread线程
        继承扩展性不强,java中支持单继承,如果一个类继承Thread就不能继承其他的类了。
        怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是那个线程,打印怎么办?
        thread.setName("设置一个线程名称");这是一种规范,在创建线程完成后,都需要设置名称。
        有没有使用过线程并发库?
        简单来说就是引进了一个java.util.current包提供了对线程优化和管理的各项操作。
        java通过Executors提供了四个静态方法创建线程池,分别是:
        newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
        newFixedThreadPool :创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
        newScheduledThreadPool: 创建一个定长线程池,支持定时及周期性任务执行。
        newSingleThreadExecutor: 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
        线程池的作用?
        限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃
        线程池不需要每次都去创建或销毁,节约了资源
        线程池不需要每次都去创建 ,响应时间更快
13.什么是设计模式?常用的设计模式有哪些?
     设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的,可以解决特定问题的设计方法。
     常用的设计模式有23种,比如:单例、工厂模式(SpringIOC就是使用的工厂模式)、代理模式(SpringAOP就是使用的动态代理)、包装模式等等。
     工厂模式:对象的创建交给一个工厂去创建。
     单例:spring的Bean默认是单例的,但是可以修改。
     分为懒汉式和饿汉式。
     饿汉式就是直接创建出类的实例化;
     懒汉式就是在需要的时候再创建类的实例化
     单例模式的写法步骤:1.构造方法私有化,让除了自己类中能创建外其他地方都不能创建。
                                       2.在自己的类中创建一个单实例
                                       3.提供一个方法获取该实例对象

猜你喜欢

转载自www.cnblogs.com/pwl-hhf/p/11732273.html
今日推荐