Day07:Java核心类
字符串和编码
String 字符串
实际上字符串在String内部是一个char[]数组。字符串是不可变的。
字符串的比较: 必须使用equals()方法。要忽略大小写比较,使用
equalsIgnorecase()。
从String的不变性设计可以看出,如果传入的对象有可能改变,我们需要复制而不是直接引用。
字符串的操作不改变原字符串内容、而是返回新字符串
注意以下两段代码的区别:
public class Main {
public static void main(String[] args) {
int[] scores = new int[] { 88, 77, 51, 66 };
Score s = new Score(scores);
s.printScores();
scores[2] = 99;
s.printScores();
}
}
class Score {
private int[] scores;
public Score(int[] scores) {
this.scores = scores;
}
public void printScores() {
System.out.println(Arrays.toString(scores));
}
}
--------------------------------------------
public class Main {
public static void main(String[] args) {
int[] scores = new int[] { 88, 77, 51, 66 };
Score s = new Score(scores);
s.printScores();
scores[2] = 99;
s.printScores();
}
}
class Score {
private int[] scores;
public Score(int[] scores) {
int[] newscores=new int[scores.length];
for(int i=0;i<scores.length;i++)
newscores[i]=scores[i];
this.scores=newscores;
}
public void printScores() {
System.out.println(Arrays.toString(scores));
}
}
字符编码
-
ASCII 英文
-
GB2312 中文
-
Unicode 全球统一
-
UTF-8 把固定长度的Unicode变成1~4字节的UTF-8编码。
StringBuilder
Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象。
没搞懂这些东西,廖雪峰的练习涉及到数据库了,以后再看。
.append() 可以用来链式拼接字符串,好像用的很多,不太理解。
var 类型 java10版本新出特性,声明时赋值。代码更加简洁。
StringJoiner
用来给字符串添加分隔符,例如
var sj= new StringJoiner(",")
还可以加开头和结尾,例如加上 hello,bye
var sj=new StringJoiner(","," Hello","Bye");
String.join() 在不需要添加开头和结尾的时候可以用
String[] names={"Bob","Alice","Grace"};
var s=String.join(",",names);
包装类型
想要把int基本类型变成一个引用类型,我们可以定义一个Integer类,它只包含一个实例字段int,这样,Integer类就可以视为int的包装类
可以写一个方法,返回该int型的实例字段。
public class Integer {
private int value;
public Integer(int value) {
this.value = value;
}
public int intValue() {
return this.value;
}
Integer n = null;
Integer n2 = new Integer(99);
int n3 = n2.intValue();
包装类型非常有用,Java核心库为每种基本类型都提供了对应的包装类型
Integer n = new Integer(100);
Integer n=Integer.valueOf(100);
推荐使用第二种方法创建。
Integer.valueOf是静态工厂方法,它尽可能地返回缓存的实例以节省内存。
所有的整数和浮点数的包装类型都继承自Number类,可以非常方便地直接通过包装类型获取各种基本类型
// 向上转型为Number:
Number num = new Integer(999);
// 获取byte, int, long, float, double:
byte b = num.byteValue();
int n = num.intValue();
long ln = num.longValue();
float f = num.floatValue();
double d = num.doubleValue();
JavaBean
get和set方法称为读写属性。
只有getter是只读,只有setter是只写。
枚举类enum
enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
虽然是引用类型,但枚举类可以用“ == ”比较。
特点
-
定义的
enum类型总是继承自java.lang.Enum,且无法被继承; -
只能定义出
enum的实例,而无法通过new操作符创建enum的实例; -
定义的每个实例都是引用类型的唯一实例;
-
可以将
enum类型用于switch语句。 -
enum的构造方法要声明为private,字段强烈建议声明为final;
记录类
BigInteger
任意大小的数,可以超过long,超过64位。暂时用不到
BigDecimal
任意大小且精度完全准确的浮点数。
常用工具类
Math
求绝对值:Math.abs();
取最大或最小值:Math.max(); Math.min();
计算x^y次方:Math.pow(2,10); 2的10次方
计算√x:Math.sqrt();
计算e^x次方:Math.exp();
计算以e为底的对数:Math.log(4);
计算以10为底的对数:Math.log10();
三角函数:Math.sin();
Math.cos();
Math.tan();
几个数学常量:Math.PI // 3.14159...
Math.E // 2.7182818
生成一个随机数x,x的范围是0<= x< 1:Math.random();
Random 创建伪随机数
Random r=new Random();
r.nextInt(); //生成随机数
创建Random实例时,如果不给定种子,就使用系统当前时间戳作为种子,因此每次运行时,种子不同,得到的伪随机数序列就不同。
如果我们在创建Random实例时指定一个种子,就会得到完全确定的随机数序列
SecureRandom
创建安全的随机数。

浙公网安备 33010602011771号