java基础学习笔记(三)
1、装箱和拆箱
所有基本类型都有对应的类类型,比如int对应的类是Integer,这种类就叫做封装类。数字封装类有Byte、Short、Integer、Long、Float、Double这些类都是抽象类Number的子类。封装类和基本类型之间可以相互转换,而基本类型自动转封装类型就叫装箱,反之则是拆箱,代码如下
int i = 5;
//基本类型转换成封装类型
Integer it = new Integer(i);
//自动转换就叫装箱,通过=符号
Integer it2 = i;
//Integer是Number的子类,所以打印true
System.out.println(it instanceof Number);
//封装类型转换成基本类型
int i2 = it.intValue();
2、字符串转换:数字转字符串:方法一使用String 类的静态方法valueOf(); 方法二是把基本类型装箱为封装类型,然后调用封装类类型的toString();
int i = 5;
String str = String.valueOf(i);//方法一使用封装类的valueOf方法
Integer it = i; //自动转换装箱
String str2 = it.toString(); //调用字符串封装类的toString方法
3、数学方法:java.lang.Math提供了一些常用的数学运算方法,并且都是以静态方法的形式存在。如Math.round()是四省五入,Math.sqrt(9)是开平方,Math.pow(2,4)是2的4次方,Math.E是自然常数。
4、格式化输出:输出时如果变量过多时会用字符串拼接,拼接会显得繁琐,另一种解决方式是格式化输出,printf和format能够达到一模一样的效果,其中%s表示字符串,%d表示数字,%n表示换行。如下:
String sentenceFormat="%s 在进行了连续 %d 次击杀后,获得了 %s 的称号%n";
System.out.printf(sentenceFormat, "teemo", 5,"超神");
System.out.format(sentenceFormat, "teemo", 5,"超神");
5、Char基本类型对应的封装类型是Character,Character常用静态方法如下:
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'); //转换为字符串
6、字符串使用:String 被修饰为final,所以不能被继承。String的成员变量是private final 的,所以String 是immutable的,表现像个常量。如String s=”abc”;s=”123”;字符串创建的内容并没有改变,s引用指向发生改变了,“abc”和“123”是两个字符串对象,在内存空间上占两个位置。
7、获取随机字符串的多种方法:
ASCII码对照表
方法1,思路是随机获取字母数字ASCII码数对应范围内的数,判断是否是字母或数字,循环获取5个满足要求的字符拼接成字符串
char cs[] = new char[5];
short start = '0';
short end = 'z'+1;
for (int i = 0; i < cs.length; i++) {
while (true) {
char c = (char) ((Math.random() * (end - start)) + start);
if (Character.isLetter(c) || Character.isDigit(c)) {
cs[i] = c;
break;
}
}
}
String result = new String(cs);
System.out.println(result);
方法2,思路是将所有数字、字母字符拼接成一个字符串,再随机获取字符
String pool = "";
for (short i = '0'; i <= '9'; i++) {
pool+=(char)i;
}
for (short i = 'a'; i <= 'z'; i++) {
pool+=(char)i;
}
for (short i = 'A'; i <= 'Z'; i++) {
pool+=(char)i;
}
char cs2[] = new char[5];
for (int i = 0; i < cs2.length; i++) {
int index = (int) (Math.random()*pool.length());
cs2[i] = pool.charAt( index );
}
String result2 = new String(cs2);
System.out.println(result2);
方法3:思路是在数字字母分块对应的ASCII码数值间获取随机数,循环多次获取随机数转换成字符拼接成字符串
public class TestNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] chars = new char[5]; // 创建字符数组,每一个字符都将随机获取
String str = ""; // 空字符串用来最后组合随机字符的
for (int i = 0; i < chars.length; i++) {
chars[i] = getRadomChar();
str += chars[i];
}
System.out.println(str);
}
public static char getRadomChar() {
int m1 = (int) (Math.random() * (90 - 65)) + 65;
int m2 = (int) (Math.random() * (57 - 48)) + 48;
int m3 = (int) (Math.random() * (122 - 97)) + 97;
int[] m = { m1, m2, m3 };
int index = (int) Math.floor((Math.random() * 3));
char c = (char) m[index];
System.out.println(c);
return c;
}
}
其中
public static void main(String[] args) {
//获取拼接好的所有字符
//在for循环中采用StringBuilder比用String的 `+=`高效;
StringBuilder strPool_tmp = new StringBuilder();
for(short i='0';i<'z';i++) {
if(Character.isLetter((char)i)||Character.isDigit((char)i)) {
strPool_tmp.append((char)i);
}
}
System.out.println(strPool_tmp.toString());
}
8、穷举法(枚举法):
枚举法是在分析问题时,逐个列举出所有可能情况,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃,最后得出一般结论。主要利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。
说白了,**就是通过循环或者递归,把所有可能的情况过一遍,**符合条件就留下,不符合继续找。
9、递归算法。递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了调用它自身的情况。递归是利用系统的堆栈保存函数当中的局部变量来解决问题的,因为函数调用的开销,递归常常会带来效率问题。
//斐波拉契数列问题。找出数列中指定index位置的数值 1,1,2,3,5,8,13,21,34,55
public static int getNum(int testNum) {
if(testNum<3) {
return 1;
}else {
return getNum(testNum-1)+getNum(testNum-2);
}
}
10、字符串方法:
charAt(int index)获取指定位置的字符;toCharArray()是将字符串转换为对应的字符数组;subString 截取子字符串;split 根据分隔符进行分隔生成字符串数组;trim 去掉首尾空格后返回新的字符串;toLowerCase 返回全部变成小写 ,toUpperCase 返回全部变成大写的字符串;indexOf 判断字符或者子字符串出现的位置;contains 是否包含子字符串;replaceAll 替换所有的 ,replaceFirst 只替换第一个;
public class TestString {
public static void main(String[] args) {
// TODO Auto-generated method stub
String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号";
char c = sentence.charAt(0);
System.out.println(c); //输出 盖
char[] cs = sentence.toCharArray(); //获取对应的字符数组
System.out.println(sentence.length() == cs.length);
//截取从第3个开始的字符串 (基0)
//到5-1的位置的字符串
//左闭右开
String subString2 = sentence.substring(3,5);
System.out.println(subString2);
//根据,进行分割,得到3个子字符串
String subSentences[] = sentence.split(",");
for (String sub : subSentences) {
System.out.println(sub);
}
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("击杀")); //是否包含字符串"击杀"
String temp = sentence.replaceFirst(",","");//只替换第一个
System.out.println(temp);
}
}
11、比较字符串:
public class TestString {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="the light"; //编译器碰到字符串的字面值就会创建一个新对象
String str2=new String();
String str3="the light"; //当发现已经存在的字符串对象就不会重复创建
System.out.println(str==str2); //false
System.out.println(str==str3); //true
System.out.println(str.equals(str2)); //false,完全一样则返回true
String str4=str3.toUpperCase();
System.out.println(str.equalsIgnoreCase(str4)); //true
String start="th";
String end="ight";
System.out.println(str.startsWith(start));//true,是否以字符串开始或结束
System.out.println(str.endsWith(end));
}
}
11、StringBuffer可变长的字符串,有以下方法
public static void main(String[] args) {
String str="the";
StringBuffer sb=new StringBuffer(str);
System.out.println(str.length()); //3,String内部是一个字符数组
System.out.println(sb.capacity()); //19,内部也有一个字符数组,留有冗余数组,19这个空间大小,不同JDK不一样
sb.append(" Man"); //追加
sb.insert(7," IS BOY"); //插入
sb.reverse(); //反转
System.out.println(sb);
}
12、Date类:注意:是java.util.Date; 而非 java.sql.Date,此类是给数据库访问的时候使用的
时间原点概念:Java中的时间原点,其对应的日期是1970年1月1日 8点0分0秒 。
public static void main(String[] args) {
Date d1=new Date(); //创建日期对象
System.out.println("当前日期时间是"+d1);
// 从1970年1月1日 早上8点0分0秒 开始经历的毫秒数
Date d2 = new Date(5000);
System.out.println("从1970年1月1日 早上8点0分0秒 开始经历了5秒的时间");
System.out.println(d2);
//getTime()方法得到一个long型的整数
System.out.println("从时间原点开始经历的毫秒数:"+d1.getTime());
//new Date().getTime() 和 System.currentTimeMillis() 基本是一样的
System.out.println("系统的当前毫秒数:"+System.currentTimeMillis());
}
13、SimpleDateFormat 日期格式化类,有以下方法
public static void main(String[] args) {
//日期转字符串
//y 代表年
//M 代表月
//d 代表日
//H 代表24进制的小时
//h 代表12进制的小时
//m 代表分钟
//s 代表秒
//S 代表毫秒
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS" );
Date d= new Date();
String str = sdf.format(d);
System.out.println("当前时间通过 yyyy-MM-dd HH:mm:ss SSS 格式化后的输出: "+str);
//字符串转日期
SimpleDateFormat sdf2 =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss" );
String str2 = "2016/1/5 12:12:12";
//需要进行异常处理
try {
Date d2 = sdf2.parse(str2);
System.out.printf("字符串 %s 通过格式 yyyy/MM/dd HH:mm:ss %n转换为日期对象: %s",str2,d2.toString());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
14、日历对象,采用单例模式获取日历对象Calendar.getInstance();
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date now = c.getTime();
// 当前日期
System.out.println("当前日期:\t" + format(c.getTime()));
// 下个月的今天
c.setTime(now);
c.add(Calendar.MONTH, 1);
System.out.println("下个月的今天:\t" +format(c.getTime()));
// 去年的今天
c.setTime(now);
c.add(Calendar.YEAR, -1);
System.out.println("去年的今天:\t" +format(c.getTime()));
// 上个月的第三天
c.setTime(now);
c.add(Calendar.MONTH, -1);
c.set(Calendar.DATE, 3);
System.out.println("上个月的第三天:\t" +format(c.getTime()));
}
更多资源或实战项目详细可以了解:http://how2j.cn/k/interface-inheritance/interface-inheritance-practise/679.html?p=29570
还没有评论,来说两句吧...