位运算的含义?位运算就是直接对整数在内存中的二进制位进行操作。将数值转换为2进制,然后再进行与&,或|,非!,异或^运算
与有一个0结果就是0,或有一个1结果即为1,非就是0变1,1变0,异或有一个0一个1才为真
与案例
00101
11100
(&;或者and)
----------------
00100
或案例
00101
11100
(|或者or)
----------------
11101
异或案例
00101
11100
(^或者xor)
----------------
11001
-------------------------------------------------------------------------------------------------------------------
左移<<与右移符号>>
左移符号规律N进制,左移动M位,右侧补0,相当于变成原数乘以2^M次方
>>右移符号,规律N进制,右移动M位,左侧补符号位,相当于变成原数除以2^M次方
编程语言进行乘法运算内部都是进行位运算,所以运算结果很快
>>>右移,左侧补0
------------------------------------------------------------------------------------------------------------------
运算符优先级见课本p44,注意有括号的情况
------------------------------------------------------------------------------------------------------------------
字符串String,属于引用数据类型
字符串内部核心是char数组,但两者不是同一个内容
String类的substring方法可以从一个较大的字符串提取出一个子串
-----------------------------------------------------------------------------------------------------------------
数组为什么需要提前申请足够大的空间?
因为如果不提前申请空间,不知道该数组的长度是多少,编辑该数组可能会对内存中其他数组产生影响,防止它越界
----------------------------------------------------------------------------------------------------------------
不可变字符串指的是要修改字符串内容,不会在源地址内容进行修改,而是需要新开辟一段内存空间,更改字符串变量的指向,指向新开辟的内存空间的地址,新开辟的内存空间内容就是修改后的内容。
------------------------------------------------------------------------------------------------------------------
面试点!常量池
String字符串每次使用可能会有重复的内容,常量池保存大量的字符串,将各种字符串存放在公共的常量池中,字符串变量指向常量池中相应的位置,常量池定期检查没有使用过的字符,定期删除
-----------------------------------------------------------------------------------------------------------------
==的使用?
如果比较的是基本数据类型,比较的是值
如果比较的是一你用数据类型,比较的是地址
equals比较的是值,使用方法a.equals(b) a和b是变量
---------------------------------------------------------------------------------------------------------------
String a = null和String b = " " 两者有区别
前者是没地址没内容 后者是空数组符号
---------------------------------------------------------------------------------------------------------------
char编码值 码点值就是编码值,每个字母或者汉字有一个编码值
int a = str.length()获取长度.length方法需要记住
char a = str.chatAt(n) 获取下标位n的那个字符
int a = str.codePointAt(n) 获取下标为n的编码值
int[] arr = str.codePonint().toArray 获取所有编码值,将编码值保存到数组
----------------------------------------------------------------------------------------------------------
String ApI
String转大小写 case意思是转换
.toUpperCase()为转字母为大写
.toLowerCase()为转字母为小写
String replace(CharSequence oldString,CharSequence newString)返回一个新字符串。这个字符串用newString代替原始字符串所有的oldString.可以用String 或StringBuilder对象作为CharSquence参数
String切割 String[] arr = a4.split("下") //用于切割字符串,用数组来接收
-----------------------------------------------------------------------------------------------------------
面试题
字符串拼接
StringBuilder实现原理
页的4kb分类是按照变量来分,buffer内部基本类型数组实现,buffer代表高性能,原先的String不可变,是因为内容多大就申请多大的内存空间,修改需要重新申请,buffer先申请足够大的空间,这样如果修改字符串,可以在原地址进行修改,不会超过操作系统的一个页,节省了空间
-----------------------------------------------------------------------------------------------------------------------
12/28日代码
public class Test2{
public static void main(String[] args){
/* int a = 9; //转换位2进制1001
int b = 23; //转换为2进制10111
int c = a << 2; //结果就是10进制9转换成2进制,数值左移两位
int d = c >> 2;
int f = a & c;
int g = a | c;
//int h =123 * 234 = 234 * (64+32+16+8+2+1) = 234 << 6 + 234 <<5+ 234 //<<4+234<<3+234 <<1 +234
System.out.println(c);
// -------------------------------------------------------------------------
*/
/*左移如果超范围就会错误
int a = 56; //24个0 +00111000
int b = a << 26; // 111000 + 26个0
System.out.println(b);
*/
/*------------------------------------
String a = "大家好,宏伟最帅";
System.out.println(a);
char[] arr = {'大','家','好','清','霄','最','帅'};
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]);
}
---------------------------------------
*/
/* //String 类的 substring 方法
String a = "宋宇30岁的时候有资产100个亿,房子10套";
String b = a.substring(4,9); //获取的是[4,6)这几个字符
System.out.println(b);
---------------------------------------------------
*/
/*
//字符串的拼接
String a = "嘿嘿";
String b = "开课";
String c = a + b + "大记号" + "===" +a + a + "哈哈哈哈";
System.out.println(c);
--------------------------------------------------
*/
/* //字符串判断相等equals的使用
String a = "嘿嘿";
String b = "嘿嘿";
String c = new String("嘿嘿");//在常量池中开辟新的内存空间
String d = new String("嘿嘿");
System.out.println(d==c); //比较的是地址
System.out.println(d.equals(c));//比较的是值
--------------------------------------------------
*/
/*char a = '帅';//char编码值
int b = a ;
System.out.println(b);
-----------------------------------------------
*/
/*String str1 = "大家都很帅,特别是宋宇最帅";
int a = str1.length(); //获取长度.length方法需要记住
char b = str1.charAt(3); //获取下标为3的那个字符
int c = str1.codePointAt(6); //获取下标为6的编码值
System.out.println(a); //a的长度就是代码单元
System.out.println(b);
System.out.println(c);
int[] arr = str1.codePoints().toArray(); //获取所有编码值,将编码值保存到数组中
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
-------------------------------------------------------
*/
/* String bb = "abc";
String cc = bb.toUpperCase();
System.out.println(cc);
System.out.println(cc.toLowerCase() );
*/
/* String a1 = "哈哈哈";
boolean b1 = a1.equalsIgnoreCase("哈哈");
System.out.println(b1);
String a2 = "大家";
boolean b2 = a2.startsWith("大");//判断开头的字符串是否相等
String a3 = "a3很好";
boolean b3 = a3.endsWith("很好"); //判断结尾的字符串是否一样
System.out.println(b2);
System.out.println(b3);
String a4 = "大家下午好";
String b4 = a4.replace("下午好","都很好看"); //替换其中的一些字符串
System.out.println(b4);
int a5 = a4.codePointAt(3); //返回从给定位置的码点
System.out.println(a5);
int a6 = a4.offsetByCodePoints(2,1); //返回从2码点开始,位移1后的码点的索引
System.out.println(a6);
String a7 = "好";
int b7 = a4.compareTo(a7); //判断两个字符串的顺序 按照字典顺序,
//如果字符串位于other 之前, 返回一个负数;
//如果字符串位于 other 之后,返回一个正数;如果两个字符串相等,返回 0。
System.out.println(b7);
int a8 = a4.codePointCount(0,5);//返回 startlndex 和 endludex-l之间的代码点数量。
System.out.println(a8);
String[] arr = a4.split("下");
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
-------------------------------------------------------------
*/
long start = System.currentTimeMillis();
String str = "";
StringBuilder str1 = new StringBuilder();
for(int i = 0; i < 100000;i++ ){
//str +=i;
str1.append(""+i);
}
long end = System.currentTimeMillis();
System.out.println("花费毫秒数: " +(end - start));
}
}