Java 基础
Java是一门面向对象的编程语言,所谓的的面向对象是区别于面向过程来说的。
Java八大基本数据类型:
整数:
short(2个字节) int(4个字节 ) long (8个字节)
小数/浮点数:
float(4个字节) double(8个字节)
字节:
byte(1个字节,-128–127)
字符:
char(2个字节)
布尔值
boolean (1个bit)
二进制
8 (1000) 4 (0100) 2 (0010) 1 (0001)
类型转换
自动类型转换
把一个范围小的数值或变量直接赋值给另一个数据范围大的变量时,系统可进行自动类型转换。
强制类型转换
将范围大的数据向小范围数据进行转换则需要强制转换
强制语法:类型 变量名 = (要被转的类型)值;
eg:short a=5s;
int b=4;
b= (int)a;
运算符
算术运算符
+. -. *. /. %.(取余) ++.自加运算 --自减运算
赋值运算符
=
其他运算符可以和=结合成缩写
- +=:对于x+=y,表示x=x+y
- -=: 对于x-=y,表示x=x-y
- *** =: 对于x *** =y,表示x=x*y
- /=; %=; &=; |=; ^=; <<=; >>=; >>>=
位运算符
按位与& 按位或| 按位非~ 按位异或^(异或) <<(左移运算符) >>(右移运算符)
异或运算符有一个特点:一个数据对另一个数据异或两次,该数本身不变。
使用位运算符,必须先把数据换算成二进制,然后再参加运算。
两个整数变量的交换
-
第三个变量
-
异或
a=a^b;
b=a^b; abb=a
a=a^b; aba=b
-
变量相加
a=a+b;
b=a-b; a+b-b=a
a=a-b; a-b-a=b
逻辑运算符
逻辑运算符用于操作两个布尔型的变量或常量,逻辑返回的值为Boolean类型,主要有6个。
& && | || ! ^
异或(^)与或(|)的不同之处是:当左右都为true时,结果为false.
三目运算符
逻辑表达式?表达式1:表达式2
&&(||)与&(|)的区别
短路,&&第一个执行错误不会执行第二个,&第一个执行错误仍执行第二个。
流程控制
if
-
做判断
if (条件){执行代码} else if (条件){执行代码} else {执行代码}
switch
switch(字段){
case 值1:
语句体1;
break;
case 值2 :
语句体2;
break;
....
default;
语句体n+1;
}
循环
for
for(int i=1;i<=10;i++){
system.out.println" "
}
while
int i=1
while(i<=10){
system.out.println" "
} i+=1/i++;
for循环与while循环的区别
在for循环中定义的变量出了for循环就在内存中消失,提高了内存的使用效率。
do while
先循环再判断,至少执行一次。
死循环
跳出循环
break 中断
- break的使用场景:
- 在选择结构switch语句中
- 在循环语句中
- break的作用:
- 跳出单层循环
- 跳出多层循环
- 带标签的跳出
- 格式:标签名:循环语句
continue继续
public static void main(String[] args){
for(int x=0; x<10; x++) {
if(x == 2) { System.out.println("退出");
//break;
//continue;
return
}
System.out.println(x);
}
System.out.println("over");
}
return 返回
结束一个方法,返回到上层调用的地方,并可带返回值。
数组
- 静态数组
数据类型 [] 数组名= new 数据类型 [] {1,2,3…}
e.g int[] a= new int[] {1,2,3…};
- 动态数组
数据类型 [] 数组名= new 数据类型 []
-
二维数组
-
格式一
-
数据类型**[] []**变量名=new 数据类型[m] [n];
-
m表示这个二维数组有多少个一维数组
-
n表示每一个一维数组的元素个数
-
举例:
-
int[] [] arr= new int[3] [2];
-
定义了一个二维数组arr
-
这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
-
每个一维数组有2个元素,可以通过arr[m] [n]来获取
表示获取第m+1个一维数组的第n+1个元素
-
-
-
格式二
- 数据类型**[] []**变量名=new 数据类型[m] [n];
- m表示这个二维数组有多少个一维数组
- 这一次没有直接给出一维数组的元素个数,可以动态的给出。
- 举例:
- int[] [] arr= new int [3] [];
- arr[0] = new int [2];
- arr [1] = new int [3];
- arr [2] = new int [1];
-
格式三
- 数据类型**[] []**变量名=new 数据类型[] [] {{元素…},{元素…},{元素…}};
- 简化版格式:
- 数据类型[] [] 变量名 = {{元素…},{元素…},{元素…}};
- 举例:
- int[] [] arr = {{1,2,3},{4,5},{6}};
-
-
数组中常见报错
数组索引越界
ArrayIndexOutOfBoundsException
访问到了数组中的不存在的索引时发生。
空指针异常
NullPointerException
数组引用没有指向实体,却在操作实体中的元素时发生。
常用类
引用类型
一般来说,我们需要用到一个类,定义的写法为:
类名 对象名 = new 类名 ();
内存分配
堆,栈,方法区
new对象
数组
Date
get
格式化
- 日期转为string
SimpleDateFormat format= new SimpleDateFormat("yyyy/MM/dd");
java.util.Date date =new java.util.Date();
String aaa=format.format(date);
System.out.println(aaa);
- string转为date
String birth="2000/06/29";
SimpleDateFormat format2=new SimpleDateFormat("yyyy/MM/dd");
java.util.Date date2=format2.parse(birth);
System.out.println(date2.getDay());
Calendar
-
Calendar calendar= Calendar.getInstance(); System.out.println(calendar.get(Calendar.YEAR));
-
calendar与date的相互转换
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
System.out.println(date);
Calendar cale = Calendar.getInstance();
cale.setTime(date);
- 获取时间
Calendar cal = Calendar.getInstance();
// 赋值时年月日时分秒常用的6个值,注意月份下标从0开始,所以取月份要+1
System.out.println("年:" + cal.get(Calendar.YEAR));
System.out.println("月:" + (cal.get(Calendar.MONTH) + 1));
//一个月的第几天
System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));
//一天的第几个小时
System.out.println("时:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("分:" + cal.get(Calendar.MINUTE));
System.out.println("秒:" + cal.get(Calendar.SECOND));
- 设置时间
//得到当前时间
Calendar cal = Calendar.getInstance();
//设置时间
cal.set(Calendar.Year,2018);
cal.set(Calendar.DAY_OF_MONTH, 15);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
//输出
System.out.println(cal.getTime());
- 增加或减少时间
//得到当前时间
Calendar cal = Calendar.getInstance();
//添加改变的值
calendar.add(Calendar.DATE, 5);
System.out.println(calendar.get(Calendar.DATE));
System.out.println(calendar.get(Calendar.MONTH));
Random 随机数
Random random = new Randow();
int num = random.nextInt(10) ;
Math
- math.e 2.7
- math.Π 3.1415926
- math.ceil (5.3) 向上取整 6
- math.floor(5.9) 向下取整 5
- math.round(5.3) 四舍五入 5
bigdecimal 精确度
double、float浮点数在进行数据基本运算时会发生数据丢失现象,这种情况不仅仅是在Java语言中,在其他语言中同样存在。
Java提供了BigDecimal类,用于处理进行基本运算发生的数据丢失问题。使用BigDecimal构造器创建对象时,建议优先用String类型对象作为参数传入进行初始化。
BigDecimal decimal = new BigDecimal("0.05");
BigDecimal decimal2 = new BigDecimal("0.01");
decimal=decimal.add(decimal2);
System.out.println(decimal);
System
System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量、类方法,允许直接通过System类来调用这些Field和方法。
-
static Map<String,String> getenv():返回一个不能修改的当前系统环境的字符串映射视图。
-
static String getenv(String name):获取指定的环境变量值。
-
static Properties getProperties():确定当前的系统属性。
-
static String getProperty(String key):获取指定键指示的系统属性。
-
static long currentTimeMillis():返回以毫秒为单位的当前时间。
面试题
String s1=new String("abc");
String s2="abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
String s3="bbb";
String s4="bbb";
System.out.println(s3==s4);
String s5=new String("ccc");
String s6=new String("ccc");
System.out.println(s5==s6);
String s7="hello";
String s8="world";
String s9="helloworld"; System.out.println(s9==s7+s8);
System.out.println(s9=="hello"+"world");
重点
-
字符串如果是变量相加,先开空间,再拼接
-
字符串如果是常量相加,先拼接,然后再常量池找,如果有就直接返回,没有再创建
StringBuffer和StringBuilder
可变字符串
二者的区别:前者是线程安全的可变字符串,后者线程不安全
常见方法
添加:
append
insert
删除:
deleteCharAt
delete
替换
replace
反转
reverse
面试
String,StringBuffer,StringBuilder的区别
String内容不可变,后两个内容可变
StringBuffer是线程同步的,数据安全,效率低;后者线程不同步,数据不安全,效率高
String,StringBuffer作为参数传递(值传递和引用传递,面向对象讲)
string
String aa="abcdefg";
String bb="abcdefg";
//输出第五个索引数
System.out.println(aa.charAt(5));
//包含abc
System.out.println(aa.contains("abc"));
//以@结尾
System.out.println(aa.endsWith("@"));
//以" "开头
System.out.println(aa.startsWith("@"));
//两者内容是否一样
System.out.println(aa.equals(bb));
//==判断地址是否相等
System.out.println(aa==bb); //输出true/false
//忽略大小写
System.out.println(aa.equalsIgnoreCase(bb));
//与char相反,输入字符,出现索引数,仅返回第一个数字位置,若没有,返回-1
System.out.println(aa.indexOf("b"));
//检查字符串是否为空
System.out.println(aa.isEmpty());
//字符串长度
System.out.println(aa.length);
//字符间置换 把a 置换为 h
String cc=aa.replace(a,h));
System.out.println(aa);
System.out.println(cc);
//分割字符串
String names="tom,jerry,marry";
String[] name=names.split(",");
System.out.println(name[1]);
//从哪里开始,截取字符串
String dd==aa.substring(2);/ String dd==aa.substring(2,6); 包前不包后
System.out.println(dd);
//把当前字符全部转小写、大写
String ee=aa.toLowerCase();
String ff=aa.toUpperCase();
//去除前后空格
String qq=" aa 123 ";
String ww=qq.trim();
System.out.println(ww);
//
int a=5;
System.out.println(a+5); 10
String s=String.valueOf(a);
System.out.println(a); 5
System.out.println(a+5); 55
scanner
键盘输入
- new Scanner(System.in)
- next()获得下一个元素,不包含回车
- next…()获得下一个指定类型,不包含回车
- nextLine()获得下一行,包含回车
scanner = new Scanner(System.in);
System.out.println("请输入");
String aString=scanner.nextLine();
读取文件
- new Scanner(File file);
- hasNext()是否有下一行
Scanner scanner = new scanner(newFile(d:/tiku.txt));
system.out.println(scanner.hasNext());
system.out.println(scanner.nextline());
clipboard 剪切板
//将920506粘贴在剪切板上,手动直接复制。
Clipboard clipboard= Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection= new StringSelection("920506"); //剪切板识别的格式
clipboard.setContents(selection,null);
//从剪切板里得到所有内容
Transferable transferable = clipboard.getContents(null);
//从内容中筛选索要的格式
String aaa = (String) transferable.getTransferData(DataFlavor.stringFlavor);
有下一行
Scanner scanner = new scanner(newFile(d:/tiku.txt));
system.out.println(scanner.hasNext());
system.out.println(scanner.nextline());
clipboard 剪切板
//将920506粘贴在剪切板上,手动直接复制。
Clipboard clipboard= Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection= new StringSelection("920506"); //剪切板识别的格式
clipboard.setContents(selection,null);
//从剪切板里得到所有内容
Transferable transferable = clipboard.getContents(null);
//从内容中筛选索要的格式
String aaa = (String) transferable.getTransferData(DataFlavor.stringFlavor);