java知识点
一:排序方法
1.Arrays.sort(数组对象x)方法,默认升序。
2.Arrays.sort(数组对象x,Collections.reverserOrder()), 降序排序。
3.使用的包:java.util.Arrays; 和 java.util.Collections;
二:进制转换
1.第一种:任何进制转换10进制。可以直接调用方法:Integer.parseInt(String s,x);//x代表输入的进制,比如s = “0001”,x=2;就表示输入的是二进制,转换成10进制的int类型。同理,还有Long.parseLong()方法。
2.第二种:10进制转换成任何进制。一般使用课表上的除法,如果除数是2的x方的约数,则可以直接使用位运算符合(">>")来快捷运算。如果是特殊进制,比如16,则余数10,11,等这些就要转换成A,B。
3.第三种:不转换成10进制的两种进制互相转换。可以使用中间进制,二进制,不过要注意位数是否够,是否需要添加或者删除。并且要考虑,转换之后第一位不能为0.
三:数据类型的大小
1.整数型的。byte:(128)。short(3w)。int(2亿,2后面9个零,最大到12的阶乘)。long(9百亿亿,9后面18个零,最多到20的阶乘)
2.浮点数的。float:有效就7位,double:有效是16位。小数不多可以拿来用,并且算出来的数不是准确的,比如1.0+2.0!=3.0;
四:整形大数和浮点大数
1.整数型大数:BigInteger。使用方法和int,long 不同,初始化的方式有两种:
1.1初始化方法:
a:BigInteger a1 = new BigInteger(“数字”); b:BIgInteger b1 = BigInteger.valueOf(long s); //不能放小数
1.2运算方法:
加法:a1.add(b1) 减法:a1.subtract(b1)
乘法:a1.multiply(b1)
除法:a1.divide(b1)
1.3赋值:
可以被Scanner直接输入赋值,也可以初始化给一个一个字符串或者整形long。但是不能直接强转型成int,long,string。
可以理解为大数无法转小数,小数可以转大数,因为小数无法承接大数,而大数对小数具有更广的包容性。
2.浮点数大数:BigDecimal。使用方法和BigInteger的方法是一样的。区别就是BigDecimal b1 = BigDecimal.valueOf(double s); 还可以放double数,
虽然也可以放long,但是整数部分不能太大。甚至还可以方法BigInteger。
2.1四舍五入:
可以使用setScale(a,RoundingMode.HALE_UP)//RoundingMode 是枚举类。 等同于BigDecimal.Round_HALE_UP;
2.2除法:
BigDecimal 要注意的就是做运算之后可能会出现: 0做除数,或者无限小数,导致异常,一般是做除法运算出现这种情况。
所以需要四舍五入来保证能成功输出数据,做除法的时候:
a.divide(b,x,RoundingMode.HALF_UP) //x是保留的位数,Rounding。。。是保留的方法。
注意:如果数据非常大,建议使用字符串来承接。
println()不能直接打印大数据,需要用大数数据类型先包装,再打印,否则还是会出现科学计数法的打印结果。
五:字符缓冲和String方法
StringBuilder类
1.特点:高效,快速,适合字符比较多,频繁需要对字符操作。如果只用String操作会占据大量的内存。
2.使用方法,StringBuilder s = new StringBuilder();//会自动拓展空间大小。
3.toString()。可以直接打印出里面所有的内容。
4.方法:
append("0010");//直接在字符组后面添加字符。
delete(0,3);//从0开始,下标为3,都删除。
insert(0,“00”)//从下标0开始往后插入字符“00”.
substring(0,3)//返回0到3下标的字符。
注意下标,substring(a,b) a是下标,b是从1开始的下标。
insert,可以理解从1开始的下标,并且存储到后面的位置
delete,和substring的两个参数是一样的
String方法
1.(String)s. charAt(x)//从字符串下标0开始,到x的位置,返回这个字符。
2.(String)s.spilt(“xxx”);//根据xxx来分割字符串,最后返回一个字符组。
//一般是避免Scanner的频繁使用,一直占据内存,最后导致内存溢出的严重后果。
3.new String(char[] a)//可以把字符组转换成字符串。
六:格式化类DecimalFormat以及SimpleDateFormat类
1.作用: 将数据转换成特点的格式,比如说长度,常用与日历时间的使用上
也可以用来处理输出多少位数。
2.用法:
2.1初始化: DecimalFormat a = new DecimalFormat("0000");//双引号里面要输出相对应的格式,比如转换成4个长度的二进制。
int b = 1; String s = a.format(b);//最后要用string字符串来承接。
(注意这是用来处理数据类型的,而比如2019-4-11 这样的数据类型就不可以、)
3.simpledateformat类就是用来处理 时间类型的数据,拿到date类型数据,但是要转换自己需要的时间,比如转换成2019/01/28这样的模式
就要:3.1 simpledateformat tr = new simpledateformat(“yyyy/MM/dd”)//这里注意Y和y是不同的,D 和d也是不同的,需要注意
3.2 String time = 2019/3/28
3.3 Date rtime = tr.parse(time)
3.4 tr.format(rtime)
七:求平方和次方根的方法
1.公式:
求平方:Math.pow(a,2);//两个参数,求a的平方。
求平方根:Math.sqrt(double n);//求平方根
求次方根:Math.pow(double n,1/3.0);//这里注意,不能是1/3否则会直接是0.
八:java定义的静态数据类型
1.int 的最小值和最大值
Integer.MAX_VALUE 和Integer.MIN_VALUE。
2.PI 和 E 的值
1.Math.PI, 和 Math.E;
2.也可以直接import static java.lang.Math.PI; 而后在程序之中直接使用PI;
九:序列求和公式
递增序列
1.求an值:a1+(n-1)d;
2.求Sn值:n*a1 + nd(n-1)/2;
十:BuffereReader类代替Scanner类的使用方法
同样是作用IO流,BufferedReader 类更高效和快速。如果出现大量赋值对象,则使用BufferedReader 会被Scanner 更好,避免出现内存不够现象。
1.导包:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
2.构造:
BuffereReader a = new BuffereReader(new InputStreamReader(System.in));
3.try{
String s = a.readLine();
}catch(IOException e){
e.printStackTrace();
}
4.关于next() 和nextLine();
如果两个都要用到需要中间再多一个nextLine()来吞掉next()结尾会有一个换行符号,否则会出现异常。
比如
int a = x.nextInt();
x.nextLine();
String s = x.nextLine();
//s才能获取到输入a换行之后的数据。
十一:求log数。
1.求log x
直接就是Math.log(x) 即可,也有log10(x),以10为底数。
2.求longx(y)。
需要随意转换x和y,则需要用到除法公式:logy/logx = longx(y).因为java 无法直接指定底数。
十二:处理特殊值
这里的特殊值是指:比如数组[-1] 或者数组【n] 越界了,但是又可以当作负无穷。
则可以转换为二元组【0,0】 【1,a【i】】。如果是越界就是前者,在数组内的任意值都会大于前者,因为1>0;
十三:取模和取余
取模和取余
1.整数的时候都一样,4/2 = 2..0; 拿0;
2.负数的时候不一样,因为标准参照不同,一个是以负无穷,一个是以正无穷为参照。
取模: -4/3 = -2...2
取余:-4/3 = -1..-1
可以这么理解:取余数,本身就是因为a%b 的时候,a多出来的部分,导致a不能被b整除。
而在负数的时候取余同样可以这样理解,取模的时候就可以理解是少出来的部分,导致不能被整除。
十四:随机数
1.方法Math.random();
可以生产0-1的一个随机数。
2.生成0-n 的随机数 (int) (Maht.random()*n)
注意的是生成的数不包括n,包括0,类似数组的下标。
生成的数是double的,和我们想要的值不一样,所以最后的结果需要强制转换(int)。
十五:比较两个数组是否相同
(比较的是数组的内容而不是地址)
1.需要借助两个方法:Arrays.toString(int[]a ).equals(Arrays.toString(int[]b ));
十六:List
1 1.转换成数组的方式: 2 toArray(); 3 但是直接输出,可以打印list的内容,以数组的方式。
2.获取数据的方式:
用list.get(index)//来获取数据,list存储的是对象,所以比较不能用==,而是用equals(object);
十七:全排列的方式
1.使用step(步骤,也就是数的深度)+ for(元素集合) 来全排列: 伪代码 f(int step,int[] array){ if(Step==2) sout("yes"); else for(元素集合) //元素交换 f(step+1,array)//递归并且往下走一层。 //回溯 }
2.使用hashset可以去重复。
十八:char
可以用Character.toString(char a) 来转换成字符串。
十九:二维数组
1.初始化 对于不止长度,但是知道行数的数组可以 int[][] array = new int[5][] 来处理。 甚至可以用集合,栈,队列,这些来实现。
二十:填充数组和多维数组
1.对于单一数组,可以使用Arrays.fill(int[] a, value ); 来填充。(只对数组有效,list这些不行) 2.对于多维数组,需要用到for 增强型,依次填充。 3.对于两者的输出,前者用Arrays.to String() 可以。 后者需要用到Arrays.deepToString() 来输出。
二十一:日历Calendar类
1.获取时间 1.1注意初始化,不是传统的new,而是 Calendar one = Calendar.getInstance(); 1.2输出时间: one.getTime(); 注意,时间是变化的是实时的,获取的是系统时间。
2.设置时间 one.set(Calendar.YEAE,value)
one.set(Calendar.MONTH,value)
one.set(Calendar.DAY_OF_MONTH,value)
注意:月份是从0开始算的,星期天是1,星期六是7. 3.获得毫秒数。
one.getTimeInMillis()
二十二:HashMap 数组
1.存储类型 双值,key 和value 。都是对象类型。key 是唯一标识,value 可以相同。 变长,并且是无序的,允许重复,但是后面的值会覆盖前面的值。
输出的时候是 {key =value} 模式。
2.初始化和使用
HastMap<String,Integer> a = new HashMap<>();
a.put(key,value);
a.remove(key);
a.get(key); //可以拿到key 的值。
2.1迭代,迭代拿到的key 是按顺序的,那么就可以按顺序输出value的值。
for(Map.Entry<String,Integer> ss : a.entryset()){
ss.getKey();/ss.getValue();
}
二十三:Math.pow(a,b)方法
放回的是一个double类型数据,如果和预期不符,可以不使用这种方法。
二十四:容器Vector
1.添加和删除 Vector a = new Vector(); a.add(Integer ); a.remove(index)
2.查找
a.indexOf(n);//查找第一个n 所在的下标。
b.lastindexOf(n);//查找最后一个n 所在的下标。
二十五:判断奇数
可以使用x&1是否等于1来检验。
同时也可以用来判断是否是偶数
二十六:科学计数法的输入
int a = 1e6; 表示的就是10的六次方。
二十七:递归的层数
递归最大的层数是1w层(如果参数过多,甚至会无法到达预期)java 特性。
二十八:hashset 和hashmap 和 treeset 和散列表
1.哈希表也是散列表:是数组和链表的结合,在查找和删除添加效率较高
2.hashset 的底层是hashmap的key,只有一半。、
3.set实现无序不可重复的原理是根据hashcode 和equals 两个方法。把add()的数据作为key,通过继承的object 的hashcode方法来转换类似下标的存在,不同的值的hashcode可能相同,
这样就能把,1000-9999,比如把1000-1999 分到一组的类似。查找1080 就先找到1000-1999这个下标,再通过链表来查询。
4.所有的类都有hashcode,但是如果类有多个值的时候,把对象存入hashset表中,key是地址,地址是一定不同的,那么一定是不断的重复添加的,所以hashcode的方法不够用,需要被重写。同时equals也需要被重写,重写的代码如下:
@Override
public boolean equals(Object o) {
if(this==o) return true;
if(o instanceof room ){
room room = (room)o;
return room.no.equals(this.no) && room.name.equals(this.name);//这里是根据no 和name 来组合作为key,如果重复就不能被添加,相较于原来是只比较地址。
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(no);//String 类本身有hashcode方法,可以直接调用,也就是按照no来分类。
5.toString方法要被重写,因为自定义的类,tostring方法是没有被重写的,如果hashset使用迭代器迭代的时候next()出来的值就会是对象地址,实际是调用了object的tostring方法。
二十九:comparable 和comparator 两个类
1.包:comparable 是lang 包,comparator 是util 包。
前者是接口,需要基础实现唯一的方法compareTo(),这样的自定义类才能被存入TreeSet集合当中。后者也是接口,里面有两个方法Compare(Object a,Object b),是可以自己编写一个比较器,再TreeSet初始化的时候放进去。
2.两个类编写的方法大致相同,都是返回-1,0,1.底层是二叉树,用二叉树来排序,来达到TreeSet本身能够排序的原因。
三十:File Input Stream 和FileOutputStream 类
1.都是对硬盘操作,一个是读,一个是写操作。 2.使用Read 和Write 方法。具体的可以查jdk-api帮助文档。 3.主要侧重的是byte【】作为参数来充当缓存。将硬盘的数据刷新存储当中。然后操作。 而将String 类型可以用getBytes()方法来转换成byte【】数组。而如果需要存储部分的数据,都可以添加两个参数。这两个参数是对byte【】下标操作。第二个参数是长度。
和substring()方法不同。第二个参数可以比第一个参数小,但是第一个参数还是下标。

浙公网安备 33010602011771号