Sring 类
什么是String类
String类是定义在lang包下的一个类,不是基本数据类型
创建方法:
String str = new String(“abc”);
String str1 = “abc”;
jdk1.8的String类的底层是一个char类型的数组,1.9的string底层是byte数组
自定义类型指向的是堆地址,但是如果常量池内有相同的字符串,就在栈区创建一个他的引用
八种基本类型在栈内,但是指向常量池
双等号判断引用是否相等,equals判断内容是否相等
对字符串处理的类有:
String:不能改变(不是因为String前面加了final关键字,而是因为多数对字符串操作的方法最后都是new String(),处于一个新的堆区,已经是另外一个字符串),一旦创建,不能修改;
final关键字:
加在class(类名)之前:不能被继承
加在method之前:不能被重写
加在变量前:不能被修改
StringBuffer(最安全):synchronized是同步符,访问标有synchronized关键字方法是需要排队的,但是效率会低,但这个线程是安全的
StringBuild(稍微安全):效率比StringBuffer要高一点
StringBuffer和StringBuild有同一个父类:AbstractStringBuilder
String 类的equals()方法是重写了object的equals()方法,如果要比较其他类型对象是否相等就必须在类型中重写object的equals()方法
String一些方法与题目
package test;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
public class Test3 {
//定义了去出字符串右边空格的方法
public static String rtrim(String str) {
int index=0;
str=new StringBuffer(str).reverse().toString();
for (int j = 0; j < str.length(); j++) {
if (str.charAt(j)!=' ') {
break;
}
index++;
}
str=str.substring(index);
str=new StringBuffer(str).reverse().toString();
return str;
}
//定义一个倒转字符串并连接原字符串的方法
public static String concat(String str){
String rts=new StringBuffer(str).reverse().toString();
return str+rts;
}
//定义一个字符串右移的方法
public static String moveToRight(String str,int position){
String left= str.substring(0, str.length()-position);
String right= str.substring(str.length()-position);
return right+left;
}
//定义一个判断最长字符串的方法
public static String longest(String str[]){
String longest="";
for(int i=0;i<str.length;i++){
if(str[i].length()>longest.length()){
longest = str[i];
}
}
return longest;
}
//从一个源字符串中, 找到一个相同的字符串(忽略大小写), 则返回第一个字符的索引位置
public static int first(String str,String strsame){
if(str.toLowerCase().contains(strsame.toLowerCase())){
return str.toLowerCase().indexOf(strsame.toLowerCase());
}else {
return -1;
}
}
//回文
public static void back(String str){
if (str.equals(new StringBuffer(str).reverse().toString())) {
System.out.println("是回文");
}else {
System.out.println("不是回文");
}
}
//
public static void main(String args[]){
//双等号用来判断引用是否相等,equals用来判断真实值是否相等
String str1="abc";
String str2="abc";
String str3=new String("abc");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str1==str3);
System.out.println(str1.equals(str3));
//字符串转换为字符数组
String str4="hello world";
char [] arr=str4.toCharArray();
for (char c : arr) {
System.out.println(c);
}
//字符串的截:取前极限
String sub=str4.substring(4, 7);
String sub1=str4.substring(4);
System.out.println(sub);
System.out.println(sub1);
//字符串以一个关键符分割成数组(两组例子)
String[] split1=str4.split(" ");
System.out.println(split1[0]+":"+split1[1]);
String str5="1,2,3,4,5,6,78,99";
String[] split2=str5.split(",");
for (String string : split2) {
System.out.print(string+" \t");
}
//大小写切换和识别字符串首尾字段
String str6="abcd";
String s1=str6.toUpperCase();
System.out.println(s1+":"+s1.toLowerCase());
String str7="adwwend";
if (str7.startsWith("ad")) {
System.out.println("添加");
}
if (str7.endsWith("end")) {
System.out.println("删除");
}
//字符串转换为字符数组注意中文是存在乱码问题的所以要转换编码,也要捕获异常
String str8= "hello world";
byte [] byt=str8.getBytes();
for (int i = 0; i < byt.length; i++) {
System.out.print(byt[i]+"\t");
}
String str9="你好";
try {
String st=new String(str9.getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}finally{
}
//获取字符串长度,判断是否为空,检查字符串中的特定字符
String str10="abc";
System.out.println(str10.length());
System.out.println(str10.isEmpty());
if ("abc".equals(s1)) {
System.out.println("true");
}
char c =str10.charAt(2);//取索引对应的值
System.out.println(c);
String str11="watermemotlen";
int t=str11.indexOf("r", 4);//可以取到下标极限,如果字符串中没有找到内返回-1
int s=str11.lastIndexOf("t",2);
System.out.println(t+"+"+s);
//1.字符串解析,现有一字符串,"卡巴斯基#杀毒软件#免费版#俄罗斯#",解析出每个元素。
String str12="卡巴斯基#杀毒软件#免费版#俄罗斯#";
String []splot4=str12.split("#");
for (String string : splot4) {
System.out.print(string+"\t");
}
//2."那车水马龙的人世间,那样地来 那样地去,太匆忙"最后一次出现"那"的位置。
String str13="那车水马龙的人世间,那样地来 那样地去,太匆忙";
int n=str13.indexOf("那", 11);
System.out.println(n);
//3.判断输入的字符串是否是 .java 结束
Scanner kb =new Scanner(System.in);
String str14=kb.nextLine();
if (str14.endsWith(".java")) {
System.out.println("over");
}
//4.有一身份证号,判断此为男还是女,基于此方法,写一个算法,判断一个身份证号为男还是女\
String str15=kb.nextLine();
if (1==str15.charAt(17)%2) {
System.out.println("男");
}
//5.有如下格式的字符串name-age-sex-address,解析出姓名,年龄等信息。
String str="张-21-男-火车站";
String[] split= str.split("-");
System.out.println("姓名"+split[0]+" 年龄"+split[1]+" 性别"+split[2]+" 地址"+split[3]);
//6.求出字符串中有多少种字符,以及每个字符的个数,例如有字符串 str="apple is a apple.";
int a=0;
int p=0;
int l=0;
int e=0;
int I=0;
int s11=0;
int index=0;
int dex=0;
String str111="apple is a apple.";
char arr1[]=str111.toCharArray();
for (int i = 0; i < arr1.length; i++) {
if ('a'==arr1[i]) {
a++;
}
if ('p'==arr1[i]) {
p++;
}
if ('l'==arr1[i]) {
l++;
}
if ('e'==arr1[i]) {
e++;
}
if (' '==arr1[i]) {
index++;
}
if ('i'==arr1[i]) {
I++;
}
if ('s'==arr1[i]) {
s11++;
}
if ('.'==arr1[i]) {
dex++;
}
}
System.out.println("a="+a+" p="+p+" l="+l+" e="+e+" Kongge="+index+" I="+I+" s="+s11+" .="+dex);
//7定义一个方法,用来去掉字符串右边的空格
String str16="asd ";
System.out.println(rtrim(str));
//8.定义一个方法,将str所指字符串的正序和反序进行连接,例如 "ok"->"okko" :String concat(String str);
String str17="ok";
System.out.println(concat(str17));
//9.字符串右移n位,例如 "hello world" 右移两位 后ldhello wor,要求写一个方法实现此功能,方法的格式是
//String moveToRight(String str,int position)
//str:需要移动的字符串
//p:右移的位数
String str18="hello world";
System.out.println(moveToRight(str18, 2));
// 10.求5个字符串中最长的那个,把最长的字符串打印出来
String str19 = "afaegte";
String str20 = "sadlkfjoei";
String str21 = "sjfaak";
String str22 = "sadf";
String str23 = "a;fj;a;";
String str1111 [] = {str19,str20,str21,str22,str23};
System.out.println(longest(str1111));
// 11.若可以从一个源字符串中, 找到一个相符的字符串(忽略大小写), 则返回第一个字符的索引位置,否则返回-1。
// int stringAt(String str,String subStr)
String str24 = "asdgafHellosldfld";
String subStr = "hello";
System.out.println(first(str24,subStr));
String subStr2 = "fklashf";
System.out.println(first(str24,subStr2));
// 12.判断一个字符串是否是回文
String str25 = "12321";
back(str25);
String str26 = "dsad";
back(str26);
// 13.如下字符串,01#张三#20*02#李四#30*03#王五#40。。。。。。,解析每个人分数多少。样式如下:
// 01 张三 20
// 02 李四 30
// 03 王五 40。并且计算总分
String str27="01#张三#20*02#李四#30*03#王五#40";
String strrr[]=str27.split("[*]");
for (int j = 0; j < strrr.length; j++) {
strrr[j]=strrr[j].replace("#", " ");
System.out.println(strrr[j]);
}
}
}
具体String内容:String类面试题有道云笔记分享