Java基础

1.jdk 与jre的区别

jre :java Runtime Environment(java 运行时环境)。即Java运行时包含了Java 虚拟机,java基础类库。

jdk: java development kit(java 开发工具包) Java 编程所用的开发包,里面包含着jre,同时包含着Java 编译器javac,监控工具jconsole.分析工具jvisualvm 等。

2.== 和equals 的区别

‘==‘  1.基本类型,比较的是值 2 引用类型比较的是地址 3 不能比较没有父子关系的两个对象

equals 1)系统类一般已经覆盖了equal是(),比较的是内容

2 )用户自定义类如果没有覆盖equals(),将调用父类的equals(如object类,object 中的equals比较的是地址(return(this == obj))

3)用户自定义类需要覆盖父类的equals().

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

首先,答案肯定是不一定。同时反过来equals为true,hashCode也不一定相同。

类的hashCode方法和equals方法都可以重写,返回的值完全在于自己定义。

hashCode()返回该对象的哈希码值;equals()返回两个对象是否相等。

关于hashCode和equal是方法是有一些 常规协定 :

1、两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。

2、两个对象用equals()比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,亿提搞哈希表性能。

3、重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。
 

(API上有标注:请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相等的哈希代码。)

4.final,fianlly,finalize的区别和用法

final 用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承

finally 是异常处理语句结构的一部分,表示总是在执行

finalize 是 object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,

Java中final、finally、finalize的区别与用法 - smart_hwt - 博客园

5java 中操作字符串都有哪些类?它们之间有什么区别?

.string,stringbuilder,stringbuffer ,

string 的源码中是用final 来进行修饰的,因此是不可变的

String builder 和 stringbuffer 的区别在于 stringbuffer 是线程安全的,stringbuffer 用synchronized 来进行修饰

执行效率上 是 string builder》string buffer》String

Java| String, StringBuffer和tringBuilder之间的区别?_YvesHe的专栏-CSDN博客

6.String str="i"与 String str=new String(“i”)一样吗?

String str1 = "i";

String str2 = "i";

String str3 = new String("i");

System.out.println(str1 == str2);//ture

System.out.println(str2 == str3);//false

Java虚拟机会将其分配到常量池中:常量池不会创建重复对象

在string  str1 中,把i的值存在常量池,把地址赋给f1,假如再写一个string str2 =“i”   则会把i 的 地址赋给str2 ,但是 i 对象不会重新创建,他们引用的是同一个地址,共用同一个内存。

分到堆内存中:堆内存会创建新的对象

假设在写一个string s3 = new String(“i”) 则会创建一个新的ui对象,然后将新对象的地址赋值给s3,所以,str1 和 s3 值相同,地址不同。 

7如何将字符串反转?

1)string builder 和 stringbuffer 中的 reverse 方法都可以实现,本质上是调用了 abstract String Builder中的reverse方法来实现的

2) 自己实现

3) 递归

package constxiong.interview;

public class TestReverseString {

    public static void main(String[] args) {
        String str = "ABCDE";
        System.out.println(reverseString(str));
        System.out.println(reverseStringByStringBuilderApi(str));
        System.out.println(reverseStringByRecursion(str));
    }

    /**
     * 自己实现
     * @param str
     * @return
     */
    public static String reverseString(String str) {
        if (str != null && str.length() > 0) {
            int len = str.length();
            char[] chars = new char[len];
            for (int i = len - 1; i >= 0; i--) {
                chars[len - 1 - i] = str.charAt(i);
            }
            return new String(chars);
        }
        return str;
    }
    
    /**
     * 使用 StringBuilder
     * @param str
     * @return
     */
    public static String reverseStringByStringBuilderApi(String str) {
        if (str != null && str.length() > 0) {
            return new StringBuilder(str).reverse().toString();
        }
        return str;
    }


    /**
     * 递归
     * @param str
     * @return
     */
    public static String reverseStringByRecursion(String str) {
        if (str == null || str.length() <= 1) {
            return str;
        }
        return reverseStringByRecursion(str.substring(1)) + str.charAt(0);
    }
}

8.string 类中的常用方法有那些?

indexOf() 返回指定索引

charAt() 返回指定索引处得到字符

replace() 字符串替换

trim() 去除字符串两端的空白

split()分割字符串,返回分割的字符串数组

getBytes() 返回字符串的byte 类型数组

length() 返回字符串长度

toLowerCase() 字符串转小写

toUppderCase() 字符串转大写

substring() 截取字符串

equals() 字符串比价

9.普通类,抽象类,接口的区别

1) 普通类和抽象类的比较

抽象类: 用 abstract 修饰符来进行修饰的类,不能够被实例化,是一种概念并不具体

普通类:  相对于抽象类而言,可以进行实例化

抽象类和普通类的区别,两者都可以被继承,但是抽象类被继承之后子类必须重写继承的方法,除非子类也是抽象类。

2)抽象类和接口的区别

(1)概念不一样:接口是对动作的抽象,表示这个对象能做什么;抽象类是对本质的抽象,表示这个对象是什么。

 (2)使用不一样:

      a.抽象类和接口都可以用来抽象具体对象,但是接口的抽象级别更高

     b. 抽象类可以使用具体的方法和属性,接口只能有抽象方法和不可变常量

    c. 抽象类主要用来抽象类别,接口主要用来抽象功能

   d. 抽象类中,不包含任何实现,派生类必须覆盖他们。接口中的所有方法都必须是未实现的

   e. 接口时设计的结果,抽象类是重构的结果

(3)使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

10.java 中io 流分为几种

file :代表了磁盘上的文件或者目录

i/o: jvm 和外部数据源的数据交换。File,db -in-ajvm ---out -afile,db

三种分类:

方向分:输入流和输出流

单位分:字节流和字符流   

       字节流 InputStream/OutputStream 字节流的父接口

           FileInputStream/FileOutputStream  文件字节流     ((可以向下转换))

           DataInputStream/DataOutputStream  读写8种基本类型和以UTF-8读写String

           BufferedInputStream/BufferedOutputStream  带缓冲的输入/出流

           PrintStream 融合Data和Buffered,  System.out所属的类

           Piped 管道 用于线程间交换数据

           RandomAccessFile 随机访问文件

          字符流:处理字符编码问题

         reader/writer 字符流的父接口

        FileReader/FileWriter 文件字符流,和FileInputStream/FileOutputStream文件流,

           InputStreamReader/OutputStreamWriter 桥转换 将字节流转成字符流 在桥转换的过程中,可以制定编解码方式

           BufferedReader/PrintWriter  有缓冲

      字符流转换为字节流时,指定编解码方式是在桥转换时指定的。

功能分:节点流和过滤流;

piped(g管道节点流): 用于两个线程间传输数据。一个线程的输出,是另一个线程的输入。

对象序列化: 把对象放在流上传输ObjectInputStream/'ObjectOutputStream

只有实现了serializable 接口的对象才能序列化

用transient 修饰的属性,为临时属性,不参与序列化,只能修饰对象的属性。

11.BIO、NIO、AIO 有什么区别?(这个整理的不完整,因为不理解,还需要接下来重新去整理)

io 通常分为几种 同步阻塞bio,同步非阻塞nio,异步非阻塞aio

一.bio 

 在jdk 1.4之前,我们建立网络连接的时候采用 bio 模式,需要现在后台启动一个serverSocket,然后在客户端启动socket 来对服务器进行通信,默认情况下服务端需要对每一个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程响应,如果没有则会一直等待或者拒绝请求,如果有的话,客户端会线程等待请求结束后才继续执行。

二、nio

nio 本身是基于事件驱动思想来完成的,主要是解决bio并发问题:在使用同步i/o的网络中,。如果能同时处理多个客户端请求,或者在客户端同时和多个服务器进行通讯,就必须使用多线程来处理,也就是说,将每一个客户端请求分配给一个线程来进行单独处理,

三、aio

  与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。  即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。  在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:

  • AsynchronousSocketChannel
  • AsynchronousServerSocketChannel
  • AsynchronousFileChannel
  • AsynchronousDatagramChannel

其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。

BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。

BIO与NIO、AIO的区别(这个容易理解)_skiof007的专栏-CSDN博客_aio bio nio

12、Files 常用方法有哪些?

Files.exists(); 判断文件是否存在

Files.createDirectory();创建文件夹

Files.copy(); 复制文件

File.move() 移动文件

File.delete()  删除一个文件或者目录:如果不存在会报错

Files.deleteIfExists() 删除一个文件或目录:如果存在就删除

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值