Java小笔记

目录

数据类型:

String 字符串

StringBuffer:

 StringBuilder:

集合:

Collection

数据类型:

String 字符串

首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象。查看源码就会发现String类为final型的(当然也不可被继承),而且通过查看JDK文档会发现几乎每一个修改String对象的操作,实际上都是创建了一个全新的String对象。

字符串为对象,那么在初始化之前,它的值为null,到这里就有必要提下””、null、new String()三者的区别。null 表示string还没有new ,也就是说对象的引用还没有创建,也没有分配内存空间给他,而””、new String()则说明了已经new了,只不过内部为空,但是它创建了对象的引用,是需要分配内存空间的。打个比方:一个空玻璃杯,你不能说它里面什么都没有,因为里面有空气,当然也可以把它弄成真空,null与" "、new String()的区别就象真空与空气一样。

在字符串中存在一个非常特殊的地方,那就是字符串池。每当我们创建一个字符串对象时,首先就会检查字符串池中是否存在面值相等的字符串,如果有,则不再创建,直接放回字符串池中对该对象的引用,若没有则创建然后放入到字符串池中并且返回新建对象的引用。这个机制是非常有用的,因为可以提高效率,减少了内存空间的占用。所以在使用字符串的过程中,推荐使用直接赋值(即String s=”aa”),除非有必要才会新建一个String对象(即String s = new String(”aa”))。

StringBuffer:

StringBuffer和String一样都是用来存储字符串的,只不过由于他们内部的实现方式不同,导致他们所使用的范围不同,对于StringBuffer而言,他在处理字符串时,若是对其进行修改操作,它并不会产生一个新的字符串对象,所以说在内存使用方面它是优于String的。

其实在使用方法,StringBuffer的许多方法和String类都差不多,所表示的功能几乎一模一样,只不过在修改时StringBuffer都是修改自身,而String类则是产生一个新的对象,这是他们之间最大的区别。

同时StringBuffer是不能使用=进行初始化的,它必须要产生StringBuffer实例,也就是说你必须通过它的构造方法进行初始化。

在StringBuffer的使用方面,它更加侧重于对字符串的变化,例如追加、修改、删除,相对应的方法:

  • 1、append():追加指定内容到当前StringBuffer对象的末尾,类似于字符串的连接,这里StringBuffer对象的内容会发生改变。
  • 2、insert:该类方法主要是在StringBuffer对象中插入内容。
  • 3、delete:该类方法主要用于移除StringBuffer对象中的内容。

 StringBuilder:


字符串拼接方式:三种拼装的方法:+、concat()以及append()方法。

  • str +=”b”: 最慢,因为会创建一个新的对象并且toString,str = new StringBuilder(str).append("b").toString();
  • concat方法的话,是拷贝数组,同时也会new String()对象
  • append() 是直接使用父类AbstractStringBuilder的append()方法,并没有创建任何新的对象

集合:

Collection:


  • **Collection:* *Collection 层次结构 中的根接口。它表示一组对象,这些对象也称为 collection 的元素。对于Collection而言,它不提供任何直接的实现,所有的实现全部由它的子类负责。
  • AbstractCollection: 提供 Collection 接口的骨干实现,以最大限度地减少了实现此接口所需的工作。对于我们而言要实现一个不可修改的 collection,只需扩展此类,并提供 iterator 和 size 方法的实现。但要实现可修改的 collection,就必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法。
  • Iterator: 迭代器。
  • ListIterator: 系列表迭代器,允许程序员按任一方向遍历列表. 迭代期间修改列表,并获得迭代器在列表中的当前位置。
  • List: 继承于Collection的接口。它代表着有序的队列。
  • AbstractList: List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作。
  • Queue: 队列。提供队列基本的插入. 获取. 检查操作。
  • Deque: 一个线性 collection,支持在两端插入和移除元素。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
  • AbstractSequentialList: 提供了 List 接口的骨干实现,从而最大限度地减少了实现受“连续访问”数据存储(如链接列表)支持的此接口所需的工作。从某种意义上说,此类与在列表的列表迭代器上实现“随机访问”方法。
  • LinkedList: List 接口的链接列表实现。它实现所有可选的列表操作。
  • ArrayList: List 接口的大小可变数组的实现。它实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
  • Vector: 实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。
  • Stack: 后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。
  • Enumeration: 枚举,实现了该接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。

@Autowired 和 @Resource 的区别

首先,在开发工作中,二者皆可,遇到问题实际解决问题

区别1:

@Autowired 是spring的注解,spring 属于第三方

@Resource 是JDK的注解,J2EE是java自己的

理论上讲,使用@Resource 可以减少代码和Spring 之间的耦合

区别2:

@Resource默认按照名称方式进行bean匹配,

@Autowired默认按照类型方式进行bean匹配

@Resource(import javax.annotation.Resource;)是J2EE的注解

@Autowired( import org.springframework.beans.factory.annotation.Autowired;)是Spring的注解

@Autowired注解默认按类型(byType)装配依赖对象,它要求依赖对象必须存在;若允许依赖对象不存在,可设:@Autowired(required = false) 。

@Autowired也可以按名称(byName)装配,需要结合@Qualifier:
@Autowired
@Qualifier("manImpl")

@Resource默认按名称(byName)装配,也可按类型装配,装配顺序如下: 

如果同时指定name(@Resource(name=""))和type(@Resource(type="")),则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常  
如果指定name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常  
如果指定type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常  
如果既没指定name,又没指定type,则默认按照byName方式进行装配;如果匹配不到,则回退为一个原始类型进行匹配,如果匹配则自动装配。


实际来讲一个处理:使用@Autowired 注入,必须注入的类有spring 的注解,可以被spring扫描到,如果没有,可以加:@Autowired(required = false) 或者使用@Resource

==和equals的区别: 

 “==”和equals 最大的区别是

  • “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值
  • equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值

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

抽象类
含有抽象方法的类就叫抽象类。而抽象方法就是被abstract修饰的方法,这个方法可以没有具体的实现。
在抽象类的子类中必须对抽象方法进行重写,当其子类为抽象类时,可以不重写抽象方法,但在其子类中一旦有普通类,则必须重写父类继承的所有抽象方法。
抽象类不可以实例化。抽象类的构造方法作用为初始化子类对象。
抽象类存在的意义就是为了被继承。
抽象类中的普通属性和普通方法都需要用子类的对象去调用。

普通类
普通类可以实例化,实例化后可以调用自己类中的属性和方法或父类的方法和属性。
普通类的构造方法中必须要调用父类的构造方法
如果普通类继承了抽象类,那么必须要重写所有父类的抽象方法
普通类存在的意义就是实例化。

普通类和抽象类的区别总结
1、抽象类的存在时为了被继承,不能实例化,而普通类存在是为了实例化一个对象
2、抽象类的子类必须重写抽象类中的抽象方法,而普通类可以选择重写父类的方法,也可以直接调用父类的方法
3、抽象类必须用abstract来修饰,普通类则不用
4、普通类和抽象类都可以含有普通成员属性和普通方法
5、普通类和抽象类都可以继承别的类或者被别的类继承
6、普通类和抽象类的属性和方法都可以通过子类对象来调用
 

 Spring事务控制

设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

 简单说下:事务回滚需要代码运行异常,但是有一段代码明知可能会有异常,所以用try catch 捕获了异常,事务失效,所以要手动把异常在给抛出去,让事务生效

当我们需要在事务控制的service层类中使用try catch 去捕获异常后,就会使事务控制失效,因为该类的异常并没有抛出,就不会触发事务管理机制。怎样才能即使用try catch去捕获异常,而又让出现异常后spring回滚呢?

1 可在catch中抛出运行时异常throw new RuntimeException(e)

2 手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

使得事务生效,异常回滚。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值