刷题急用,补一下java基础,只看需要的部分(老王说用go刷题不好,不利于个人身心健康和前途发展┑( ̄Д  ̄)┍)
第一章开发环境没看
只看二三四章:语言基础,面向对象,语言进阶
第二章java语言基础
1.数制和数据类型
1.进制
- 十进制,10叫基数,10^n叫权
-
二进制,
- 十六进制,ABCDEF
(进制转换不看了,,基础课都有)
2.变量和数据类型
- boolean 在数组中占1字节,单独用4字节
- byte--1, short--2, int--4, long--8, float--4, double--8, char--1(float默认double,如果想用单精度folat,要在字面量后面加上f。eg:
float height=1.99f;
) - 栈效率高,仅次于寄存器,先进后出,存储空间较小,jvm将基本类型数据都放在占空间
- 堆效率低,存储数据为止随机分配,存储空间较大,可以放字符串,数组和集合(这些都算大数据)
- 字面量:变量和常量中存放的具体数据
- 变量名和数据的地址对应(使用变量的原因,值传递)
-
引用类型:
- 命名:字母,_ $ ;变量名小写,见名知意,首字母小写,驼峰
- 定义变量:类/类型名 变量名
float x,y;可以一次定义两个 - 初始化 ‘=’,定义的时候可以直接初始化
int a=1;
3.控制台输入
4.变量使用
- math.round 四舍五入,math.pow(16,2)= 16^2
- 变量保存多种数据类型
6. 变量作用域
- 大括号里只有一个可以用的,换句话说,大括号可以用来区分作用域,大括号内的变量在大括号结束时都被回收
-
下图会报错,因为第一个name还没回收
7.包装类 类型名大写
eg:
- Byte.MIN_VALUE 存储了byte类型的最小值,可以类型间转换,定义数组等的类型;
- Integer.parseInt; Byte.parseByte("108")把字符串parse成byte
- Integer.toBinaryString(16) 把十进制转成二进制
8. 二进制补码
- 计算机计算二进制,用二进制的补码来存储,最高位是符号位。
- 正数是本身,负数是最高位(最高位-符号位==1)不变,其他位逐位取反再加一
- 计算机中正数和负数的关系是取反加一(3=0011,-3=1100+1=1101)
- 补码运算封闭
- 负数=模-正数
模=正数+负数
9. 整数类型
- java有四种整数类型,byte,short,int,long
- 默认int
- 字面量的值默认都是int,如果用字面量方式给short或者long赋值,需要加后缀(eg:
long longValur=2200000000l
) -
一个例子
如果b2=124+3 不报错,因为编译过程就直接计算出了124+=127,如果是125,超出计算范围,还是报错
我猜,图里报错原因,5是byte型,3是int,b1+3被转成int
10.浮点类型
- float, double
- 默认double
- 赋值时候如果字面量是float类型,需加上f
- 浮点运算就是实数运算
- 整型运算比浮点运算精度高速度快,尽量用
11.字符类型
- java底层用一个16位整数来表示字符,占2字节,叫unicode编码
- unicode和ASC2码兼容
- 强转:(char)0 显示数字0对应的字符
12.转义符
- “\”
\n 回车
\
13.boolean
boolean isPass=true;
isPass=59>=60;
14.小类型向大类型转换
- java默认整数运算是int运算,上面那个我猜,就是因为这个,计算结果被当成int
- 小类型向大类型转换==隐式类型转换,由jvm自动完成
- byte->short->int->long->float->double
- int/char某些情况下会自动完成转换
- 整数到浮点数可能会精度丢失
16.大类型向小类型转换
- 强转==显式类型转换
- 注意边界值
17.char-->int
char c='A';
int i=c+1;
c=(char)(c+1);
18.args数组从控制台输入数据
run 的时候用run configure 有一栏是参数,输入参数
19&20. scanner扫描控制台输入的数据
- String next(); 接收控制台输入的一个字符串,不接收空格
- 接收空格
- next Double(); 接收一个double
- String.charAt()从字符串中获取指定下标的字符eg: "abc".charAt(0)=a
- 具体步骤
Scanner scanner = new Scanner(System.in);
//type name= new type(), 创建对象
String name = scanner.next().charAt(0);
System.out...
//
21.自增等运算
以加法为例,其他和加法一样
++i
//先加1
i++
//后加1
i+=n
//i=i+n
22.交换连个变量的值
a=1
b=2
//交换ab,第一种方法是加一个中间变量tmp
//第二种方法如下(不需要加第三个变量)
a=a+b
b=a-b
a=a-b
23.错误类型
逻辑错误
语法错误
2-6.(关系运算,逻辑运算,if else 和switch,在code cademy上看过了,笔记
- !
is evaluated first
&&
is evaluated second
||
is evaluated third
System.out.println( !(false) || true && false);
//output:true
- 三目(ternary conditional)
- switch match后需要break来跳出(go不需要)
)
7.循环
- while
- do while
char c='a';
do{
System.out.println(c+":"+(int)c);
c++;
//字符变量可以做++运算
}while(c<='z');
- for
循环流程,跟c一样,每个分号部分都可以有多个短句
8.数组
type arrayName[];
type[] arrayName;
arrayName.length
int score[]={33,67,45,98,12};
/*声明数组方式:
* 为数组分配内存空间:new,也叫实例化
* 在heap中开辟【下标】一定数量空间,for循环,动态初始化,声明时赋值,静态初始化
* 静态初始化:int score[]={2,3,4,5,5}
*/
int arrayDemo[] = new int[3];
//int[] Score;第二种声明方法
//arrayDemo =new int[3];
for(int i=0;i< arrayDemo.length;i++){
arrayDemo[i]=i+1; //name.length表示数组长度
}
for(int i=0;i<3;i++){
System.out.println(arrayDemo[i]);
}
mark一个知识点:super & this
9. string
String str="xiaolukeai";
- 字符串长度:str.length()
- 转换数组:str.toCharArray
- 取出指定位置字符:str.charAt()
- 转换byte:byte bytes[]=str.getByres();
System.out.println(new String(bytes)+"\t"); - 检查是否有某字符:str.indexOf("@")返回该字符当前位置
- 去掉空格:str.trim()
- 取出子字符串:str.substring(3)向后取
- stringBuilder是stringBuffer的一个简易替换,在字符串缓冲区被单个线程使用的时候有限考虑该类,append和insert方法都跟buffer那个一样
10.object
- 构造方法:方法名和类名一样,没有返回值,不调用但会在一开始被执行
- 只允许单继承,�一个儿子只有一个亲生父亲,但可以多层继承
- 子类不能直接访问父类的私有属性,可以通过set和get方法
- 一个接口可以继承多个接口
- 方法在类里面,void不需要返回值
- string类型不可改变(通过调用方法,方法里写改变string值,这样是不能实现的),所以用建立类,通过改变类属性来改变string,或者直接str="newValue";
- static:
//static声明全局属性
//static声明方法直接通过类名调用
//静态方法不能调用非静态方法和属性的 - this:谁调用我,我指的就是谁
//1、类中的属性和调用方法(当前调用的本类的)
//2、调用无参数构造方法,要放在第一句 - super:谁调用我,我指的是谁的爸爸
(unmark) -
generic代表多个类,解决数据类型的安全问题
有一些用法写了demo,后来ide卡了,简单记在下面
- 直接用泛型,方便接收各种类型的参数
- 通过泛型在构造方法里给类设置属性
- 多个泛型
- 通配符,什么类型都可以指定, student这么用,(class student
{}) - 泛型接口,interface interfaceName
{}(接口不太会用到,先不看),接口里的方法可以重写,接口要靠他的子类来实现 - 泛型方法,可以定义泛型参数,参数类型就是传入数据类型,写法:方法名称前加泛型标识
//泛型接口
interface GenInter{
}
//第一种
class Gen implements GenInter{
private String info;
get()
set()
}
//main函数中实例化一个实例
Gen g = new Gen("keai");
g.getInfo()
//第二种
class Gen implements GenInter{
}
//main函数中实例化一个实例
Gen g = new Gen("keai");
g.getInfo()
//泛型方法T是泛型标识,后面的T是返回值类型
class className{
public T tell(T t){
return t
}
}
className g = new ClassName;
String str = g.tell("keai");
int i = g.tell(7);
//泛型数组
String arr[] = {"a","b"};
tell(arr);
public static void tell( T arr[]){
//forloop不写了
for{print(arr[i])}
}
11. collection集合类详解
1. 概述
- collection接口
- List
- Set
//2,3 都是1 collection的子接口 - Iterator
- Map和collection是同一级别的
2. collection (java.util)
- 是一个接口
- 动态数组对象,可以任意扩充
- 性能高
- 易扩展和修改
- 子类有list、set、queue
3. list 存放任意数据,
- list接口中的内容可重复
- 常用子接口:ArrayList,Vector
- ArrayList和Vector的一些方法:
1). 判断集合是不是空 isempty()
2). 指定index是否存在 indexOf()
3). 获得list长度size()
List lists = null;
lists = new ArrayList();
lists.add("A")
- ArrayList,Vector区别:ArrayList性能高,非线程安全;Vector性能低,线程安全
4. Set 接口
- 内容不可重复
- 可排序
- 常用子接口:HashSet(散列),TreeSet(可排序)
Set s = null;
s = new HashSet();
s.add("A");
//可以多add一些,这样add的内容如果输出可以看到会乱序排列,如果改成TreeSet是有序
5. Iterator 接口
- 集合输出的标准做法是用iterator输出
- iterator是专门的迭代输出,有内容,就输出
- 方法:hasNext, next, remove
List lists = null;
lists = New ArrayList();
lists.add("A")
lists.add("B")
lists.add("C")
//用iterator输出
Iterator iter = lists.iterator();
while(iter.hasNext()){
//这里不能remove
System.out.println(iter.next());
}
6.map 接口
- 保存形式:key-value
- 常用子类:HashMap, Hashtable,都是无序存放,key不能重复
- 声明的时候
Mapm = new HashMap (); - map赋值:
m.put("key","value");
- 判断key是否存在(刷题常用)
if (map.containsKey("key1")){
}
//值也可以判断
map.containsValue("value")
- 得到全部的键值:
//map.keySet()返回一个key的set集合
Set s = map.keySet();
Iterator i = s.iterator();
//while loop 输出,得到所有的key但是顺序是乱的
//——————————
//map.values();返回一个value的collection集合
Collection c = m.value();
Iterator i = s.iterator();
//while loop 输出,得到所有的key但是顺序是乱的
一个补充:ArrayList和LinkedList的区别
- ArrayList实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
- ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
- 当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
两个补充(在《java核心技术》看到的关于java的简介)
- 在网页中运行的java程序叫applet
- java以前叫oak
- JDK--java development kit--写java的程序猿使用的软件
JRE--java runtime environment--运行java的用户使用的软件
SE--standard edition--用于桌面,简单
EE--enterprise edition--用于复杂的服务器应用的java平台
ME--Micro Edition--手机等小型设备的java平台 - javac程序是一个java编译器,把name.java 编译成name.class 发送到java虚拟机(jvm),虚拟机执行编译器放在class中的字节码
- 如果有 bad command of file name /javac:command not found这种报错,要看一下是不是安装出错,尤其是执行路径的设置
- 如果错误信息太多,可以 javac myProg.java 2>errors.txt把错误信息都写入txt文件中查阅
三个补充,之前看java的时候记得一点东西
java的类
一个类可以包含以下类型变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
源文件声明规则
当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
- 一个源文件中只能有一个public类,可以有多个非public类
- 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
- 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
- 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
- import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。
----**---
最近又有swing的需求,来补课
(首先,java有多套GUI工具包的原因是,没有一个可以满足所有要求的GUI工具包)
12.swing
- Swing 在AWT组件基础上构建的,使用了AWT的时间模型和支持类,比如Color, images, graphics
- 方便移植
- 基于MVC
- 选择Swing: 最灵活最强大,GUI首选
- 不适合使用Swing的时候: 在SWT基础上继续开发不适合,因为两者不兼容,SWT会用来开发Eclipse插件
- java.swing.Jcomponent往上都是继承自awt的
- 窗体本身,Jframe,点击控件,继承自awt.window
- Jcomponent,Jfram,Jwindow,Jdialog是swing的顶级类,以J开头的不是控件就是窗体,以model结尾的,都是控件的模型,体现了MVC结构,,,where
- Swing的MVC结构,model(存数据) view(视图) control(功能)
--内容都比较简单,适合直接上手做