一.基本数据类型与包装类型
1.八种基本数据类型
整形:byte(1字节) short(2字节) int(4字节) long(8字节)
浮点型:float(4字节)double(八字节)
非数值型:char(2字节) boolean
2.八种基本数据类型对应的引用数据类型
整形:Byte Short Integer Long
浮点型:Float Double
非数值型:Character Boolean
3.装箱,拆箱
装箱:自动将基本数据类型转换为包装类型;
int i=500;
Integer j=new Integer(i);
拆箱:自动将包装类型转换为基本数据类型;
Integer j=10;
int i=j;
4.Integer 与 int 区别?
1)Integer默认值是null,int默认值是0;
2)声明Integer的变量需要实例化,而声明为int的变量不需要实例化;
3)Integer是对象,用一个引用指向这个对象;而int基本类型,直接存储数值;
eg:
Integer i=new Integer(z);
Integer j=new Integer(z);
System.out.println(i==j);
//false, i、j各自new了不同的地址
Integer i = 2;
Integer j = 2;
System.out.println(i==j);
//true, i、j同时指向常量池中2的地址
Integer i = 200;
Integer j = 200;
System.out.println(i==j);
//false, Integer有范围(-128,127)超出范围,会自动new地址
二.String类
String类是一个final 类,代表不可变的字符串。字符串是常量,用双引号引起来表示。他们的值在创建后不能更改。Sting对 象的字符串内容是存储在一个字符数组value[]中的。String如果直接赋值,是将字符串保存到方法区中 的常量池中。如果new,会在堆中,然后堆再指向方法区常量池中的字符串。
字符串存储再常量池中的目的是共享。
只要其中有一个变量,结果就在堆中
1.字符串常用方法
int length();获取字符串长度
char charAt(int index);获取索引处字符串
String toUpperCase();将String中所有字符串转换为大写
String trim();忽略空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
String concat(String str):将指定字符串连接到此字符串的结尾。
compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串beginIndex开始截取到endIndex(不包含)的一个子字符串。
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
booolean contains(CharSequence a);判断是否包含之指定char值序列
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
indexOf和lastIndexOf方法如果未找到都是返回-1
String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) : 使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
2.String特点
1)String:要使用""引起来表示。
2)String声明为final的,不可被继承。
3)String 实现了Serializable接口(表示字符串是支持序列化的);、
实现了Comparable接口(表示String可以比较大小)
4)String内部定义了final、char[ ]、value用于存储字符串数据。
5)String代表不可变的字符序列(不可变性)
1>当字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
2>当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
3>当调用String的replace()方法修改指定字符或字符串时,也需要重写指定内存区域赋值,不能使用原有value进行赋值。
6)通过字面量的方式给一个字符串赋值,此时的字符串值声明在字符串的常量池中。
7)字符串常量池中是不会存储内容相同的字符串的。
3.StringBuffer类
StringBuffer代表可变的字符序列,可以对字符串内容进行增删,此时不会产生新的对象。
1.StringBuffer三个构造器:
StringBuffer():初始容量为16的字符串缓冲区
StringBuffer(int size):构造指定容量的字符缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容
2.StringBuffer常用方法
StringBuffer append(***):用于字符串的拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start,int end,String str):把【start,end】位置替换为str
StringBuffer insert(int offset,***)在指定位置插入***
StringBuffer reserve():将当前字符串序列逆转
4.StringBuilder类
与StringBuffer类似。提供相关的功能与方法。
5.String、StringBuffer、StringBuilder三者的异同?
String:不可变字符串序列;底层使用char[存储]
StringBuffer:可变的字符串序列,线程安全,效率低;底层使用char[存储]
StringBuilder:可变的字符串序列,线程不安全,效率高;底层使用char[存储]
eg1:
字符串反转,给定字符串,给定起始位置和结束位置,对字符串进行反转
public static String reserve(String str,int start,int end){
char[] arr=str.toCharArray();
for(int i=start,j=end;i<j;i++,j--){
char c=arr[i];
arr[i]=arr[j];
arr[j]=c;
}
return new String(arr);
}
public static void mian(String[] args){
String s=reserve("hello",1,3);
System.out.println(s);
}
eg2:
获取一个字符串再另一个字符串中出现的次数。比如“ab”在“abcccabddddabeeeeaaaaab“中出现的 次数”。
public static void main(String[] args) {
int num=getCount("abcdefabeeeeaaagggaaabbbbbab","ab");
System.out.println(num);
}
public static int getCount(String mainWords,String subWords){
if(mainWords.length()>subWords.length()){
int count=0;
int index;
int mainLength=mainWords.length();
int subLength=subWords.length();
while ((index=mainWords.indexOf(subWords))!=-1){
count++;
mainWords=mainWords.substring(index+subLength);
}
return count;
}else{
return 0;
}
}
4.日期类型
1.打印日历
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入年份:");
int years=scanner.nextInt();
System.out.println("输入月份:");
int month=scanner.nextInt();
LocalDate localDate=LocalDate.of(years,month,1);
int weekdays=localDate.getDayOfWeek().getValue();
int day=0;
if(month>0&&month<12){
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day=31;
break;
case 2:
if(localDate.isLeapYear()){
day=29;
}else{
day=28;
}
break;
case 4:
case 6:
case 9:
case 11:
day=30;
break;
}
}
System.out.println("一\t二\t三\t四\t五\t六\t日");
int cout=0;
for(int i=1;i<weekdays;i++){
cout++;
System.out.print("\t");
}
for(int i=1;i<day;i++){
cout++;
System.out.print(i+"\t");
if(cout%7==0){
System.out.println();
}
}
}