JavaSE基础知识

StringBuild为什么不安全,怎样解决StringBuild的不安全性?

 toStringCache = null;
 count += len;不是做的原子操作、加锁

String的父类?

没有父类,他是继承的接口  implements java.io.Serializable, Comparable<String>, CharSequence

字符串拼接有哪些方式?用哪一种方式效率会更高?

+操作
使用String类中的方法concat方法来拼接字符串
StringBuffer可以方便的对字符串进行拼接
StringBuilder也可以使用
StringUtils类,其中的join方法可以拼接字符串
Java8中的String类中也提供了一个静态的join方法

数组和集合的区别?

1、数组的效率高于集合类. 
2)数组能存放基本数据类型和对象,而集合类中只能放对象。
 3)数组容量固定且无法动态改变,集合类容量动态改变。
 4)数组无法判断其中实际存有多少元素,length只告诉了array的容量。 
5)集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。
 6)集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各

hashtable与hashmap的区别

TashMap:
每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长
是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
内部实现原理:
内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。
HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。
JDK1.8之前
JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
JDK1.8之后
相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

在这里插入图片描述

Hashtable:

同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
是JDK1.0引入的类,是线程安全的,能用于多线程环境中。
同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

区别:

1、继承的父类不同
 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、线程安全性不同
Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的

3、是否提供contains方法
 HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
4、key和value是否允许null值
 	Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。
5、两个遍历方式的内部实现上不同
  Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
6、hash值不同
 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
7、内部实现使用的数组初始化和扩容方式不同
  HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。

list的区别

String [] str= {“nihao”,“is”,“19”,null,“1”};,怎样输出的结果为:Result=”NIHOAIS”;Result=20;

	private static void getStr() {
			String [] str= {"nihao","is","19",null,"1"};
			StringBuilder sb=new StringBuilder();
			Integer sum=0;
			for (int i = 0; i < str.length; i++) {
				if(str[i]==null) {
					continue;
				}
				if(str[i].matches("[0-9]+")) {
					sum+=Integer.parseInt(str[i]);
				}else {
					sb.append(str[i].toUpperCase());
				}
			}
			System.out.println("sum:"+sum);
			System.out.println("sb:"+sb);
		}		

String str=“ni hao”;输出结果为 result=”in oah”;

private static void getConver() {
			String str="ni hao";
			String [] str1=str.split(" ");
			StringBuilder resultSb=new StringBuilder();
			for(int i=0;i<str1.length;i++) {
				resultSb.append(new StringBuilder(str1[i]).reverse()+" ");
			}
			System.out.println(resultSb);
		}

你用到哪些api?

Object类
Data类
DateFormat类
Calendar类
Syetem类
StringBuilder类
包装类

java的基本数据类型,分别的字节数?

byte:1个字节,8位
short:2个字节,16位
int:4个字节,32位
long:8个字节,64位
float:4个字节,32位
double:8个字节,64位
boolean:官方文档未明确定义,依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1位,但是实际中会考虑计算机高效存储因素
char:2个字节,16位

Int与integer的区别?

1、int是基本数据类型。integer是int的包装类。
2、Integer变量必须实例化后才能使用,而int变量不需要 。
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
4、Integer的默认值是null,int的默认值是0。
5、一般接收参数是基本数据类型应该使用包裹类进行接收。

Sleep与wait的区别?

1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
5、sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。

String str=new String(“zxy”);有几个对象?

2个   常量池  内存
先会在常量池中查找,如果没有创建一个。当new会在内存中创建一个新的string对象

常用的设计模式有哪些?举一个例子说明其原理?

单例模式(懒汉式)
是否 Lazy 初始化:是
是否多线程安全:是
实现难度:易
public class Singleton { 
private static Singleton instance;
private Singleton (){} 
public static synchronized Singleton getInstance() { 
if (instance == null) { 
instance = new Singleton(); 
} return instance; 
}
 }

接口的意义:

接口是规范,规定某个实现类里必须有那些方法,只要事先定义好接口,当大家一起合作的时候就不用特别麻烦的交互,而是每个人写好自己的接口实现类,最后拼接到一起就可以了。大中型项目一般都会加入接口和实现类,层次分明。微小项目就看你自己的意思了。
抽象类是什么:
抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。
(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
(2) 抽象类不能被实例化
(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
(4) 具体派生类必须覆盖基类的抽象方法
(5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们
接口是什么:
(1) 接口不能被实例化
(2) 接口只能包含方法声明
(3) 接口的成员包括方法、属性、索引器、事件
(4) 接口中不能包含常量、字段(域)、构造函数、构造函数
接口和抽象类的区别
(1)抽象类可以有构造方法,接口中不能有构造方法。
(2)抽象类中可以有普通成员变量,接口中没有普通成员变量
(3)抽象类中可以包含静态方法,接口中不能包含静态方法
(4) 一个类可以实现多个接口,但只能继承一个抽象类。
(5)接口可以被多重实现,抽象类只能被单一继承
(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
接口和抽象类的相同点
(1) 都可以被继承
(2) 都不能被实例化
(3) 都可以包含方法声明
(4) 派生类必须实现未实现的方法
17、并发问题怎样处理?
1.synchronized关键字和Lock并发锁:主要解决多线程共享数据同步问题。
2.ThreadLocal主要解决多线程中数据因并发产生不一致问题。

在一个方法上事务和锁谁大?没有谁大!!!!

将synchronized锁的范围包含到整个Spring事务上,这就不会出现线程安全的问题了吗?
原因:
事物未提交之前,锁已经释放(事物提交是在整个方法执行完),导致另一个事物读取到了这个事物未提交的数据,出现了脏读。
将锁和事务分离开
解决方案:
1、锁上移,上移到Controller层,包住整个事物单元。
2、新建一个名叫SynchronizedService类,让其去调用service方法

List去重?

方法一:使用java8新特性stream进行List去重 
List newList = list.stream().distinct().collect(Collectors.toList()); 
方法二:通过set解决
没有排序功能:Set set=new HashSet(list);
有排序的:LinkHashSet<String> hashSet=new ListHashSet<String>(list);
list.clear();
List.addAll(hashSet);
return list;

javaSE有哪些io流?

在这里插入图片描述
在这里插入图片描述

发布了78 篇原创文章 · 获赞 6 · 访问量 6712

猜你喜欢

转载自blog.csdn.net/YHM_MM/article/details/105331734