学习Java的第二天

本文介绍了Java中的位运算符,包括或|、与&、异或^和非~,并展示了它们在数字处理中的应用。此外,还讨论了字符串的substring方法、常量池的概念以及如何检查字符串相等。同时,提到了StringBuilder在字符串拼接中的高效性,并举例说明了API接口如toUpperCase和split的方法。
摘要由CSDN通过智能技术生成

位运算符 位运算速度快

  • 或 | (or)

or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。

相同位只要一个为1即为1。

public class Test5{

public static void main(String[] aaa){

int a = 9; //1001

int b = 23; //10111

int c = a | b;

System.out.println(c);

}

}
  • 且&(and)

and运算通常用于二进制的取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。

相同位的两个数字都为1,则为1;若有一个不为1,则为0。

public class Test5{

public static void main(String[] aaa){

int a = 9; //1001

int b = 23; //10111

int c = a & b;

System.out.println(c);

}

}
  • 异或 ^ (xor)

异或的符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.

xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520。

相同位不同则为1,相同则为0。

  • 非 ~ (not)
  • >> 向右移动 N进制向右移动M位 变为原来的N^M 倍 除以    左侧补符号位
  • <<向左移动  N进制向左移动M位 变为原来的N^M 倍  乘以  右侧补0

内部计算原理都用位运算拆分 2进制里面有多少个1 就可以拆成多少个数

即使达到万亿级别也可以拆成40个数方便计算

计算结果超范围会报错 计算时要在范围内

字符串

public class Test5{

public static void main(String[] aaa){

String a ="大家好,杨欣悦是我老婆.";

String f = "宋宇30岁的时候有100万存款,RS7一辆";

String b = f.substring(5,10);

System.out.println(b);

}

}

数组提前在内存中申请足够大的空间 一定要连续

目的:防止越界

字符串值不能再原有地址进行修改 需要在内存中重新申请地址

原有地址可能放不下

常量池

当字符串引入新的变量时 原来的字符不会立即被销毁 当有下一个字符串需要引用时会扫描常量池中有没有要引用的字符 有的话直接引用 没有则再创建

常量池会自己定期检查长时间没有被引用的字符然后销毁

检查字符串是否相等

String a = "he";

String b = new String("he");

System.out.println(a==b); // false == 引用类型检查内存地址 基本类型比较的值

System.out.println(a.equals(b)); // true

空串"" 和null串

null和 "" 不一样 null只有句柄没有值 没有地址 "" 是一个空地址 有特殊符号

码点和代码单元

public class Test5{
    public satic void main(String[] aaa){
       char a = '杨';
       int b = a;
       System.out.println(b);
  }
}

码点( code point) 是指与一个编码表中的某个字符对应的代码值。

在基本的多语言级别中,每个字符用 16 位表示,通常被称为代码单元( code unit)

length 方法将返回采用 UTF-16 编码表示的给定字符串所需要的代码单元数量。

例如:

String str1 = "杨欣悦很漂亮,如果当我老婆更漂亮";

int a = str1.length();

要想得到实际的长度,即码点数量,可以调用:

int cpCount = greeting.codePointCount(0, greeting.lengthQ);

调用 s.charAt(n) 将返回位置 n 的代码单元,n 介于 0 ~ s.length()-l 之间。

例如:

String str1 = "杨欣悦很漂亮,如果当我老婆更漂亮";

char b = str1.charAt(3);

要想得到第 i 个码点,应该使用下列语句

String str1 = "杨欣悦很漂亮,如果当我老婆更漂亮"; 
int c = str1.codePointAt(2);

得到全部码点(编码值)

public class Test5{
     public static void main(String[] aaa){
        String str1 = "杨欣悦是个傻傻猪";
        int a = str1.length();
        int[] arr = str1.codePoints().toArray();
        for(int i = 0;i<arr.length;i++){
           System.out.println(arr[i]);
        }
   }
}

API接口

切换数组大小写

public class Test5{

   public static void main(String[] aaa){

        String bb = "abc";
        String cc = bb.toUpperCase();  //cc此时为bb的大写
        System.out.println(cc);
        System.out.println(cc.toLowerCase()); //输出cc 又变为小写
    }

}

String replace( CharSequence oldString,CharSequence newString) 返回一个新字符串。这个字符串用 newString 代替原始字符串中所有的 oldString。可 以用 String 或 StringBuilder 对象作为 CharSequence 参数。

public class Test5{
   public static void main(String[] aaa){
        String bb = "abc";
        String cc = bb.replace("a","s");
        System.out.println(cc); 
 
     }

}

切割

public class Test5{

   public static void main(String[] aaa){

        String bb = "杨欣悦,嫁给我吧";

        String[] arr = bb.split(",");

        for(int i = 0; i<arr.length;i++){

        System.out.println(arr[i]);
 
          }
 
     }

}

字符串的拼接

构建字符串

内存中每个存储单元被分为大小为4kb的 当一个存储单元被占用时不能被再次占用

但是里面如果只有20b 的东西剩下的字节就会被浪费

每一个4KB单元只有一个地址 如果里面存入了多个数据 除了第一个数据其他的数据定位不到

public class Test5{
    public static void main(String[] aaa){
            long start = System.currentTimeMillis();
            String str="";
            StringBuilder str2 = new StringBuilder();
            for(int i = 0;i<100000;i++){
                  str +=i;
                   }
              long end=System.currentTimeMillis();
              System.out.println("花费毫秒数:"+(end-start));
         }
}

StringBuilder 使速度加快

buffer借助于数组申请足够大的空间让他不至于每次都有额外的空间消耗

buffer---内部就是基本类型数组实现的  代表高性能

public class Test5{

           public static void main(String[] aaa){
           long start = System.currentTimeMillis();
           String str="";
           StringBuilder str2 = new StringBuilder();
           for(int i = 0;i<100000;i++){
           //str +=i;
           str2.apend(""+i);
          }
          long end=System.currentTimeMillis();
          System.out.println("花费毫秒数:"+(end-start));

     }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值