java基础

目录

  • 平衡二叉树
  • try/catch-finally的执行顺序
  • Java的异常
  • String常用方法
  • java的集合 ----容器
  • 线程的状态以及变化
  • 并行和并发
  • ==和equals的区别是什么
  • JDK和JRE有什么区别?
  • 两个对象的hashcode()相同,则equals()也一定为true吗?
  • final在java中的作用?
  • java中操作字符串都有哪些类?有什么区别?
  • java的数据类型

平衡二叉树

  1. 是「二叉排序树」:左节点小于根节点,右节点大于根节点
  2. 任何一个节点的左子树或者右子树都是「平衡二叉树」(左右高度差小于等于 1)

try/catch-finally的执行顺序

try-catch后只要有finally,那么finally就一定会被执行;不管try-catch是否有return,finally仍然会执行,如果finally中有return,则只会返回finally中的return的值。

try {
    //代码块
} catch (Exception e) {
    //代码块
} finally {
    //代码块
}

添加链接描述

Java的异常

NullPointerException:
  空指针异常,当操作一个 null 对象的方法或属性时会抛出这个异常。是一个很头疼的异常,因为它是运行时异常,不需要手动捕获,但运行时碰到这个异常会中断程序。

OutOfMemoryError:
  内存溢出异常,这不是程序能控制的,当需要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。

IOException:
  IO,即:Input、Output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。
  IOException表示发出某种I/O,即输入输出操作期间异常发生的信号,此异常是由失败或中断的I/O操作产生的一般异常。
  当Java程序尝试读取或写入文件、网络连接、数据库或其他外部资源时,可能会出现 IOException。这些异常可能是由于文件不存在、无法访问文件、网络连接中断、磁盘空间不足等原因引起的。
FileNotFoundException:
  找不到文件异常,如果文件不存在就会抛出这种异常。
IndexOutOfBoundsException:
索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。

String常用方法

length() 方法:返回字符串字符序列的长度(空格也算),返回值为 int 类型

String str = new String(“Hello World”);
System.out.println(str.length());//11

charAt(int index) 方法:用于返回字符串指定位置的字符,返回值为 char 类型,参数为 int 类型

String str = new String(“Hello World”);
for (int i = 0; i < str.length(); i++) {
System.out.println(“下标为” + i + “的元素为:” + str.charAt(i));//打印的是每个字母
}

isEmpty() 方法:判断字符串是否为空,返回值为 boolean 类型

equals() 方法:比较字符串内容是否相等并返回,返回值为 boolean 类型

concat(String str):将指定字符串合并到原字符串末尾。
String str = “Hello”.concat(“World”).concat(“!”); // HelloWorld!

indexOf(char ch):返回指定字符在字符串中第一次出现的索引。

java的集合 ----容器

Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

线程的状态以及变化

线程的五大状态:创建状态、就绪状态、运行状态、阻塞状态、死亡状态
java基础_第1张图片

1创建状态(新生状态):new 线程对象Thread t = new Thread();线程对象一旦创建,就进入了新生状态。

2.就绪状态:new出来以后,当调用start()方法,线程就会立即进入就绪状态,但不意味着立即调度执行。

3.运行状态:处于就绪状态的线程,经过CPU调度就会进入运行状态,线程才会真正执行线程体的代码块。

4.阻塞状态:当调用sleep、wait或同步锁定时,线程进入阻塞状态,就是代码块不往下执行,阻塞事件解除后,重新进入就绪状态,等待CPU调度执行。

5.死亡状态:线程中断或结束,一旦进入死亡状态,就不能再次启动。

并行和并发

并行是指同时执行多个线程或进程,每个线程或进程有自己的处理器资源。并行可以提高程序的执行效率,但需要更多的硬件资源。
并发是指多个线程或进程交替执行,共享同一个处理器资源。而并发则可以在有限的硬件资源下提高程序的吞吐量。

==和equals的区别是什么

==比较的是两者的地址值,equals比较的是两者的内容是否一样

"=="比较的是基本类型的值引用类型的引用,判断是否完全相同。
"equals()"方法比较的是引用类型的内容,判断是否逻辑上相等。

JDK和JRE有什么区别?

JDK是java开发工具包
JRE是java运行时环境(包括Java基础类库,java虚拟机)

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

两个对象的equals返回true,那么hashcode一定相等;
两个对象的hashcode相等,那么equals不一定为true;

哈希码一样,内容不一样

不一定。

根据Java规范,如果两个对象的equals()方法返回true,那么它们的hashCode()方法必须返回相同的值。这是因为在Java中,当两个对象的hashCode()相同时,它们被认为是相等的,以便在哈希表等数据结构中进行正确的查找和比较操作。

然而,如果两个对象的hashCode()相同,它们的equals()方法并不一定返回true。这是因为hashCode()方法只是用来确定对象的哈希码,而equals()方法则用于比较对象的内容是否相同。两个不同的对象可以具有相同的哈希码,但它们的内容可能不相同。

因此,如果两个对象的hashCode()相同,则不能保证它们的equals()方法也返回true

final在java中的作用?

修饰类:表明该类不可被继承,类中的所有成员方法都隐式的被指定为final方法
修饰方法:不可被重写,JVM会尝试将其内联,以提高运行效率
修饰变量:不可被改变,修饰引用变量表示引用不可变,引用指向的内容可变
修饰常量:在编译阶段会存入常量池中

java中操作字符串都有哪些类?有什么区别?

String:是只读字符串,每次对string的操作都会产生一个新的对象
StringBuilder:可变的字符数组,线程不安全
StringBuffer:可变的字符数组,对方法加了同步锁,线程安全

在Java中,常用的操作字符串的类有以下几个:

  1. StringString类是Java中最基本的字符串类,它是不可变的(immutable),也就是说一旦创建后就不能被修改。对于每次对字符串进行修改,都会生成一个新的String对象。
  2. StringBuilderStringBuilder类是可变的(mutable)字符串类,它提供了修改字符串的方法,比如添加、插入、删除字符等操作。StringBuilder类适用于频繁修改字符串内容的场景,因为它的操作是在原字符串上直接进行的,避免了创建大量临时对象的开销。
  3. StringBufferStringBuffer类与StringBuilder类功能基本相同,也是可变的字符串类。唯一的区别是,StringBuffer是线程安全的,适用于多线程环境下的字符串操作,并且性能相对较低。

这些类之间的主要区别包括:

  • 可变性:String是不可变的,StringBuilderStringBuffer是可变的。
  • 线程安全性:StringStringBuilder是非线程安全的,而StringBuffer是线程安全的。
  • 性能:由于String的不可变性,每次对字符串进行修改都会创建一个新的对象,导致性能较差。相比之下,StringBuilderStringBuffer直接在原字符串上进行修改,性能较好。

因此,在选择使用哪个类时,需要根据具体的需求来判断。如果字符串是不变的且不需要频繁修改,可以使用String;如果需要频繁修改字符串或者在单线程环境下,可以使用StringBuilder;如果在多线程环境下,可以使用StringBuffer以保证线程安全性。

java的数据类型

java基础_第2张图片
java基础_第3张图片

你可能感兴趣的:(面试题,java)