Java笔记(2)

Java命名规范

代码语言:javascript
复制
 包(Package):
     包名全部小写,通常采用反向域名的形式,例如:com.example.myproject

类(Class) 和 接口(Interface):
首字母大写的驼峰式命名,例如:MyClassName 或 MyInterfaceName

枚举(Enum):
同类和接口的命名规则,例如:ColorType

方法(Method):
小写字母开头的驼峰式命名,动词开头,例如:methodName 或 doSomething

变量(Field):
小写字母开头的驼峰式命名,如果是实例变量,首字母小写,例如:instanceVariable
如果是常量(final static),则全大写,单词间用下划线分隔,例如:public static final int MAX_VALUE

常量(Constant):
全部大写字母,单词间用下划线分隔,例如:MY_CONSTANT

参数(Parameter):
同变量命名规则,小写字母开头的驼峰式命名,例如:parameterName

局部变量(Local Variable):
同变量命名规则,但可以更简洁,只要保持可读性即可

布尔变量(Boolean Variables):
避免使用简单的is或has作为布尔变量名,例如:isActive而不是isactive

java调试与反编译

内存查询工具可以使用 终端jps==>jhsdb hsdb

终端 javap进行反编译

  • java文件 + $ + 1.class
代码语言:javascript
复制
 new Animal(){//匿名类,继承animal方法
@Override
public void eat() {
System.out.println("吃东西");
}
};

new Animal(){//匿名类,继承animal方法
@Override
public void eat() {
System.out.println("匿名类调用吃东西");
}
}.eat();//新建类并调用重写的方法


Android的开发就有这个应用场景,当我要按一个按钮时会有一个设置监听器的方法来控制交互,里面需要转递一个对象,这里就可以用匿名累,不用额外再创建一个类了,大大简化了开发过程以及提升了开发效率

 method(
             new Animal(){
                 @Override
                 public void eat() {
                     System.out.println("狗吃东西");
                 }
             }
     );//这样单次调用就不用新建一个新类,大大简化了开发过程以及提升了开发效率</code></pre></div></div><h3 id="9rf8v" name="%E5%B8%B8%E7%94%A8API(%E7%8E%B0%E6%88%90%E7%9A%84java%E7%B1%BB)"><strong>常用API(现成的java类)</strong></h3><h4 id="9abjs" name="Math(Math.%E6%96%B9%E6%B3%95)"><strong>Math(Math.方法)</strong></h4><ol class="ol-level-0"><li>abs(int)</li><li>ceil(double)向上取整 floor(double)向下取整</li><li>round(float)四舍五入</li><li>random()  [0.0,1.0)</li></ol><p><code>abs(int) ceil(double) floor(double) round(float)</code></p><h4 id="3e8sq" name="System"><strong>System</strong></h4><ol class="ol-level-0"><li>exit(int status)当status==0时正常停止,非零异常停止</li><li>arraycopy(ArrayList a,index,arr,index,count)

//把arr1数组中的数据拷贝到arr2中 //参数一:数据源,要拷贝的数据从哪个数组而来 /参数二:从数据源数组中的第几个索引开始拷贝 //参数三:目的地,我要把数据拷贝到哪个数组中 //参数四:目的地数组的索引。 //参数五:拷贝的个数 //System.arraycopy(arr1,0,arr2,0,5);

  • currentTimeMillis()时间戳 可用于加密和计算程序运行时间 long start = System.currentTimeMillis(); long end = System.currentTimeMillis(); long lastTime = end - start; System.out.println(lastTime);//用来计算程序运行时间
  • Runtime

    代码语言:javascript
    复制
     public static Runtime getRuntime()
     当前系统的运行环境对象
     public void exit(int status)0
     停止虚拟机
     public int availableProcessors()
     获得cPU的线程数Runtime.getRuntime().availableProcessors() 20线程
     public long maxMemory()
     JVM能从系统中获取总内存大小(单位byte)  Runtime.getRuntime().maxMemory()/1024/1024 = 4064 也就是最大内存为4G
     public long totalMemory()
     JVM已经从系统中获取总内存大小(单位byte)  Runtime.getRuntime().totalMemory()/1024/1024
     public long freeMemory()
     JVM剩余内存大小(单位byte)
     public Process exec(string command)
     运行cmd命令

    Object

    1. toString()
    2. equals(Object obj)每个类型都有相应的方法,比较的规则不同 如果没有重写equals方法,默认使用object中的方法比较地址值 重写之后比较对象内部属性值 Ctrl+insert
    3. clone(int a) 克隆只能被本类和子类使用,使用时必须重写 @Override protected object clone(){ //调用父类中的c1one方法 //相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去。 return super.clone(); } ​ public class User implement Cloneable//可被克隆 clone返回object需要进行强转 int data=10; User u1 =new User(1,sun,pwd,path,data); User u2 = (User)u1.clone(); ​ 对象克隆分为浅克隆和深克隆 浅克隆:拷贝地址,不管是什么数据类型都完全拷贝过来,改变其中一个的数据,另外一个也会改变(地址) 深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型重新创建新的(可以重写克隆方法实现深克隆,或者是用第三方包方法进行深克隆) object中的克隆是浅克隆 ​ boolean result = Objects.equals(s1,s2); ​

    BigInteger BigDecimal

    对象一但创建就不能发生改变

    代码语言:javascript
    复制
     BigInteger原则上可以表示无穷大的整数
     BigInteger(int num,Random rnd);取随机大的整数[0~2^num-1]
     BigInteger(String val);字符串中必须为整数
     BigInteger(String val,int radix);获取指定进制的大整数(比如[22,2]==>其中22是二进制数)
     ​
     BigInteger b = BigInteger.valueOf(100);
     valueOf(long)
     ​
     BigInteger提前把内部常用数字-16~16创建好,如果多次获取不会重写创建新的
     ​
     ​

    爬虫

    代码语言:javascript
    复制
     import java.io.BufferedReader;
     import java.io.IOException;
     import java.net.URL;
     import java.net.URLConnection;
     import java.util.regex.Matcher;
     import java.util.regex.Pattern;
     URL url = new URL("http://xiaodi8.com");
     URLConnection urlConnection = url.openConnection();
     BufferedReader br = new BufferedReader(new java.io.InputStreamReader(urlConnection.getInputStream()));
     String line;
     while ((line = br.readLine()) != null) {
         System.out.println(line);
     }
     br.close();

    正则

    代码语言:javascript
    复制
     String regex = "((?i)Java)(?=8|11|17)";
     Pattern pattern = Pattern.compile(regex);
     Matcher matcher = pattern.matcher("Java8,java,jaVa4");
     while (matcher.find()) {
         System.out.println(matcher.group());//==>Java,jaVa
     }
     //?:获取所有  ?=获取前面部分 ?!正则 获取不是指定内容的前面部分
     ​
     //[[0-9]10|11|12]==>0~12
     //+,*为贪婪爬取,可能多的匹配
     //+?,*?为非贪婪爬取,尽可能少的爬取
     //Java中默认贪婪爬取
     /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/
       (.+).\\1 ==> 其中\\1表示第一组,以第一个(为第一组,((.)\\2*)这里的二指的是(.)
    

    String result = str.replaceAll("(.)\1+","$1&#34;);//去重
    //(.)表示把第一个重复的字符看成一组
    //\1 表示第一组再次出现
    //+ 表示至少一次
    //$1 表示把正则表达式中的第一组拿来用
    //正则内用\1正则外用$1

    日期

    代码语言:javascript
    复制
     //1.解析成一个date对象
    String str1 = "2021-01-01";
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
    Date date1 = sdf1.parse(str1);
    //2.格式化
    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
    String str2 = sdf2.format(date1);
    System.out.println(str2)

    lambda表达式

    使用lambda的对象必须是函数接口类型(即一个接口只有一个方法)

    Collections ( 集合API )

    1. boolean addAll(Collection<T>c,T...elements)
    2. void shuffle (List<?> list) 打乱顺序
    代码语言:javascript
    复制
     ArrayList<String>list =new ArrayList<>();
    Collections.addAll(list,"adc","adf","afd","dfasdf","326");
    System.out.println(list);
    Collections.shuffle(list);
    System.out.println(list);