0.数组高级

(1)选择排序 

  它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的起始位置。以此类推,直到全部待排序的数据元素排完

  1. // 选择排序
  2. /**
  3. * asc:升序 desc:降序
  4. * @param arr 要排序的数组
  5. * @param isAsc 是否升序 true:升序 false:降序
  6. */
  7. // 下面是直接交换元素,零一种方法是定义一个最小下角标,如minIndex = i
  8. public static void selectSort(int[] arr, boolean isAsc) {
  9. for(int i=0;i<arr.length-1;i++) {
  10. for(int j=i+1;j<arr.length;j++) {
  11. if(isAsc) {
  12. if(arr[j]<arr[i]) {
  13. int temp = arr[i];
  14. arr[i] = arr[j];
  15. arr[j] = temp;
  16. }
  17. }else {
  18. if(arr[j]>arr[i]) {
  19. int temp = arr[i];
  20. arr[i] = arr[j];
  21. arr[j] = temp;
  22. }
  23. }
  24. }
  25. }

(2)冒泡排序

  冒泡排序(Bubble Sort),它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,排序”。所以叫“冒泡排序

  1. // 冒泡排序
  2. /**
  3. * 两种思路:第一种:外部循环考虑比较的轮数,内部循环考虑比较的次数(数组长度-比较的轮数)
  4. * 第二种:外部循环考虑比较的次数,内部循环直接进行比较(如下)
  5. * @param arr
  6. * @param isAsc
  7. */
  8. public static void bubbleSort(int[] arr, boolean isAsc) {
  9. for(int i=arr.length-1;i>0;i--) {
  10. for(int j=0;j<i;j++) {
  11. if(isAsc) {
  12. if(arr[j]>arr[j+1]) {
  13. int temp = arr[j];
  14. arr[j] = arr[j+1];
  15. arr[j+1] = temp;
  16. }
  17. }else {
  18. if(arr[j]<arr[j+1]) {
  19. int temp = arr[j];
  20. arr[j] = arr[j+1];
  21. arr[j+1] = temp;
  22. }
  23. }
  24. }
  25. }

(3)二分查找

  1. // 二分查找
  2. public static int binarySearch(int[] arr, int num) {
  3. // 把升序和降序两种情况都写出来
  4. int startIndex = 0;
  5. int endIndex = arr.length-1;
  6. while(startIndex <= endIndex) {
  7. int middleIndex = (startIndex+endIndex)/2;
  8. if(num == arr[middleIndex]) {
  9. return middleIndex;
  10. }else if(num < arr[middleIndex]) {
  11. if(arr[0] < arr[arr.length-1]) {
  12. endIndex = middleIndex - 1;
  13. }else {
  14. startIndex = middleIndex + 1;
  15. }
  16. }else {
  17. if(arr[0] < arr[arr.length-1]) {
  18. startIndex = middleIndex+1;
  19. }else {
  20. endIndex = middleIndex - 1;
  21. }
  22. }
  23. }
  24. return -1;
  25. }

1. Arrays

  Arrays: java.util 数组的工具类
  public static String toString(int[] a) 得到数组的字符串形式[数组的元素1,2,3,4]
  public static void sort(int[] a) 排序(升序)
  public static int binarySearch(int[] a,int key) 二分查找(只支持升序的数组)

  1. public class ArraysDemo {
  2. public static void main(String[] args) {
  3. int[] arr = {12,3,43,545};
  4. ArrayUtil.printArr(arr);
  5. String str = Arrays.toString(arr);
  6. System.out.println(str);
  7. Arrays.sort(arr);
  8. ArrayUtil.printArr(arr);
  9. ArrayUtil.reverse(arr);//降序
  10. ArrayUtil.printArr(arr);
  11. //该方法只能对升序数组做查询
  12. int index = Arrays.binarySearch(arr, 12);//如果数组是降序的,则不能得到正确结果
  13. System.out.println(index);//1
  14. }
  15. }

1.1 补充

Arrays.asList( A )    A为数组

此可以将数组转换为集合

2.包装类

2.1 概述

包装类:(引用数据类型,类)

object可以接收一切参数(除了8中基本数据类型,其没有父类),所以就有包装类的出现(可以通过将基本数据类型转换成对应的包装类,这样object就能间接的接收基本数据类型了)

为每种基本数据类型都提供了对象的引用数据类型
byte         Byte
short        Short
int            Integer
long         Long
float         Float
double          Double
char         Character
boolean      Boolean

2.2 装箱和拆箱

装箱:把基本数据类型转成包装类

拆箱:把包装类转为基本数据类型

  1. public class WrapperDemo {
  2. public static void main() {
  3. // 装箱:把基本数据类型转成包装类
  4. int i = 10;
  5. Integer in = Integer.valueOf(i);
  6. // 拆箱:把包装类转为基本数据类型
  7. int a = in.intValue();
  8.  
  9. // jdk1.5后自动拆装箱
  10. Integer b = i;
  11. int c = b;
  12. }
  13. }

2.3 Integer及构造方法(其它包装类也类似)

 (1)Integer类概述

  Integer类在对象中包装了一个基本数据类型int的值,该类提供了多个方法,能在int类型和String类型之间互相转换,还提供了处理int类型时非常有用的其他一些常量和方法

(2)构造方法

  public Integer(int value)

  public Integer(String s)

这俩构造方法在jdk1.9后不推荐使用了,更优的方案使用valueOf来创建Integer对象,而parseInt(String)则是将字符串转为int类型

(3)String和int的转换(int换成其他基本类型也一样)

a.  int 转成String(两种方式)

第一种:通过与字符串的相加

  1. String s = 12+"";

第二种:通过String的valueOf方法

  1. String s2 = String.valueOf(12);

b.  String 转成int

  1. int d = new Integer("123");//右边是Integer类型,自动拆成int型,jdk1.9后不推荐使用

推荐使用(jdk1.9以后)

  1. int b = Integer.valueOf("234");//右边Integer类型,jdk1.9后创建Integer对象的推荐方法
  2. int c = Integer.parseInt("345");//右边等式将string转为了int

若int换成其他数据类型,如double,结果与上面相似,如

  1. double h = Double.parseDouble("12.88");

(4)Integer成员方法(这里应该是静态方法,但也能叫成员方法,不过很少)

a.   常用的基本进制转换
  public static String toBinaryString(int i) 转成二进制的字符串
  public static String toOctalString(int i) 转成八进制的字符串
  public static String toHexString(int i) 转成十六进制的字符串

b.  十进制到其他进制

  i: 要转的10 进制      radix: 转成几进制          (进制的范围为2-36,因为数字是10个,字母26个,超过36进制就不知道用什么去表示了)超过36 返回原内容
  public static String toString(int i,int radix)
c. 其他进制到十进制s:

  要转的数radix: 该数是几进制的

  public static int parseInt(String s,int radix)

  1. public class IntegerDemo {
  2. public static void main(String[] args) {
  3. int a = 100;
  4. System.out.println(Integer.toBinaryString(a));//1100100
  5. System.out.println(Integer.toOctalString(a));//144
  6. System.out.println(Integer.toHexString(a));//64
  7. System.out.println(Integer.toString(a,8));//把a转成8进制
  8. System.out.println(Integer.toString(a,36));//把a转成36进制2s
  9. System.out.println(Integer.parseInt("2s",36));// 把36进制的2s转成10进制,100
  10. System.out.println(Integer.MAX_VALUE);//表示Integer的最大值
  11. System.out.println(Integer.MIN_VALUE);//最小值
  12. }
  13. }

2.4 Charater

(1)Character类概述

  Character类在对象中包装一个基本类型char的值,此外,该类提供了几种方法,已确定字符的类别(大写字母,小写字母,数字等等),并将字符从大写转换成小写,反之亦然

(2)构造方法

  public Character(char value)

(3)Character成员方法

  public static boolean isUpperCase(char ch) 是否是大写字母
  public static boolean isLowerCase(char ch) 是否是小写字母
  public static boolean isDigit(char ch) 是否是数字
  public static char toUpperCase(char ch) 转成大写字母
  public static char toLowerCase(char ch) 转成小写字母

练习:

改进练习:
统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑
其他字符)

  1. public class DaXiaoXie {
  2. public static void main(String[] main) {
  3. String str = "akfIJDO123";
  4. int n = str.length();
  5. int count1 = 0;
  6. int count2 = 0;
  7. int count3 = 0;
  8. for(int i = 0;i<n;i++) {
  9. if(Character.isUpperCase(str.charAt(i))) {
  10. count1++;
  11. }
  12. if(Character.isLowerCase(str.charAt(i))) {
  13. count2++;
  14. }
  15. if(Character.isDigit(str.charAt(i))) {
  16. count3++;
  17. }
  18. }
  19. System.out.println(count1);
  20. System.out.println(count2);
  21. System.out.println(count3);
  22. }
  23. }

3. BigInteger

由于基本数据类型所能表示的数值的大小有限,当数据量特别大的话就不能表示,所以就提出BigInteger类型,其数值大小为Integer所能表示数值大小的平方

(1)BigInteger类概述:

  可以让超过Integer范围内的数据进行运算

(2)构造方法

  public BigInteger(String val);

(3)成员方法

  1. public BigInteger add(BigInteger, val);
  2. public BigInteger subtract(BigInteger, val);
  3. public BigInteger multiply(BigInteger, val);
  4. public BigInteger divide(BigInteger, val);
  5. public BigInteger[] divideAndRemainder(BigInteger, val);//第一个元素商,第二个余数

案例

  1. import java.math.BigInteger;
  2.  
  3. public class BigIntegerDemo {
  4. public static void main(String[] args) {
  5. BigInteger b1 = new BigInteger("123");
  6. BigInteger b2 = new BigInteger("2");
  7. BigInteger b3 = b1.add(b2);
  8. BigInteger b4 = b1.subtract(b2);
  9. BigInteger b5 = b1.multiply(b2);
  10. BigInteger b6 = b1.divide(b2);
  11. BigInteger[] b7 = b1.divideAndRemainder(b2);//注意,此处得到的结果为数组
  12. System.out.println(b3);//125,没有打印地址值是因为BigInteger重写了toString方法
  13. System.out.println(b4);//121
  14. System.out.println(b5);//246
  15. System.out.println(b6);//61
  16. System.out.println(b7[0]);//61
  17. System.out.println(b7[1]);//1
  18. }
  19. }

4.BigDecimal

BigDecimal及构造方法

(1)由于在运算的时候,float类型和double很容易丢失精度(如下),所以,为了能精确的表示、计算浮点数,java提供了BigDecimal

  1. System.out.println(1.0-0.32);//0.679999999999

(2)BigDecimal类概述

  不可变的,任意精度的有符号十进制数

(3)构造方法

  public BigDecimal(String val)
   public BigDecimal(int val)

(4)成员方法

  1. public BigDecimal add(Bigcimal augend)
  2. public BigDecimal subtract(Bigcimal subtrahend)
  3. public BigDecimal multiply(Bigcimal multiplicand)
  4. public BigDecimal divide(Bigcimal divisor)
  5. public BigDecimal divide(Bigcimal divisor,int scale,int roundingMode) // JDK1.9之前这样写。divisor为除数,scale为要保存的小数位数,roundingMode表示保留模式

案例

  1. public class BigDecimalDemo {
  2. public static void main(String[] args) {
  3. BigDecimal b1 = new BigDecimal("123");
  4. BigDecimal b2 = new BigDecimal("2");
  5. System.out.println(b1.add(b2));//125
  6. System.out.println(b1.subtract(b2));//121
  7. System.out.println(b1.multiply(b2));//246
  8. System.out.println(b1.divide(b2));//61.5
  9. System.out.println(new BigDecimal("1.0").subtract(new BigDecimal("0.32")));//0.68,无精度损失
  10. }
  11. }
  1. BigDecimal b3 = new BigDecimal("7");
  2. BigDecimal b4 = new BigDecimal("3");
  3. System.out.println(b3.divide(b4, 2, BigDecimal.ROUND_UP));//The field BigDecimal.ROUND_UP is deprecated since version 9

应该改成如下

  1. System.out.println(b3.divide(b4, 2, RoundingMode.UP));
  2. System.out.println(b3.divide(b4, 2, RoundingMode.DOWN));

(5)格式化小数(jdk1.9以前,1.9以后都要改成RoundingMode的模式)

BigDecimal.setScale() 方法用于格式化小数点

setScale(1)表示保留一位小数,默认用四舍五入的方式

setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3

setScale(1,BigDecimal.ROUND_UP) 进位处理,2.35变成2.4

setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4

setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3

注意,ROUND_HALF_DOWN只针对要保留位数的后一位为5的数,如2.35变成2.3,但2.351就变成2.4了(保留一位小数,但5后面还有个1)

 5. Math

  1. public static int abs(int a) 取绝对值
  2. public static double ceil(double a) 向上取整
  3. public static double floor(double a) 向下取整
  4. public static double pow(double a,double b) ab次方
  5. public static double random() 随机数,从0-1之间的随机数
  6. public static int round(float a) 四舍五入取整
  7. public static double sqrt(double a)            求算数平方根       

案例

  1. public class MathDemo {
  2. public static void main(String[] args) {
  3. System.out.println(Math.PI);//3.141592653589793
  4. System.out.println(Math.abs(-2));//2
  5. System.out.println(Math.ceil(12.1));//13.0
  6. System.out.println(Math.floor(12.5));//12.0
  7. System.out.println(Math.pow(4, 4));//256.0
  8. System.out.println(Math.random());
  9. System.out.println(Math.round(12.5));//13
  10. System.out.println(Math.sqrt(16));//4.0
  11. }
  12. }

零基础学习java------day12------数组高级(选择排序,冒泡排序,二分查找),API(Arrays工具类,包装类,BigInteger等数据类型,Math包)的更多相关文章

  1. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  2. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  3. StringBuffer、StringBuilder、冒泡与选择排序、二分查找、基本数据类型包装类_DAY13

    1:数组的高级操作(预习) (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每个元素都有从0开始的编号,方便我们获取.专业名称:索引. (3)数组操作: A:遍历 public stat ...

  4. Java连载71-二分查找和Arrays工具类

    一.二分法查找 1.二分法查找是建立在已经排序的基础之上的 2.程序分析是从下到大​排序. 3.这个数组中没有重复的元素​. package com.bjpowernode.java_learning ...

  5. Java常用API——Arrays工具类

    介绍:Arrays工具类提供了一些可以直接操作数组的方法,以下是一些常用方法: int binarySearch(type[] a, type key):要求数组a元素升序排列,使用二分法搜索key的 ...

  6. 零基础学习Linux培训,应该选择哪个培训班?

    云计算早已不是什么稀奇的概念,它的火爆让Linux运维工程师这个职业越来越重要.在当今各类云平台提供的系统中,Linux系统几乎毫无争议的独占鳌头,市场份额进一步扩张. 这也让Linux运维工程师职位 ...

  7. 零基础学习Python培训,应该选择哪个培训班?

    近几年中,Python一直是市场上最受欢迎的编程语言之一.它语法自然,入门简单,同时应用范围又极广,无论是大火的人工智能.大数据还是传统的web开发.自动化运维,Python都能够大展拳脚.根据职友集 ...

  8. Java基础【冒泡、选择排序、二分查找】

    冒泡排序的思路就是前一个和后一个进行比较,如果大的就交换位置   大的数字后浮 如   12      8    5     31 第一轮   8   5   12   31 第二轮   5   8 ...

  9. JAVA源码走读(二)二分查找与Arrays类

    给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...

随机推荐

  1. linked-list-cycle leetcode C++

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  2. poj 2311 Cutting Game (SG)

    题意: 有一张W*H的纸片. 每人每次可以横着撕或者竖着撕,先撕出1*1那一方胜. 数据范围: W and H (2 <= W, H <= 200) 思路: 很好抽象出游戏图的模型,用SG ...

  3. hdu 5055 Bob and math problem (很简单贪心)

    给N个数字(0-9),让你组成一个数. 要求:1.这个数是奇数 2.这个数没有前导0 问这个数最大是多少. 思路&解法: N个数字从大到小排序,将最小的奇数与最后一位交换,把剩下前N-1位从大 ...

  4. Vue面试题2

    Class与Style绑定工作有用过吗: 有,后台管理系统菜单.主题色切换 .tab选项卡等..... 计算属性和侦听器区别.使用场景: 计算属性有缓存.并且是响应式依赖缓存,调用不加小括号 利用vu ...

  5. Dubbo之负载均衡、并发控制、延迟暴露、连接控制

    1.并发控制 dubbo服务端和消费端都做了并发控制,分别在配置中有相应的对应配置: 服务端:executes服务提供者每服务每方法最大可并行执行请求数,控制并发数量:actives每服务消费者每服务 ...

  6. nginx 支持https访问

    1,先确认nginx安装时已编译http_ssl模块. 就是执行nginx -V命令查看是否存在--with-http_ssl_module.如果没有,则需要重新编译nginx将该模块加入.yum安装 ...

  7. Qt 使用大神插件快速创建树状导航栏

    前言 本博客仅仅记录自己的采坑过程以及帮助网友避坑,方便以后快速使用自定义控件,避免重复出错. 下载插件 大神 Github Qt 自定义控件项目地址:https://github.com/feiya ...

  8. git删除未被追踪的文件

    # 先看看会删掉哪些文件,防止重要文件被误删 git clean -n # 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git cle ...

  9. .net core api 请求实现接口幂等性

    简单实现接口幂等性,根据参数的hascode实现: 参数介绍  WaitMillisecond : 请求等待毫秒数 CacheMillisecond:请求结果缓存毫秒数 参数具体使用场景 WaitMi ...

  10. .net C# 释放内存 例子

    namespace myCommon{    public class SysVar    { [DllImport("kernel32.dll")]        public ...