java知识
jdk与jre的区别
JDK是面向开发人员使用的SDK。
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者。
== 和 equals 的区别是什么?
1、功能不同
"=="是判断两个变量或实例是不是指向同一个内存空间。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。
2、定义不同
"equals"在JAVA中是一个方法。
"=="在JAVA中只是一个运算符合。
3、运行速度不同
"=="比"equals"运行速度快,因为"=="只是比较引用。
"equals"比"=="运行速度要慢。
两个对象的 hashCode()相同,则 equals()也一定为 true是错的
final在java中有什么作用
final在java中是修饰符关键字,可以修饰变量方法类,修饰的变量是不可更改的,值不可修改,引用不可修改,不能给其赋予新对象
修饰的方法禁止子类继承重写方法,由于内联机制inline,方法执行更快,修饰的类不能被继承
基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
StringBuffer.reverse();
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
final 不能修饰抽象类
接口和抽象类有什么区别?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
io流有输入输出流,字节流字符流,字节流按8位以字节进行传输,字符按16按字符进行传输
BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
lambda表达式
字节流和字符流区别
字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
字节流默认不使用缓冲区;字符流使用缓冲区。
字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
文件内容写入BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(myFile,true));
字符串比较compareTo
字符最后出现的位置lastIndexOf
删除一个字符return s.substring(0, pos) + s.substring(pos + 1);
字符串替换 replace replaceFirst replaceAll
字符串反转String reverse=new StringBuffer(string).reverse().toString();
字符串位置IndexOf
字符串分割 String str="www-ere-rerere-rer";String[] temp;String delimeter="-";temp=str.split(delimeter);已经将各个字符串放进数组
String str1="qq.w.qw.ewe";String[] temp;String delimeter="\\.";temp=str1.split(delimeter);可以for循环也可以for-each
默认的分隔符是:空格、制表符(\t)、换行符(\n)、回车符(\r)。
字符串分割String str="qqwe,qw";StringTokenizer st=new StringTokenizer(str);st.hasMoreElements();st.nextElement();
StringTokenizer st=new StringTokenizer(str,",");//设置分割符
字符串转换为大写toUpperCase();
字符串部分区域是否相等boolean match=first_str.regionMatches(true,11,second_str,12,9);
true表示不区分大小写,从first_str的11位开始,second_str的12位开始,共比较9位;
运行时间 long Time = System.currentTimeMillis();运行两次运行前和后相减即可
intern返回一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
system.out.format字符串格式化
+连接字符串快的很,StringBuffer.append();字符添加很慢
二分查找元素位置binarySearch(array,2);
ArrayList数组的反转Collections.reverse(arrayList);
查找数组最小值 int min = (int) Collections.min(Arrays.asList(numbers));numbers是个数组
数组合并 List list = new ArrayList(Arrays.asList(a));
list.addAll(Arrays.asList(b));
Object[] c = list.toArray();
System.out.println(Arrays.toString(c));
向数组中填充元素Arrays.fill(arrayname,value) 方法和Arrays.fill(arrayname ,starting index ,ending index ,value) ;
desire期望 blank空白 erase擦除,取消,删除 prompt提示 execute执行
scroll上滚,卷 macro宏 reference参考 restore 恢复 pressing压制,紧急的
decimal十进制 arrow剪头,指针 within在。。以内 issue发型出版 dos磁盘操作系统 modify修改
mouse鼠标 bar棒 carriage滑架托架 scope范围显示器 subset子集 enable启动 optional可选的
attribute属性标志 paragraph段落 multi多 positioning定位 toggle触发器,系紧
indicate指示
String比new创建字符串对象起嘛快两倍
÷-String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上
string1.concat(string2);
char charAt(int index)
int result = str1.compareTo( str2 );
int compareToIgnoreCase(String str) 忽略大小写
s = s.concat("www.runoob.com");
boolean contentEquals(StringBuffer sb)
Str2 = Str2.copyValueOf( Str1, 2, 6 );
public boolean equals(Object anObject)
String by="dfsdfsggfhfghf";
byte b[]=by.getBytes();
for(byte bq:b)
System.out.println(bq);
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
hashCode() 方法用于返回字符串的哈希码。
字符串对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。空字符串的哈希值为 0。
它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
应用程序要求线程安全的情况下,则必须使用 StringBuffer 类
在编译的时候,编译器使用 Employee 类中的 mailCheck() 方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是 Salary 类中的 mailCheck() 方法。
类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的父类
java性能优化:
1使用单列,单例模式确保某个类只有一个实例(单列),而且自行实例化并向整个系统提供这个实例。
1.1饿汉式单例--立即加载方式
1.2懒汉式单例(延迟加载方式)--多线程会有多个对象,解决synchronized同步锁,效率低,双重检测
1.3静态内部类
1.4static静态代码块实现
1.5内部枚举类实现,枚举类的构造方法在类加载时被实例化
2不要随意使用静态变量
3避免过多的创建java对象
4尽量使用final修饰符,getter、setter应该使用final
5使用局部变量,局部变量在栈中,静态变量,实例变量在heap中
6基本类型栈中处理,对象堆中处理,使用基本数据类型
7减少synchronize方法
8不要使用finallize
9String str=new String('hello');jvm字符缓存池会缓存这个字符串,对象底层还有一个char数组
10多线程无线程安全问题应使用hashmap,arraylist
11hashmap大小合理估计
12for(int i=0,len=list.size();i<len;i++)
13finally中去释放资源
14用int num=a>>2;代替int num =a/4;
15确定stringbuffer的大小
16尽量早释放无用对象的引用
17二维数组占用的内存是一维数组的10倍
18避免使用split,如用用apach的stringutils.split(string,char);频繁split可以缓存结果
19arraylist与linkedlist的使用
20使用system.arraycopy()进行数组复制
21缓存经常使用的对象
22异常创建开销大,创建一个异常需要收集一个栈跟踪
23出现字符串连接时应该使用StringBuffer代替
24java中的内嵌sql语句尽量用大写形式
25使用方法同步代替代码块同步
26error是虚拟机错误的类
27用clone(必须先实现cloneable类)不会调用构造方法,new的时候函数所有的构造方法都会调用
private static Credit BaseCredit=new Credit();
public static Credit getNewCredit(){
return (Credit)BaseCredit.clone();
}
28不要将数组声明为public static final
29单线程尽量使用hashmap,arraylist
java字符串改变值,创建一个stringbuilder对象初始化为string对象的值,再修改值,再调用tostring
StringTokenizer实现了iterator设计模式,hasmoretokens(),nexttoken()
stringbuffer同步(开销大)stringbuilder不同步
排列组合
lotteryOdds = lotteryOdds * (n - i + 1) / i;
使用大数值
lotteryOdds = lotteryOdds.multipi y(BigInteger.valueOf(n - i + 1)).divi de(Bi glnteger.valueOf(i));
int *a[]=new int[100];[]为边界a不是数组地址第一位置
浙公网安备 33010602011771号