所有的基本类型,都有对应的类类型。比如int对应的类是Integer,这种类就叫做封装类。
package digit;public class TestNumber { public static void main(String[] args) { int i = 5; //把一个基本类型的变量,转换为Integer类型 Integer it = new Integer(i); //把一个Integer对象,转换为一个基本类型的int int i2 = it.intValue(); }}Number类数字封装类有Byte,Short,Integer,Long,Float,Double。这些类都是抽象类Number的子类。
自动装箱与拆箱不需要调用构造方法,通过**=**符号自动把 基本类型 转换为 类类型 就叫装箱
不需要调用Integer的intValue方法,通过**=就自动转换成int类型**,就叫拆箱
package digit; public class TestNumber { public static void main(String[] args) { int i = 5; //基本类型转换成封装类型 Integer it = new Integer(i); //自动转换就叫装箱 Integer it2 = i; //封装类型转换成基本类型 int i2 = it.intValue(); //自动转换就叫拆箱 int i3 = it; }}int的最大值和最小值int的最大值可以通过其对应的封装类Integer.MAX_VALUE获取
package digit; public class TestNumber { public static void main(String[] args) { //int的最大值 System.out.println(Integer.MAX_VALUE); //int的最小值 System.out.println(Integer.MIN_VALUE); }9.2字符串转换
数字转成字符串方法1: 使用String类的静态方法valueOf 方法2: 先把基本类型装箱为对象,然后调用对象的toString
package digit; public class TestNumber { public static void main(String[] args) { int i = 5; //方法1 String str = String.valueOf(i); //方法2 Integer it = i; String str2 = it.toString(); }}字符串转成数字调用Integer的静态方法parseInt
package digit; public class TestNumber { public static void main(String[] args) { String str = "999"; int i= Integer.parseInt(str); System.out.println(i); }}练习把浮点数 3.14 转换为 字符串 "3.14" 再把字符串 “3.14” 转换为 浮点数 3.14
如果字符串是 3.1a4,转换为浮点数会得到什么?
public class TestNumber { public static void main(String[] args) { double i = 3.14; String str = String.valueOf(i); System.out.println("3.14转换成的字符串 " + str); double i2 = Float.parseFloat(str); System.out.println("\"3.14\"转换成的浮点数 " + i2); String str2 = "3.1a4"; double i3 = Float.parseFloat(str2); System.out.println("\"3.1s4\"转换成的浮点数 " + i3); }}9.3数学方法
四舍五入, 随机数,开方,次方,π,自然常数public class TestNumber { public static void main(String[] args) { float f1 = 5.4f; float f2 = 5.5f; //5.4四舍五入即5 System.out.println(Math.round(f1)); //5.5四舍五入即6 System.out.println(Math.round(f2)); //得到一个0-1之间的随机浮点数(取不到1) System.out.println(Math.random()); //得到一个0-10之间的随机整数 (取不到10) System.out.println((int)( Math.random()*10)); //开方 System.out.println(Math.sqrt(9)); //次方(2的4次方) System.out.println(Math.pow(2,4)); //π System.out.println(Math.PI); //自然常数 System.out.println(Math.E); }}练习-数学方法public class TestNumber { public static void main(String[] args) { int n = Integer.MAX_VALUE; double value = Math.pow((1 + 1/(double)n),n); System.out.println("n 取最大整数时value: " + value); double error = Math.abs(Math.E - value); System.out.println("error = " + error); }}练习-质数统计找出一千万以内,一共有多少质数。
质数概念: 只能被1和自己整除的数。
public class TestNumber { public static boolean IsZ(int i){ for (int j = 2;j <= Math.sqrt(i);j++){ if(i % j == 0) { return false; } } return true; } public static void main(String[] args) { int max_n = 10000000; int count = 0; for(int i = 2;i < max_n;i++){ if(IsZ(i)){ count++; } } System.out.println("一千万以内的质数共有" + count); }}9.4 格式化输出
格式化输出如果不使用格式化输出,就需要进行字符串连接,如果变量比较多,拼接就会显得繁琐 使用格式化输出,就可以简洁明了。
%s 表示字符串 %d 表示数字 %n 表示换行
public class TestNumber { public static void main(String[] args) { String name ="盖伦"; int kill = 8; String title="超神"; //直接使用+进行字符串连接,编码感觉会比较繁琐,并且维护性差,易读性差 String sentence = name+ " 在进行了连续 " + kill + " 次击杀后,获得了 " + title +" 的称号"; System.out.println(sentence); //使用格式化输出 //%s表示字符串,%d表示数字,%n表示换行 String sentenceFormat ="%s 在进行了连续 %d 次击杀后,获得了 %s 的称号%n"; System.out.printf(sentenceFormat,name,kill,title); //使用format格式化输出 System.out.format(sentenceFormat,name,kill,title); }}总长度,左对齐,补0,千位分隔符,小数点位数,本地化表达package digit; import java.util.Locale; public class TestNumber { public static void main(String[] args) { int year = 2020; //总长度,左对齐,补0,千位分隔符,小数点位数,本地化表达 //直接打印数字 System.out.format("%d%n",year); //总长度是8,默认右对齐 System.out.format("%8d%n",year); //总长度是8,左对齐 System.out.format("%-8d%n",year); //总长度是8,不够补0 System.out.format("%08d%n",year); //千位分隔符 System.out.format("%,8d%n",year*10000); //小数点位数 System.out.format("%.2f%n",Math.PI); //不同国家的千位分隔符 System.out.format(Locale.FRANCE,"%,.2f%n",Math.PI*10000); System.out.format(Locale.US,"%,.2f%n",Math.PI*10000); System.out.format(Locale.UK,"%,.2f%n",Math.PI*10000); }}9.5 字符char
保存一个字符的时候使用charchar对应的封装类是CharacterCharacter常见方法public class TestChar { public static void main(String[] args) { System.out.println(Character.isLetter('a'));//判断是否为字母 System.out.println(Character.isDigit('a')); //判断是否为数字 System.out.println(Character.isWhitespace(' ')); //是否是空白 System.out.println(Character.isUpperCase('a')); //是否是大写 System.out.println(Character.isLowerCase('a')); //是否是小写 System.out.println(Character.toUpperCase('a')); //转换为大写 System.out.println(Character.toLowerCase('A')); //转换为小写 String a = 'a'; //不能够直接把一个字符转换成字符串 String a2 = Character.toString('a'); //转换为字符串 }}常见转义public class TestChar { public static void main(String[] args) { System.out.println("使用空格无法达到对齐的效果"); System.out.println("abc def"); System.out.println("ab def"); System.out.println("a def"); System.out.println("使用\\t制表符可以达到对齐的效果"); System.out.println("abc\tdef"); System.out.println("ab\tdef"); System.out.println("a\tdef"); System.out.println("一个\\t制表符长度是8"); System.out.println("换行符 abc\ndef"); System.out.println("单引号 abc\'def"); System.out.println("双引号 abc\"def"); System.out.println("反斜杠 abc\\def"); }}练习-Character通过Scanner从控制台读取字符串,然后把字符串转换为字符数组。
转换为字符数组后,筛选出控制台读取到的字符串中的大写字母和数字,并打印出来。
public class TestNumber { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); char []cs = str.toCharArray(); System.out.println(String.valueOf(cs)); System.out.println(Arrays.toString(cs)); String str2 = ""; for(int i = 0;i < str.length();i++){ if(Character.isDigit(cs[i]) || Character.isUpperCase(cs[i])) str2 += cs[i]; } System.out.println(str2); }}9.6 字符串*
创建字符串字符串即字符的组合,在Java中,字符串是一个类,所以我们见到的字符串都是对象 常见创建字符串手段:
每当有一个字面值出现的时候,虚拟机就会创建一个字符串。调用String的构造方法创建一个字符串对象。通过+加号进行字符串拼接也会创建新的字符串对象。public class TestString { public static void main(String[] args) { String garen ="盖伦"; //字面值,虚拟机碰到字面值就会创建一个字符串对象 String teemo = new String("提莫"); //创建了两个字符串对象 char[] cs = new char[]{'崔','斯','特'}; String hero = new String(cs);// 通过字符数组创建一个字符串对象 String hero3 = garen + teemo;// 通过+加号进行字符串拼接 }}String 被修饰为final,所以是不能被继承的/*这里会报错,因为String不能被继承*/ static class MyString extends String{ }immutable - 不可改变的比如创建了一个字符串对象 String garen ="盖伦";
不可改变的具体含义是指:
不能增加长度不能减少长度不能插入字符不能删除字符不能修改字符一旦创建好这个字符串,里面的内容 永远 不能改变,String 的表现就像是一个常量。
字符串格式化//%s表示字符串,%d表示数字,%n表示换行 String sentenceFormat ="%s 在进行了连续 %d 次击杀后,获得了 %s 的称号%n"; String sentence2 = String.format(sentenceFormat, name,kill,title);练习1-随机字符串创建一个长度是5的随机字符串,随机字符有可能是数字,大写字母或者小写字母。
public class TestNumber { public char get_char(){ /*0-9 corresponds to Ascii 48-57 *A-Z 65-90 *a-z 97-122 * */ Random random = new Random(); //随机生成122-48范围类的ascii码 int num; switch (random.nextInt(3)){ //获取数字ascii case 0: num = random.nextInt(58-48) + 48; break; //获取大写字母 case 1: num = random.nextInt(91-65) + 65; break; case 2: num = random.nextInt(123 - 97) + 97; break; default: num = 48; } char c = (char)num; return c; } public String get_String(int length){ String str = ""; for(int i = 0;i < length;i++){ str += get_char(); } return str; } public static void main(String[] args) { TestNumber t = new TestNumber(); String str = t.get_String(5); System.out.println(str); }}练习2 - 字符串数组排序 public String[] stringDataGroup_sort(String[] strings) { /*字符串数组排序 按首字母排序**/ for (int i = 0; i < strings.length - 1; i++) { for (int j = i + 1; j < strings.length; j++) { char str1 = strings[i].charAt(0); char str2 = strings[j].charAt(0); int num1 = str1; int num2 = str2; if (num1 > num2) { String string = strings[i]; strings[i] = strings[j]; strings[j] = string; } } } return strings; } public static void main(String[] args) { TestNumber t = new TestNumber(); String []strs = new String[8]; for (int i = 0;i < 8;i++){ strs[i] = t.get_String(5); } System.out.println(Arrays.toString(strs)); String[] sorted_str = t.stringDataGroup_sort(strs); System.out.println(Arrays.toString(sorted_str)); }//java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!
练习3 - 穷举法破解密码生成一个长度是3的随机字符串,把这个字符串作为当做密码使用穷举法生成长度是3个字符串,匹配上述生成的密码要求: 使用 递归解决 上述问题
9.7 操纵字符串
获取字符 charAt(int index)获取指定位置的字符String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号"; char c = sentence.charAt(0); 复制代码
获取对应的字符数组 toCharArray() String sentence = "盖伦,在进行了连续8次击杀后,获得了超神 的称号"; char[] cs = sentence.toCharArray(); //获取对应的字符数组截取子字符串 subStringString sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号";//截取从第3个开始的字符串 (基0)//到5-1的位置的字符串//左闭右开String subString2 = sentence.substring(3,5);System.out.println(subString2);split 根据分隔符进行分隔String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号"; //根据,进行分割,得到3个子字符串String subSentences[] = sentence.split(",");for (String sub : subSentences) { System.out.println(sub);}trim 去掉首位空格String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号 "; System.out.println(sentence);//去掉首尾空格System.out.println(sentence.trim());大小写toLowerCase 全部变成小写;toUpperCase 全部变成大写。
String sentence = "Garen"; //全部变成小写System.out.println(sentence.toLowerCase());//全部变成大写System.out.println(sentence.toUpperCase());定位indexOf 判断字符或者子字符串出现的位置 contains 是否包含子字符串
String sentence = "盖伦,在进行了连续8次击杀后,获得了超神 的称号"; System.out.println(sentence.indexOf('8')); //字符第一次出现的位置 System.out.println(sentence.indexOf("超神")); //字符串第一次出现的位置 System.out.println(sentence.lastIndexOf("了")); //字符串最后出现的位置 System.out.println(sentence.indexOf(',',5)); //从位置5开始,出现的第一次,的位置 System.out.println(sentence.contains("击杀")); //是否包含字符串"击杀"替换replaceAll 替换所有的;replaceFirst 只替换第一个。
String sentence = "盖伦,在进行了连续8次击杀后,获得了超神 的称号"; String temp = sentence.replaceAll("击杀", "被击杀"); //替换所有的 temp = temp.replaceAll("超神", "超鬼");System.out.println(temp); temp = sentence.replaceFirst(",","");//只替换第一个System.out.println(temp);练习1 - 每个单词的首字母都转换为大写给出一句英文句子: "let there be light" 得到一个新的字符串,每个单词的首字母都转换为大写
练习2 - 英文绕口令英文绕口令 peter piper picked a peck of pickled peppers 统计这段绕口令有多少个以p开头的单词
练习3 - 间隔大写小写模式把 lengendary 改成间隔大写小写模式,即 LeNgEnDaRy
练习4 - 最后一个字母变大写把 lengendary 最后一个字母变大写
练习5 - 把最后一个two单词首字母大写Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak 把最后一个two单词首字母大写
public class StringTest { //问题1 - 每个单词的首字母都转换为大写 public static String[] Split_Space(String str){ return str.split(" "); } public static String[] Toupcase(String[] strs){ String []newstrs = new String[strs.length]; int i = 0; for(String str : strs){ char []cs = str.toCharArray(); cs[0] = Character.toUpperCase(cs[0]); newstrs[i++] = String.valueOf(cs); } return newstrs; } //练习2 - 英文绕口令 public static int countp(String[] strs){ int count = 0; for (String str :strs){ if (str.charAt(0) == 'p') count++; } return count; } //练习3 - 间隔大写小写模式 public static String updownChange(String str){ String upstr = str.toUpperCase(); char []cs = upstr.toCharArray(); for (int i = 1;i < cs.length;i+=2) { cs[i] = Character.toLowerCase(cs[i]); } return new String(cs); } //练习4-最后一个字母变大写 public static String lastup(String str){ char []cs = str.toCharArray(); cs[cs.length - 1] = Character.toUpperCase(cs[cs.length - 1]); return new String(cs); } //练习5 - 把最后一个two单词首字母大写 public static String last2up(String s){ char [] c = s.toCharArray(); String n = "two"; c [s.lastIndexOf(n)] = Character.toUpperCase(s.charAt(s.lastIndexOf(n))); return new String(c); } public static void main(String[] args) { //问题1 - 每个单词的首字母都转换为大写 String str = "let there be light"; String []newstrs = Toupcase(Split_Space(str)); String result = ""; for (String s : newstrs) { result += s + " "; } System.out.println(result); //练习2 - 英文绕口令 String str2 = "peter piper picked a peck of pickled peppers"; int count = countp(Split_Space(str2)); System.out.println("首字母为p的单词有" + count); //练习3 - 间隔大写小写模式 String str3 = "lengendary"; System.out.println("间隔大小写模式:" + updownChange(str3)); //练习4-最后一个字母变大写 System.out.println("最后一个字符变成大写:" + lastup(str3)); //练习5 - 把最后一个two单词首字母大写 String str5 = "Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak"; System.out.println(last2up(str5)); }}9.8 比较字符串是否是同一个对象str1和str2的内容一定是一样的!但是,并不是同一个字符串对象。
==用于判断是否是同一个字符串对象。
是否是同一个对象-特例String str1 = "the light";String str3 = "the light";System.out.println( str1 == str3);一般说来,编译器每碰到一个字符串的字面值,就会创建一个新的对象。 所以在第6行会创建了一个新的字符串"the light"; 但是在第7行,编译器发现已经存在现成的"the light",那么就直接拿来使用,而没有进行重复创建。
内容是否相同使用equals进行字符串内容的比较,必须大小写一致; equalsIgnoreCase,忽略大小写判断内容是否一致。
是否以子字符串开始或者结束startsWith //以...开始;endsWith //以...结束。
练习-比较字符串创建一个长度是100的字符串数组,使用长度是2的随机字符填充该字符串数组。 统计这个字符串数组里重复的字符串有多少种
学了hash再来做吧..
9.9 StringBuffer*
StringBuffer是可变长的字符串
追加 删除 插入 反转append追加;delete 删除;insert 插入;reverse 反转.
package character; public class TestString { public static void main(String[] args) { String str1 = "let there "; StringBuffer sb = new StringBuffer(str1); //根据str1创建一个StringBuffer对象 sb.append("be light"); //在最后追加 System.out.println(sb); sb.delete(4, 10);//删除4-10之间的字符 System.out.println(sb); sb.insert(4, "there ");//在4这个位置插入 there System.out.println(sb); sb.reverse(); //反转 System.out.println(sb); }}长度 容量为什么StringBuffer可以变长? 和String内部是一个字符数组一样,StringBuffer也维护了一个字符数组。 但是,这个字符数组,留有冗余长度。
比如说new StringBuffer("the"),其内部的字符数组的长度,是19,而不是3,这样调用插入和追加,在现成的数组的基础上就可以完成了。 如果追加的长度超过了19,就会分配一个新的数组,长度比原来多一些,把原来的数据复制到新的数组中,看上去 数组长度就变长了。length: “the”的长度 3;capacity: 分配的总空间 19。
public class TestString { public static void main(String[] args) { String str1 = "the"; StringBuffer sb = new StringBuffer(str1); System.out.println(sb.length()); //内容长度 System.out.println(sb.capacity());//总空间 } }练习-StringBuffer性能String与StringBuffer的性能区别?
生成10位长度的随机字符串 然后,先使用String的+,连接10000个随机字符串,计算消耗的时间 然后,再使用StringBuffer连接10000个随机字符串,计算消耗的时间
提示: 使用System.currentTimeMillis() 获取当前时间(毫秒)
public static void main(String[] args) { long start = System.currentTimeMillis(); String s1 = ""; for (int i=0;i<10000;i++){ s1 += 'a'; } long end = System.currentTimeMillis(); System.out.println("string总共耗时了:"+(end-start)); long start2 = System.currentTimeMillis(); StringBuffer sb = new StringBuffer(); for (int i=0;i<10000;i++){ sb.append('a'); } long end2 = System.currentTimeMillis(); System.out.println("stringbuffer总共耗时了:"+(end2-start2)); }//java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!
练习-MyStringBuffer根据接口IStringBuffer ,自己做一个MyStringBuffer
IStringBuffer.java
package character; public interface IStringBuffer { public void append(String str); //追加字符串 public void append(char c); //追加字符 public void insert(int pos,char b); //指定位置插入字符 public void insert(int pos,String b); //指定位置插入字符串 public void delete(int start); //从开始位置删除剩下的 public void delete(int start,int end); //从开始位置删除结束位置-1 public void reverse(); //反转 public int length(); //返回长度}MyStringBuffer.java
package character;public class MyStringBuffer implements IStringBuffer{}9.10 MyStringBuffer
具体文字说明:how2j.cn/k/number-st…
package digit;public class MyStringBuffer implements IStringBuffer{ int capacity = 19; int length = 0; char []value; // 无参构造方法 public MyStringBuffer(){ value = new char[capacity]; } // 带参数构造方法 public MyStringBuffer(String str){ this(); if (null == str) return; if(capacity < str.length()){ capacity = value.length * 2; value = new char[capacity]; } if (capacity >= str.length()){ System.arraycopy(str.toCharArray(),0,value,0,str.length()); } length = str.length(); } //追加字符串 @Override public void append(String str){ insert(length,str); } //追加字符 @Override public void append(char c){ append(String.valueOf(c)); } //指定位置插入字符 @Override public void insert(int pos,char b){ insert(pos,String.valueOf(b)); } //指定位置插入字符串 @Override public void insert(int pos,String b){ //边界条件判断 if (pos < 0) return; if(pos > length) return; if (null == b) return; //扩容 while(length + b.length() > capacity){ capacity = (int)((length + b.length())*2); char []new_value = new char[capacity]; System.arraycopy(value,0,new_value,0,length); value = new_value; } char []cs = b.toCharArray(); //先把已经存在的数据往后移 System.arraycopy(value,pos,value,pos+cs.length,length-pos); //把要插入的数据插入到指定位置 System.arraycopy(cs, 0, value, pos, cs.length); length = length+cs.length; } //从开始位置删除剩下的 @Override public void delete(int start){ delete(start,length); } //从开始位置删除结束位置-1 @Override public void delete(int start,int end){ //边界条件判断 if(start<0) return; if(start>length) return; if(end<0) return; if(end>length) return; if(start>=end) return; System.arraycopy(value, end, value, start, length- end); length-=end-start; } //反转 @Override public void reverse(){ for (int i = 0; i < length / 2; i++) { char temp = value[i]; value[i] = value[length - i - 1]; value[length - i - 1] = temp; } } //返回长度 @Override public int length(){ return length; } public String toString() { char[] realValue = new char[length]; System.arraycopy(value, 0, realValue, 0, length); return new String(realValue); } public static void main(String[] args) { MyStringBuffer sb = new MyStringBuffer("there light"); System.out.println(sb); sb.insert(0, "let "); System.out.println(sb); sb.insert(10, "be "); System.out.println(sb); sb.insert(0, "God Say:"); System.out.println(sb); sb.append("!"); System.out.println(sb); sb.append('?'); System.out.println(sb); sb.reverse(); System.out.println(sb); sb.reverse(); System.out.println(sb); sb.delete(0,4); System.out.println(sb); sb.delete(4); System.out.println(sb); }}