字符串的拼接
使用StringUtils.join()进行拼接使用;
之前字符串拼接的时候采用的是数组+遍历的方式实现;
String []arry=new String[]{"123","abc","de12de"};
StringBuilder stringBuilder=new StringBuilder();
for(String s:arry){
stringBuilder.append(s).append("_");
}
System.out.println(stringBuilder.toString());
但是采用StringUtils工具类进行拼接直接使用join()就可以进行拼接
String []arry=new String[]{“123”,“abc”,“de12de”};
StringUtils.join(arry,“_”);
日期格式转换
在JDK8之前,Java只提供了一个Date类,当我们需要将Date按照一定格式转换成字符串的时候,这个时候需要使用到SimpleDateFormat类。
public class UTest {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将Date类型按照指定的字符串格式进行转换
String dateString=simpleDateFormat.format(date);
System.out.println(dateString);
}
}
但是这里面用到的SimpleDateFormat不是线程安全的,这就导致在多线程环境下可能出现线程安全的问题,因此,我们可以使用common-lang3下的时间工具类DataUtils/DateFormateUtils,从而解决Date与字符串的转换问题。
方法很简单,上面代码的转换等价于如下代码:
String dateString = DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss");
System.out.println(dateString);
字符串转日期格式
Date date = DateUtils.parseDate("2020-10-15 22:00:00","yyyy-MM-dd HH:mm:ss");
System.out.println(date);
集合数组判断非空
LIST:CollectionUtils.isEmpty()
MAP:MapUtils.isEmpty()
ARRAY:ArrayUtils.isEmpty(),注意不是来自于common-lang3包下面
数组快速加到list
List<String>list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String []arrays=new String[]{"d","e","f"};
CollectionUtils.addAll(list,arrays);
System.out.println(list);
MySql事务问题
事务要么全部执行,要么都不执行
事务的特性—ACID
一致性 事务不能破坏数据的完整性和业务的一致性 。例如在银行转账时,不管事务成功还是失败,双方钱的总额不变
原子性 事务是不可分割的工作单元,要么都成功,要么都失败,
如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。
隔离性 一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般是不可见)
持久性 事务提交之后,所做的修改就会永久保存,不会因为系统故障导致数据丢失
反射获取类的是三种方式
1.先创建对象,在通过对象.getClass()获取
2.包名+类名方式获取
3.直接类名.Class方式获取
//1、第一种方式–>Class.forName(“类名字符串”); //注:类名字符串是"包名+类名" 返回Class的对象。(这种是最常用的方法) Class c1=Class.forName(“包名.类名”);
//2、第二种方式–>先创建对象,再用对象调用getClass()方法,即实例对象.getClass().返回运行时类。
//任何一个java对象都有getClass()方法 Student s=new Student(); Class c2 =
s.getClass(); //3、第三种方式–>类名.class.返回Class的对象。(每个类都有class属性) Class
c3=Student.class;
多线程的创建方式
1.继承Thread
2.实现Runable
3.实现Callable
package thread;
/**
* @author Zhengpeng Fang
*/
public class Main {
public static void main(String[] args) {
/**
* 匿名内部类的实现
*/
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+'\t'+Thread.currentThread().getId());
}
}).start();
new Thread(){
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+'\t'+Thread.currentThread().getId());
}
}.start();
}
}
继承Thread实现只能完成单继承,但是实现Runable接口可以打破单继承的局限.
class MyCallable implements Callable<Integer>{
/**
* 实现Callable重写call(),在用Thread包装
* @return
* @throws Exception
*/
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()+'\t'+Thread.currentThread().getId());
int sum=0;
for (int i = 5000; i >0 ; i--) {
sum+=i;
}
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+'\t'+Thread.currentThread().getId());
return sum;
}
}