Java小特点

学习-java

一、 注解作用

  1. @Documented注解的作用 https://blog.csdn.net/zhangjin1120/article/details/120686429

如果一个注解@B,被@Documented标注,那么被@B修饰的类,生成文档时,会显示@B。如果@B没有被@Documented标准,最终生成的文档中就不会显示@B

  1. 注解@Retention的作用 @Target({ElementType.TYPE}) 注解

    注解@Retention可以用来修饰注解,是注解的注解,称为元注解
    Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
    这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
    按生命周期来划分可分为3类:
    1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
    2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
    3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
    这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
    那怎么来选择合适的注解生命周期呢?
    首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
    一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解
    如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;
    如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。

    注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错
    注解@Deprecated,用来表示某个类或属性或方法已经过时,不想别人再用时,在属性和方法上用@Deprecated修饰
    注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候

    转自:
    http://blog.csdn.net/liuwenbo0920/article/details/7290586
    http://blog.csdn.net/github_35180164/article/details/52118286

​ @Target({ElementType.TYPE}) 注解

​ ElementType 这个枚举类型的常量提供了一个简单的分类:注释可能出现在Java程序中的语法位置(这些常量与元注释类型(@Target)一起指定在何处写入注释的合法位置)

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpenseList{
    /**
     * 表名
     * @return
     */
//    String value();

    YbjcTsListEnum value();
}

二、 Java反射之Field用法

在Java反射中Field用于获取某个类的属性或该属性的属性值

2.1 如何通过Field反射获取类的属性

1:Class.getDeclaredField(String name);

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。

2:Class.getDeclaredFields();

返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)。

3:Class.getField(String name);

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

4:Class.getFields();

返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段。

下面一个例子说明如何通过Field反射获取类中的属性

package FieldTest;

import java.lang.reflect.Field;

/**
 * @author : DJ032915
 * @description : 反射用法
 * @program :
 * @date : 2023-03-01
 */
public class Test {
    public static void main(String[] args) throws NoSuchFieldException {
        Person person =new Person();
        //通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。
        Field f1=person.getClass().getDeclaredField("name");
        System.out.println("-----Class.getDeclaredField(String name)用法-------");
        System.out.println(f1);
        Field f=person.getClass().getDeclaredField("agentCode");
        System.out.println("-----Class.getDeclaredField(String agentCode)用法-------");
        System.out.println(f);
        System.out.println("-----Class.getDeclaredFields()用法-------");
        //通过Class.getDeclaredFields()获取类或接口的指定已声明字段。
        Field []f2=person.getClass().getDeclaredFields();
        for(Field field:f2)
        {
            System.out.println(field);
        }
        System.out.println("-----Class.getField(String name)用法-------");
        //通过Class.getField(String name)返回一个类或接口的指定公共成员字段,私有成员报错。
        Field f3=person.getClass().getField("name");
        System.out.println(f3);
        //如果获取age属性(私有成员) 则会报错
        //Field f3=person.getClass().getField("name");
        System.out.println("-----Class.getFields()用法-------");
        //通过Class.getField(),返回 Class 对象所表示的类或接口的所有可访问公共字段。
        Field []f4=person.getClass().getFields();
        for(Field fields:f4)
        {
            //因为只有name属性为共有,因此只能遍历出name属性
            System.out.println(fields);
        }
    }
}


三、isBlank 和 isEmpty的区别

 isEmpty:仅仅判断null(符串对象无法调用,故无法判断)和长度为0的字符串;
 isBlank:不仅判断null和长度为0的字符串,还判断空白字符(包括空格,制表符\t,换行符\n,换页符\f,回车\r)组成的字符串。

四、mysql查询字段是否包含某个值或某些值的方法(find_in_set函数)

SELECT * from demo where FIND_IN_SET('3',type);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wc6OIrXH-1677821208087)(C:\Users\dj032915\AppData\Roaming\Typora\typora-user-images\image-20230303093356626.png)]

这里使用到函数

FIND_IN_SET(str,strlist)函数 不走索引???

str :待查询的字符串 strlist :待查找的字段名,字段的值以”,”分隔( 只识别英文逗号 ),如 (1,2,3,5,7)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录。

like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文","分隔,Find_IN_SET查询的结果要小于like查询的结果

五、 正则表达式 与 mysql 结合 : 正则表达式 不走索引

mybatis 中

 dj.apply_to_com REGEXP #{orgCode}

mysql 使用正则的 详解

https://blog.csdn.net/weixin_45941687/article/details/125629590

不走索引的原因

https://blog.51cto.com/u_15069442/4341971

六、 索引引用

image-20230303095359628 image-20230303095417588

七、mybatis 常用字符比较

https://www.cnblogs.com/nhdlb/p/16643571.html

常用的转义字符如下

&    (转义符)     &amp;
<    (转义符)     &lt;
<=     (转义符)     &lt;=
>    (转义符)     &gt;
>=     (转义符)     &gt;=
"   (转义符)     &quot;
'   (转义符)     &apos;
空格   (转义符)     &nbsp;

表达式转义

<![CDATA[<]]>     表示    <
<![CDATA[>]]>     表示    >
<![CDATA[<=]]>    表示    <=
<![CDATA[>=]]>    表示    >=

在mysql中字符串日期可以直接和datetime类型之间比较,无需转换,Mysql会将字符串类型日期转换成长整型数字进行比较,当然你也可以转换为同一类型后再比较。

mybatis 怎样写法 格式时间,可以走索引

字符串转日期:STR_TO_DATE('2021-08-17 00:00:33', '%Y-%m-%d %H:%i:%s')   走索引
日期转字符串:DATE_FORMAT('2021-08-17 00:00:33', '%Y-%m-%d %H:%i:%s') 不走索引

详细连接

https://huaweicloud.csdn.net/633562a9d3efff3090b54fc3.html

八、 java的String类型排序,字符串比较大小

  1. compareTo
    
  2. Integer.valueOf("2147483647");
    

一种是 String类型 默认的方法比较

一种是 转换成 Int型比较

compareTo 源码分析
public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;
 
        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

查看string类型的源码,String这个类继承了Comparable这个类,同时实现了compareTo这个方法。所以可以使用这个方法,对于一些数值类型的字符串,或者时间类型的字符串,是可以直接拿去使用的。

源码里面,其实比较的就是相同位置的字符,每个字符都对应一个ascll码值。数字0对应48,9对应的是57、A对应65、a对应97。所以对于数字类型的字符串,可以不用转化为数值类型,再比较大小。

  1. 效率的话 compareTo > 转化成int型

    public static int compare() {
            // int 的最大值 Integer.MAX_VALUE(2147483647)
            String a = "2147483647";
            String b = "2147483646";
            return a.compareTo(b);
        }
     
        public static int compareValue() {
            int a = Integer.valueOf("2147483647");
            int b = Integer.valueOf("2147483646");
            return Integer.compare(a, b);
        }
     
        public static void main(String[] args) {
            int times = 10000_00; // 循环次数
            long start = System.currentTimeMillis();
            int tmp = 0;
            for (int i = 0; i < times; i++) {
                tmp = compare();
            }
            System.out.println(" 直接比较耗时:" + (System.currentTimeMillis() - start));
            start = System.currentTimeMillis();
            for (int i = 0; i < times; i++) {
                tmp = compareValue();
            }
            System.out.println("  转化后耗时:" + (System.currentTimeMillis() - start));
            System.out.println(tmp);
        }
    

    九、 数据库开发规范

    注意 索引设计以及索引顺序

    https://blog.csdn.net/lisheng19870305/article/details/115013484

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值