一:字符串
- 判断字符串的开始和结尾
str.startsWith(String prefix)、 str.endsWith(String suffix) - 数字前自动补零
String.format(“%04d”, 1)
//0 代表前面补充0,4 代表长度为4,d 代表参数为正数型,结果为字符串:0001 - 判断字符串包含汉字:
boolean flag = (str.length() == str.getBytes().length);
//true:无汉字 false:有汉字
判断是否全为汉字:
String str = “java判断是否quan为汉字”
String reg = “[\u4e00-\u9fa5]+”
boolean result1 = str.matches(reg)//false - StringBuilder &&StringBuffer删除最后一个字符
StringBuffer sb = new StringBuffer(“dfdsfads,”);
sb.deleteCharAt(sb.length()-1); - Sting 如何替换指定位置的字符
String str = “****”;
if(StringUtils.isNotBlank(str)){
StringBuilder sb = new StringBuilder(“18698587234”);
sb.replace(3, 7, str);
System.err.println(“========”+sb.toString());
}
二:数组
- 数组也是一个对象。定义一个数组:int month[] = new int[12];
- 初始化一维数组:int arr[] = new int[]{1,2,3,5,25};或int arr[]={34,23,12,6};
- 二维数组:一维数组的各个元素仍然是一个数组,常用于表示表,表中的信息以行和列的形式组织。定义一个二维数组:int a[][] = new int[2][4];
- 初始化二维数组:int myarr[][] = {{12,0},{45,10}};
- 遍历数组用for循环或加强for循环
- 填充替换数组:
int arr[] = new int[5];Arrays.fill(arr,8);
int arr[] = new int[]{45,12,2,10};
Arrays.fill(arr,1,2,8);//将数组下标为1的元素替换为8,结果为{45,8,2,10}; - 数组排序:Arrays.sort(arr);
- 数组复制:
int arr[] = new int[]{23,42,12};
int newarr[] = Arrays.copyOf(arr,5) //新数组值为{23,42,12,0,0}
int arr[] = new int[]{23,42,12,84,10};
int newarr[] = Arrays.copyOfRange(arr,0,3) //新数组值为{23,42,12}
三:BigDecimal类
- 加:b1.add(b2);
- 减:b1.subtract(b2);
- 乘:b1.multiply(b2);
- 除:b1.divide(b2,2,BigDecimal.ROUND_HALF_UP) //商结果四舍五入保留2位
四:异常类
-
Throwable:父类
-
Error:Throwable的子类,如VirtualMachineError(虚拟机异常)TreadDeath(线程死锁)等。出现 Error异常,程序会崩溃。
-
Exception:Throwable的子类。编码、环境、用户输入操作出现问题
-
Runtime Exception:非检查异常/运行时异常,Exception的子类,如NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界异常)、ClassCastException(类型转换异常)、
运行时异常java虚拟机会自动抛出,自动捕获,说明代码本 身有问题,需要改进。 -
非运行时异常/检查异常:IOException(文件异常)、SQL异常SQLException等,需要手动捕获异常。
-
捕获并处理异常
try{
//一些会抛出异常的方法
}catch( Exception e){
//处理该异常的代码块,可以发出警告或记录错误日志
}finally(){
最终将要执行的一些代码
}
try{}catch(){}后面的代码会继续执行。
多重catch语句块先子类后父类。在使用了全局统一异常捕获之后,如果在Controller方法里面继续try-catch异常捕获之后,会导致,全局统一异常捕获没有办法捕获到这个方法的异常了。会返回成功结果。
所以如果一些必须要捕获的,可以是throws 出去。
如果在调用的某些service执行方法时出现了异常,全局统一异常会捕获到,并进行统一处理返回的。所以不用在 Controller方法里面,对方法进行单独的try-catch。来决策返回状态结果
五:集合类
-
ArrayList 、LinkList区别:
(1) ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
(2) 对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随机定位,而LinkedList要移动指针一步一步的移动到节点处
(3) 对于新增和删除操作add和remove,LinedList比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的对象的空间。
(4) 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的
-
List排序
基本数据类型list:Collections.sort(list);
复杂对象list:Collections.sort(list);
//对象的类要implements Comparable,重写compareTo方法 -
判断list不能为空:CollectionUtils.isNotEmpty(list)
-
List集合取交集、并集、去除重复数据等
有重复并集
list1.addAll(list2);
交集
list1.retainAll(list2);
差集
list1.removeAll(list2);
无重复并集
list1.removeAll(list2);
list1.addAll(list2);
对象类型要重写equals与hashCode方法
jdk8及以上交集、并集、去除重复数据用lambda表达式 -
迭代器遍历集合时,不能使用集合的remove方法,要用迭代器的remove方法。
-
HashMap初始化时,尽量指定初始值大小。如果暂时无法确定集合大小,那么指定默认值(16)即可。
-
List转Map:
houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename)); -
HashMap Hashtable区别:
HashMap方法是非同步的,Hashtable是同步的,是线程安全的;
HashMap的k,v都可以为null,Hashtable的k,v不允许为null;
HashMap比Hashtable的效率高,一般用 HashMap。
六:日期类
- 获取当前时间的毫秒数:
// 第一种
System.currentTimeMillis();
// 第二种
Date date = new Date();
date.getTime();
// 第三种
Calendar calendar = Calendar.getInstance();
long time = calendar.getTimeInMillis(); - 日期转为毫秒数:
String date = “2001-03-15 15-37-05”;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH-mm-ss”);//24小时制
long time = simpleDateFormat.parse(date).getTime(); - date类型和calendar类型区别:
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。日期计算(年月日增减等)用Calendar类。
七:枚举类
- JDK1.5中新增了枚举类型。常量可以用常量类也可以用枚举类。
- 对于毫无规则归类可言的一些常量:如SUCCUSS字符串、密钥串、路径等等这些,可以放在一个常量类里面糅在一起。而对于数据库中对应type、status类型字段并且是可以枚举出来的,强烈建议使用enum类型,在平时获取、使用、校验起来常量无法比拟的,而且可以很少犯错,非常大程度上增加代码的可读性。
- 枚举类型也可以在类的内部进行定义,与内部类类似。
- 可以将一个枚举类型看作是一个类,每一个枚举类型成员都可以看作是枚举类型的一个实例。
- 枚举类型名称.values()方法:将枚举类型的成员变量以数组的形式返回。
- 枚举类型名称.valueOf()方法:将普通字符串转换为枚举实例。
- 枚举对象.compareTo()方法:比较两个枚举对象在定义时的顺序。调用compareTo()方法返回的结果,正值代表方法中参数在调用该方法的枚举对象位置之前,0代表两个枚举对象的位置相同,负值代表方法中参数在调用该方法的枚举对象位置之后。
- 枚举对象.oridnal()方法:用于获取某个枚举对象的位置索引。
- 常用枚举定义示例
/**
* 类名: SEX
* 描述: 性别
*/
public enum SEX{
MALE("1", "男"),
FEMALE("2", "女");
// 成员变量
private String code;
private String name;
// 构造方法,代码中调用枚举SEX.MALE会调用该构造方法,给code赋值“1”,name赋值“男”
private SEX(String code, String name) {
this.code = code;
this.name = name;
}
//通过code获取name
public static String getName(String code) {
if(StringUtils.isBlank(code)) {
return "";
}
for (SEX ec : SEX.values()) {
if (code.equals(ec.getCode())) {
return ec.getName();
}
}
return null;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
八:泛型
- JDK1.5版本中提出了泛型的概念。JDK1.5版本之前,Java也提供了对Object引用进行“向下转型”及“向上转型”操作,但某些强制类型转换错误不会被编译器捕捉,存在安全隐患。
- 向下转型:父类转换为子类,需要强制类型转换。向上转型:子类转换为父类,可以自动转换。
- 定义泛型类
//比如:创建一个类处理 int 类型和 double 类型的加法运算
class ClassName<T>//定义泛型类
{
private T a;//定义泛型成员变量
private T b;
public ClassName(T a,T b)//定义泛型构造函数
{
this.a = a;
this.b = b;
}
public T GetSum()
{
return a + b;
}
}
- 定义泛型类时声明数组类型。不可以使用泛型来建立数组的实例。
public class ArrayClass<T> {
private T[] array;//定义泛型数组
public T[] getArray() {
return array;
}
public void setArray(T[] array) {//为成员数组赋值
this.array = array;
}
public static void main(String[] args) {
ArrayClass<String> a = new ArrayClass<String>();
String[] arry = {"成员1","成员2","成员3","成员4","成员5"};
a.setArray(arry);//调用set方法
for (int i=0;i<a.getArray().length;i++){//调用get方法
System.out.println(a.getArray()[i]);
}
}
}
- 泛型的类型参数只能是类类型,不能是简单类型。