java基础复习

参考:https://blog.csdn.net/weixin_42032770/article/details/116544962

参考:https://blog.csdn.net/a778203081/article/details/129296369

1、string、stringbuilder和stringbuff的区别

  1. 可变性:String是不可变的(immutable),一旦创建就不能修改,每次对字符串的操作都会创建一个新的字符串对象。StringBuilderStringBuffer是可变的(mutable),可以直接修改已有的字符串对象,而不需要创建新的对象。
  2. 线程安全性:String是线程安全的,因为它的不可变性保证了多个线程同时访问同一个字符串对象时不会产生竞态条件。StringBuilder是非线程安全的,适用于单线程环境下的字符串操作。StringBuffer是线程安全的,适用于多线程环境下的字符串操作,但相对于StringBuilder略慢一些。
  3. 性能:由于String的不可变性,每次修改都需要创建一个新的字符串对象,这在频繁操作字符串时可能会导致内存开销。StringBuilderStringBuffer的可变性能够避免这一问题,特别适用于需要大量字符串操作的场景。在单线程环境下,StringBuilder的性能优于StringBuffer,因为StringBuilder不需要考虑线程安全的开销。

·  综上所述,如果需要进行频繁的字符串操作且在单线程环境下,推荐使用StringBuilder;如果在多线程环境下,推荐使用StringBuffer以确保线程安全;如果字符串不需要修改,则可以使用String来获得更好的性能。

2、== 和 equals 的区别是什么?

  一,对于 == ,比较的是值是否相等如果比较的是基本的数据类型的变量,则直接比较其存储的值是否相等,如果比较的是引用数据类型,则比较的是所指向的对象的地址值。
  二,equals不能作用于基本数据类型,它比较的是是否相同的对象,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象地址值,String和Date等类对equals方法进行重写,比较的则是所指向的对象内容。

3、两个对象的HashCode()相同,则equals()也为true,对嘛?

首先,两个对象equals相等,hashcode 一定相等;但是hashcode相等时,equals不一定相等。
其次,两个不同的对象,因为可能存在哈希碰撞,所以hashcode可能是相等的,但是显然equal不为true,还有就是,在objiect类中,euqals方法还是用的 == 来判断的, 对于对象而言比较的是地址值,所以equals相等hashcode一定一样,反之就不一定了。
4、

4、final 在 Java 中有什么作用?

  1. 可以用于修饰类、方法和变量。
  2. final修饰一个类时,表示该类不能被继承,即为最终类。
  3. final修饰一个方法时,表示该方法不能被子类重写,即为最终方法。
  4. final修饰一个变量时,表示该变量是一个常量,不能再被修改,即为最终变量。
    • 对于基本类型,一旦被赋值后就不能再改变。
    • 对于引用类型,一旦被初始化后就不能再指向其他对象,但对象的属性仍可修改。

5、Java 中操作字符串都有哪些类?他们之间有什么区间?

有String,String Builder ,String Buffer

1.String是不可变的,每次对String的操作都会产生一个String对象

2.String Builder和String Buffer是可变的,能够被多次修改,并不会产生新的对象。

3.StringBuilder 是线程不安全的,StringBuffer是线程安全的。

4.StringBuilder的处理速度比StingBuffer要快;

总的来说,选择使用哪个类取决于具体的需求。如果字符串操作较少,或者在单线程环境下,可以使用String类。如果需要频繁进行字符串操作,且在单线程环境下,可以使用StringBuilder。如果在多线程环境下需要进行字符串操作,可以使用StringBuffer来确保线程安全。

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

他们的值相等,用equals得到true,但是他们是两个对象,如果用==判断返回false。
且str="i"是直接在常量池中引用字符串,而new String(“i”) 是在堆中根据i再创建一个对象。

 7、如何将字符串反转?

通过StringBuilder 的 reverse() 方法可以直接反转 StringBuilder sb = new StringBuilder(“abc”); sb.reverse().toString();
通过String的toCharArray 方法可以获得字符串每一个字符并且转换为字符串数组然后循环从后往拼接即可。
递归的方法反转(当只有一个字符时,返回原字符;当有两个以上的字符时,返回结果为第二个字符开始的字符串+第一个字符)
public String reverseString(String str){
if((null == str) || str.length() < 2){
return str;
}
return reverseString(str.subString(1)) + str.charAt(0);
}

8、 String 类的常用方法都有那些?

charAt(int index)返回指定索引处的字符
length() 返回字符串长度
split() 根据给定的正则表达式拆分字符串
toString() 返回此对象本身

9、抽象类必须要有抽象方法吗?

抽象类可以没有抽象方法,但是如果一个类已经声明为抽象类,那么它也不能再实例化,不能直接构造该类对象。

不,抽象类不一定要有抽象方法。一个类被声明为抽象类(abstract class)是为了表示它是一个抽象的概念,不能被直接实例化,只能作为其他具体类的父类或基类。

抽象方法(abstract method)是在抽象类中声明但没有具体实现的方法,它没有方法体,只有方法的签名。抽象方法必须被具体的子类重写(覆盖)实现,以使子类成为一个具体的类。如果一个类中包含抽象方法,那么该类必须被声明为抽象类。

但是,抽象类并不一定要包含抽象方法。抽象类可以包含普通的具体方法(有方法体的方法),这些方法可以被直接继承和使用。抽象类可以像普通类一样有成员变量和非抽象的成员方法。

因此,抽象类的主要作用是为子类提供一个通用的抽象概念和共享的行为,它可以包含抽象方法以强制子类实现特定的行为,也可以包含具体方法以提供默认的实现。但抽象类并不强制要求包含抽象方法。

10、普通类和抽象类有哪些区别?

  1. 抽象类不能被实例化,普通类反之。
  2. 抽象类的访问权限限于public和protected,如果为private的话,就不能被子类继承了。
  3. 如果一个类继承于抽象类,则它必须实现父类的抽象方法,如果不想实现,那么子类也必须是抽象类。

11、抽象类能使用final修饰吗?

不能,final修饰的类是不能被继承的,如果抽象类不能继承,就没意义了。

12、接口和抽象类有什么区别?

  1. 抽象类可以有构造方法,接口不能有结构方法。
  2. 抽象类可以包含非抽象方法,接口则不能。
  3. 抽象类方法访问权是public,protected,接口中只能是public。
  4. 只能单继承,但是可以多实现。

  1. 方法实现:接口中的方法都是抽象方法,没有具体的实现。抽象类中可以包含抽象方法和具体方法(有实现代码的方法)。

  2. 实现方式:一个类可以实现多个接口,但只能继承一个抽象类。

13、Java 中 IO 流分为几种?

大的方面来说有两种:字节流和字符流
字符流继承于 InputStream,OutputStream
字符流继承于Reader,Writer

14、BIO,NIO,AIO 有什么区别?

1.BIO 表示同步阻塞式IO,交互方式是同步,阻塞方式,即客户端有连接请求时服务端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的开支。
2.NIO表示同步非阻塞IO,客户端发送的连接请求都会注册到多路复用器轮询到连接有I/O请求时才启动一个线程处理。
3.AIO表示异步非阻塞IO,客户端的I/O请求都是由操作系统先完成IO操作后再通知服务器应用来启动线程处理。

15、Files 的常用方法都有哪些?

String getName():返回File对象所表示的文件名或文件路径。
String getPath(): 返回File对象所对应的相对路径。
boolean exists():判断File对象的文件或者目录是否存在。
boolean isDirectory():判断File 对象是否是目录

16、集合的父类是什么

List<T> extends Collection<T> Collection<T> entends Iterable<T>

List:元素有序且可重复,主要实现类有 ArrayList,LinkedList,Vector。

Set:元素不可重复。主要实现类:HashSet,TreeSet,LinkedHashSet。

Vector类是线程安全的,因为Vector类里面的方法都是有synchronized修饰的。

ArrayList类不是线程安全的,ArrayList类里面的方法是没有用synchronized同步的

17、final、finally、finalize的区别与用法

  • final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。

18、线程中sleep和wait的区别

  1. sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。
  2. sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。
  3. 它们都可以被interrupted方法中断。

19、悲观锁和乐观锁

悲观锁,就是以悲观的态度来处理一切冲突。在数据修改前就先把数据锁住,防止其他人操作数据。在锁释放前,除了加锁者自己,其他人都不可以操作该数据。直到前面的加锁者把锁释放,然后后面的人拿到锁,并对数据加锁后才能对数据进行处理。常见的悲观锁像数据库中的行锁,表锁,读锁,写锁这些都是在做操作之前先上锁,是悲观锁。java线程同步中的synchronized也是悲观锁。

注意:悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

乐观锁,就是以乐观的态度来处理一切冲突。在数据修改前无需加锁,只有在数据要提交时才会进行冲突检测。如果冲突了则提交失败并返回错误的信息给用户。

乐观锁是一种并发类型的锁,其本身不对数据进行加锁通而是通过业务实现锁的功能,不对数据进行加锁就意味着允许多个请求同时访问数据,同时也省掉了对数据加锁和解锁的过程,这种方式大大的提高了数据操作的性能。

乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量

20、索引失效

计算、函数、类型转换会使索引失效
使用 != 或者<> 的时候无法使用索引会导致全表扫描
is not null 也无法使用索引,但是is null是可以使用索引的
like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作
字符串不加单引号索引失效
少用or,用它来连接时会索引失效

21、索引分类

Mysql有普通索引、唯一索引、主键索引、组合索引、全文索引。

22、索引的优缺点

优点:大大提升查询效率

缺点:建立索引后,执行update、insert、delete操作效率会降低。insert数据时,要额外建立索引耗费存储空间。

23、索引底层

索引底层通常会采用B树实现,因为B树会自动根据两边的情况自动调节,使两端无限趋*于*衡状态。可以使性能最稳定。但B树也有弊端就是当插入/修改操作过多时,B树会不断调整*衡,消耗性能,因此索引不是越多越好。

24、数据库事务四大属性

ACID:原子性、一致性、隔离性和持久性

一、原子性(atomicity)

一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性。

二、一致性(consistency)

事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。

如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态。

三、隔离性(isolation)

事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

四、持久性(durability)

一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。--即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。

25、Spring IOC和AOP

IOC,即控制反转,是通过依赖注入的方式去实现的。

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
业务层要用数据层的类对象,以前是自己 new 的
现在自己不new了,靠 别人[外部其实指的就是IOC容器] 来给注入进来
这种思想就是依赖注入

 

AOP :全称是 Aspect Oriented Programming 即:面向切面编程。AOP可以把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强

26、什么是同步和异步

同步:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程。

异步:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

27、Springboot常用注解

@SpringBootApplication:Springboot项目启动类注解

@MapperScan:加在springboot启动类上,编译后会扫描相应接口的实现类(mybatis)

@Component、@Repository、@Service:用于类注解,表示将该类变成一个bean

@Component:服务层接口

@Service:服务层实现类

@Repository:持久层

@Autowired:自动装配。

@Resource:属性注入=@Autowired+@Qualifier
@Bean:用于告诉 Spring 容器将标注的方法所返回的对象注册为一个 Bean

28、java中有几种方法可以实现一个线程?

继承 Thread 类

实现 Runnable 接口

实现 Callable 接口,需要实现的是 call() 方法

29、String类的常用方法有那些?

1、 charAt:返回指定索引处的字符

2、 indexOf():返回指定字符的索引

3、 replace():字符串替换

4、 trim():去除字符串两端空白

5、 split():分割字符串,返回一个分割后的字符串数组

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

7、 length():返回字符串长度

8、 toLowerCase():将字符串转成小写字母

9、 toUpperCase():将字符串转成大写字符

10、 substring():截取字符串

11、 format():格式化字符串

12、 equals():字符串比较

30、GC是什么,为什么需要用GC

GC是垃圾回收(Garbage Collection)的缩写,是一种自动内存管理机制。它是现代编程语言(如Java、C#等)中常见的一种特性,用于自动释放程序中不再使用的内存资源。

在计算机程序运行过程中,内存是必不可少的资源。程序创建对象、分配内存空间,但是在一些情况下,这些对象可能不再被程序使用,但仍然占用着内存资源。如果不进行适当的内存管理,这些无用的对象占用的内存会不断累积,最终导致内存耗尽,并可能引发内存泄漏等问题。

为了解决这个问题,引入了垃圾回收机制。垃圾回收通过自动监测和收集程序中不再使用的对象,释放它们所占用的内存空间。这样,开发人员无需明确地手动管理内存,而是借助垃圾回收器来执行这项任务。

31、String能不能被继承?

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了
提高效率节省空间,我们应该用StringBuffer类

32、设计模式

  1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。
  2. 工厂模式(Factory Pattern):通过工厂类创建对象,隐藏对象的实例化逻辑。
  3. 观察者模式(Observer Pattern):定义对象之间一对多的依赖关系,当一个对象状态发生改变,其他依赖对象会收到通知。
  4. 装饰器模式(Decorator Pattern):动态地给对象添加新的功能,不改变其接口。
  5. 适配器模式(Adapter Pattern):将一个类的接口转换成客户期望的接口,使原本不兼容的类能够合作。

33、get和post 的区别

1.GET把参数包含在URL中,POST通过request body传递参数。
2.GET请求会被浏览器主动cache(缓存),而POST不会,除非手动设置。
3.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

34、Mybatis中#和$区别

#符号在SQL语句中表示一个占位符,用于传递参数值,#会对参数进行预编译,转义特殊字符,防止SQL注入攻击。
$符号同样表示一个占位符,用于传递参数值,使用$时,应注意潜在的SQL注入风险。因为参数值直接替换到SQL语句中,如果参数值未经过正确的转义或验证,可能导致安全问题

35、char类型能不能出存储汉字,为什么?

一个char 类型占 2 个字节(16 比特),所以放一个中文是没问题的

36、如何使用 Spring Boot 实现异常处理?

Spring 通过使用 @ControllerAdvice 注解处理异常,实现一个ControllerAdvice 类来处理控制器类抛出的所有异常。

37、Spring Boot 自动配置原理是什么

Spring Boot 的自动装配是基于 Spring 框架提供的依赖注入和组件扫描机制实现的。自动依赖注入:Spring Boot 会利用依赖注入机制来自动装配所需的组件。通过使用 @Autowired@Inject 或 @Resource 等注解,自动将依赖的组件注入到所需的地方。自动配置启动:当应用程序启动时,Spring Boot 会自动加载并启用自动配置。它通过类路径下的 META-INF/spring.factories 文件自动发现可用的自动配置类。

38、redis的数据类型有哪些

字符串、集合、哈希、有序集合、无效集合

 

posted @ 2023-07-23 15:27  苦逼yw  阅读(25)  评论(0)    收藏  举报