当前位置: 首页 > article >正文

JAVA基础:System类,Runtime类,Arrays类的常用方法,二分查找算法

1 System类

System.exit(0);   //手动关闭应用程序

System.currentTimeMillis(); //获得当前系统时间的毫秒数

System.out ; //获得一个打印流,可以实现控制台打印
System.out.print(); //打印内容(不换行)
System.out.println();//打印内容,并换行
System.out.printf() ;//格式化打印
	System.out.printf("我的名字:%s,我的年龄:%d" , "dongmingyu",18);

System.err ; //获得一个错误信息打印流,打印的内容在idea中都是红色的。

2 垃圾回收

  • 当一个对象不再被其他变量引用的时候,就称该对象为垃圾对象

A a = new A();
A a2 = a ;

a = null ;
a2 = null ;
    • JVM判断对象是否为垃圾的算法

      1. 计数法

      2. 根可达算法

  • JVM会自动的进行垃圾回收(有一定的触发条件)

  • 我们可以通过调用 System.gc() 手动启动垃圾回收机制

  • 我们可以通过重写每一个对象 finalize()方法,监控该对象是否被垃圾回收了

    • finalize()object类中的一个protected方法

    • 当对象被垃圾回收时自动调用的方法

  • 垃圾复活

    • 在对象第一次被当作垃圾,准备垃圾回收时,会先调用该对象的finalize方法

    • 可以在finalize方法中实现对象复活(重新被引用)

    • 对象复活后,如果再次称为垃圾,被回收时不再重复调用finalize方法。

3 Runtime类

  • 在java程序中运行java命令 (javac , java)

Runtime runtime = Runtime.getRuntime() ;

System.out.println(runtime.totalMemory());
System.out.println(runtime.maxMemory());
System.out.println(runtime.freeMemory());

runtime.exec("javac c:/z/A.java");
runtime.exec("java -cp c:/z A");

 

4 Arrays类

  • 针对于数组操作相关的工具类,提供了一些操作数组的方法

public class Test5 {
    public static void main(String[] args) {
        int[] nums = new int[]{10,20,30,40,50};
		//将数组转换成String
        String s = Arrays.toString(nums) ;
        System.out.println(s);

        //将nums数组扩容到2倍新数组中
        nums = Arrays.copyOf(nums, nums.length * 2) ;
        System.out.println(Arrays.toString(nums));

		//数组排序
        nums = new int[]{6, 10 , 30,26,15} ;
        System.out.println(Arrays.toString(nums));
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));

        //对象数组排序,要求对象自身可以比较 或者 提供第三方比较器
        A[] as = new A[]{
                new A(10,"zhangsan"),
                new A(20,"lisi"),
                new A(15,"wangwu"),
                new A(8,"zhaoliu")
        };
        Arrays.sort(as , new AComparaTor());
        for(int i=0;i<as.length;i++){
            A a = as[i];
            System.out.printf("num:%d , name:%s \n" , a.num,a.name);
        }

        
        nums = new int[]{10,20,30,40,50};
        //如果查找的数据存在,返回其位置
        //如果查找的数组不存在,返回其应该存在的位置的相反数再-1
        //底层使用的是二分查找算法,所以要确保存储的元素有序,存储的元素可以比较大小(对象)
        int i = Arrays.binarySearch(nums, 40);
        System.out.println(i);

    }
}

class A implements Comparable<A>{
    int num ;
    String name ;
    public A(int num,String name){
        this.num = num ;
        this.name = name ;
    }

    @Override
    public int compareTo(A o) {
        return this.num - o.num;
    }
}

class AComparaTor implements Comparator<A>{

    @Override
    public int compare(A o1, A o2) {
        return o2.num - o1.num;
    }
}

 

5 System.arraycopy方法

  • 该方法可以实现数组元素的移动

    • 既可以从A数组移动到B数组

    • 也可以从A数组的a位置,移动到A数组的b位置

  • 一共有5个参数

//1 要移动元素的数组,源数组
//2 要移动元素的起始位置
//3 要移动元素的目标数组
//4 移动到目标数组中的位置
//5 移动元素的个数
int[] nums = new int[]{10,20,30,40,50,0,0} ;

System.arraycopy(nums,1,nums,2,4);
nums[1] = 100 ;
System.out.println(Arrays.toString(nums));

System.arraycopy(nums,1,nums,0,6);
System.out.println(Arrays.toString(nums));

 

6 二分查找算法

  • 要求在一个有序数列中,查找指定的元素

  • 注意:如果数列中的元素是对象类型,要求对象可以大小比较。

  • 二分查找机制:

    • 每次都找到当前数列的中间位置的元素,与待查找的元素比较

    • 相等,找到了元素

    • 不相等,根据大小比较结果

      • 如果待查找的元素比中间位置的元素小,准备去左侧继续查找

      • 如果待查找的元素比中间位置的元素大,准备去右侧继续查找

    • 结束条件

      1. 找到元素,就停止查找

      2. 每次元素查找不存在时,就会对接下来的查找数列进行压缩

        当数列的两个边界交叉时,表示已经没有元素了

0	1	2	3	4	5	6	7	8	9
1	3	5	7	9	15	20	25	30	100
    
找 9
第1次,找到中间位置  left=0 , right=9 , mid=4--> 9 < 30 , 继续向右找
第2次,找到中间位置  left=5 , right=9 , mid=7--> 25<30  , 继续向右找
第3次,找到中间位置  left=8 , right=9 , mid=8---> 30=30  找到


找2
第1次  left=0,right=9,mid=4---9 > 2  继续向左找
第2次  left=0,right=3,mid=1-->3 > 2 继续向左找
第3次  left=0,right=0,mid=0-->1 < 2 继续向右找
第4次  left=1,right=0,结束了

找24
1 left=0,right=9,mid=4-->9<24  -->
2 left=5,right=9,mid=7--->25>24 <--
3 left=5,right6,mid=5--->15<24 -->
4 left=6,right6,mid=6--->20<24 -->
5 left=7,right=6,结束

return -left - 1 ;

 


http://www.kler.cn/news/315299.html

相关文章:

  • C++竞赛初阶L1-16-第七单元-字符串(36~37课)559: T456513 统计数字字符个数
  • 基于Redis实现幂等判断
  • 异步请求的方法以及原理
  • MyBatis动态SQL中的`if`标签使用【后端 19】
  • C++ 条件变量:wait、wait_for、wait_until
  • 【开源大模型生态9】百度的文心大模型
  • 主播和礼品检测系统源码分享
  • 高速下载大模型文件
  • 【读点论文】Text Recognition in the Wild: A Survey 非常纯粹的OCR研究,专业细致,脉络清晰
  • Datawhale X 南瓜书 task01学习笔记
  • Vue3(一) Vite创建Vue3工程,选项式API与组合式API;setup的使用;Vue中的响应式ref,reactive
  • c语言练习题1(数组和循环)
  • python发送邮件 - email smtplib
  • vue2项目实现国际化(若依框架示例)
  • c语言习题
  • JS领域的AI工程利器分享
  • Spring Cloud Gateway组件
  • 如何在 Spring Boot中更改默认端口
  • sql语法学习
  • 【HTTPS】对称加密和非对称加密
  • 【C++前缀和 状态压缩】2588. 统计美丽子数组数目|1696
  • Springboot使用ThreadPoolTaskScheduler轻量级多线程定时任务框架
  • 网传阿里云盘出现bug,可看到其他用户云盘图片
  • VideoFileClip 切割视频
  • C#往压缩包Zip文件的文件追加数据
  • go注册中心Eureka,注册到线上和线下,都可以访问
  • 通过示例来展示C++中Lumda函数的原理是什么及如何来使用它?
  • SOI 刻蚀气体
  • DHCP协议原理(网络协议)
  • 用apache httpd来实现反向代理